The WebSocket session [0] has been closed and no method (apart from close()) may be called on a closed session
这个问题是由于客户端断开连接了,但是强制给客户端发送消息了,判断session队列中如果有客户端,才能发送消息
所以解决方法就额是增加判断当前连接数是否大于0,如果是表示还在建立连接,此时发送消息
if (WebSocketMessageUtil.SESSION_MAP.size() > 0) {
WebSocketMessageUtil.sendMessageToAll(300, jsonStr);
}
package com.wg.util;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.wg.model.WebSocketMessage;
import lombok.extern.slf4j.Slf4j;
import javax.websocket.Session;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
/**
*
* @author lst
* @date 2022/12/15 11:12
* @param null
* @return null
*/
public class WebSocketMessageUtil {
/**
* 客户端的连接会话
*/
public static final ConcurrentHashMap<String, Session> SESSION_MAP = new ConcurrentHashMap<>();
/**
* @param session 客户端
* @param message 消息
* 向指定客户端推送消息
*/
public static void sendMessage(Session session, String message) {
if (ObjectUtil.isNotNull(session)) {
try {
synchronized (session) {
session.getBasicRemote().sendText(message);
}
} catch (IOException e) {
log.info("向指定客户端推送消息异常");
log.error(e.getMessage());
}
}
}
public static void close(Session session) {
log.info("连接关闭,sid=" + session.getId());
for (String key : SESSION_MAP.keySet()) {
if (SESSION_MAP.get(key).getId().equals(session.getId())) {
SESSION_MAP.remove(key);
}
}
}
/**
* 发送到所有用户
*/
public static void sendMessageToAll(Integer code, String message) {
for (Session session : SESSION_MAP.values()) {
sendWebSocketMessage(session, code, message);
}
}
/**
* @param session 客户端
* @param webSocketMessage 消息
* 向指定客户端推送WebSocketMessage消息
*/
public static void sendWebSocketMessage(Session session, WebSocketMessage webSocketMessage) {
String message = JSONUtil.toJsonStr(webSocketMessage);
sendMessage(session, message);
}
/**
* 从后端往前端发数据
*
* @param session
* @param code
* @param message
*/
public static void sendWebSocketMessage(Session session, Integer code, String message) {
WebSocketMessage webSocketMessage = new WebSocketMessage();
webSocketMessage.setCode(code);
webSocketMessage.setMsg(message);
sendWebSocketMessage(session, webSocketMessage);
}
}