WebSocket错误:java.lang.IllegalStateException: The WebSocket session [1] has been closed and no method (apart from close()) may be called on a closed session


 主要原因:在建立连接存储对象信息的时候保存了用户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连接关闭】");
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM