imports lombok.extern.slf4j. Slf4j ;import org.springframework.stereotype. Component ;
import javax.websocket.* ;import javax.websocket.server. PathParam ;import javax.websocket.server. ServerEndpoint ;import java.io.IOException ;import java.util.LinkedList ;import java.util.List ;import java.util.concurrent.CopyOnWriteArraySet ;
@ slf4j@Component@ServerEndpoint ( "/websocket/{sid}" )public class WebSocketServer {
// used to record the current number of open connections.private static int onlineCount = 0 ;
/*** concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。*/public static CopyOnWriteArraySet < WebSocketServer > webSocketSet = new CopyOnWriteArraySet < WebSocketServer >() ;//与某个客户端的连接会话,需要通过它来给客户端发送数据private Session session ;//接收sidprivate String sid = "" ;
/*** * 连接建立成功调用的方法*/@OnOpenpublic void onOpen ( Session session , @PathParam ( "sid" ) String sid ) {this . session = session ;webSocketSet . add ( this ) ; //加入set中addOnlineCount () ; //在线数加1log .info ( "有新窗口开始监听:" + sid + ",当前在线人数为" + getOnlineCount ()) ;this . sid = sid ;}
/*** * 连接关闭调用的方法**/@OnClosepublic void onClose () {webSocketSet .remove ( this ) ; //从set中删除subOnlineCount () ; //在线数减1log .info ( "有一连接关闭!当前在线人数为" + getOnlineCount ()) ;}
/*** * 收到客户端消息后调用的方法* ** * @param message 客户端发送过来的消息*/@OnMessagepublic void onMessage ( String message , Session session ) {log .info ( "收到来自窗口" + sid + "的信息:" + message ) ;//单用户sidtry {WebSocketServer. sendInfo ( message , sid ) ;} catch ( IOException e ) {e.printStackTrace () ;}// 群发消息// for (WebSocketServer item : webSocketSet) {// try {// item.sendMessage(message);// } catch (IOException e) {// e.printStackTrace();// }// }}
/*** ** * @param session* * @param error**/@OnErrorpublic void onError ( Session session , Throwable error ) {log .error ( "发生错误" ) ;error.printStackTrace () ;}
/*** * 实现服务器主动推送**/public void sendMessage ( String message ) throws IOException {if ( message != null ){this . session .getBasicRemote () .sendText ( message ) ;} else {log .info ( "服务器推送消息为null" ) ;}}
/*** * 群发自定义消息* * 这里可以设定只推送给这个sid的,为null则全部推送*/public static void sendInfo ( String message , @PathParam ( "sid" ) String sid ) throws IOException {System. out .println ( "------WebSocketServer----------sendInfo-----" ) ;log .info ( "推送消息到窗口" + sid + ",推送内容:" + message ) ;for ( WebSocketServer item : webSocketSet) {try {//sid为null则全部推送if ( sid == null ) {item.sendMessage ( message ) ;} else if ( item. sid .equals ( sid )) {item.sendMessage ( message ) ;}} catch ( IOException e ) {continue;}}
}
public static synchronized int getOnlineCount () {return onlineCount ;}
public static synchronized void addOnlineCount () {WebSocketServer. onlineCount ++ ;}
public static synchronized void subOnlineCount () {WebSocketServer. onlineCount -- ;}
}
websocket real-time push messaging
Guess you like
Origin www.cnblogs.com/21-Gram/p/11226824.html
Ranking