主要原因:在建立連接存儲對象信息的時候保存了用戶ID,在斷開連接時移除當前對象失敗。
private static CopyOnWriteArraySet<AcceptWebSocket> webSocketSet = new CopyOnWriteArraySet<>();
@OnOpen
public void onOpen(@PathParam("userid") Integer id, Session session) {
this.session = session;
this.userid = id;
webSocketSet.put(userid, this);//用戶id 和session綁定
logger.info("【新的socket連接】");
}
修改:通過判斷所有登錄的用戶是否屬於當前用戶組,實現單發或者群發。
/**
* 打開連接時
*
* @param session
*/
@OnOpen
public void onOpen(@PathParam("userid") Integer userid, Session session) {
this.session = session;
this.work = userService.selectUserId(userid);
webSocketSet.add(this);
logger.info("【新的socket連接】");
}
/**
* 向所有連接客戶端推送消息
*/
public void sendWebSocketMessage(String message) {
try {
if (webSocketSet.size() != 0) {
for (AcceptWebSocket p : webSocketSet) {
if (p != null && p.work == 3) {
p.session.getBasicRemote().sendText(message);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 關閉連接時
*/
@OnClose
public void onClose() {
webSocketSet.remove(this);
logger.info("【socket連接關閉】");
}