websocket real-time push messaging

 
 
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 ;
//接收sid
private String sid = "" ;

/**
*     * 连接建立成功调用的方法
*/
@OnOpen
public void onOpen ( Session session , @PathParam ( "sid" ) String sid ) {
this . session = session ;
webSocketSet . add ( this ) ; //加入set中
addOnlineCount () ; //在线数加1
log .info ( "有新窗口开始监听:" + sid + ",当前在线人数为" + getOnlineCount ()) ;
this . sid = sid ;
}

/**
*     * 连接关闭调用的方法
*    
*/
@OnClose
public void onClose () {
webSocketSet .remove ( this ) ; //从set中删除
subOnlineCount () ; //在线数减1
log .info ( "有一连接关闭!当前在线人数为" + getOnlineCount ()) ;
}

/**
*     * 收到客户端消息后调用的方法
*     *
*     * @param message 客户端发送过来的消息
*/
@OnMessage
public void onMessage ( String message , Session session ) {
log .info ( "收到来自窗口" + sid + "的信息:" + message ) ;
//单用户sid
try {
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
*    
*/
@OnError
public 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 -- ;
}


}

Guess you like

Origin www.cnblogs.com/21-Gram/p/11226824.html