使用websocket小问题The remote endpoint was in state [TEXT_PARTIAL_WRITING] which is an invalid state for
websocket 使用问题
·
代码块
public static void sendMessage(WebSocketSession session, Result result) {
if (session != null && session.isOpen()) {
try {
TextMessage textMessage = new TextMessage(JSONUtil.obj2json(result));
session.sendMessage(textMessage);
} catch (Exception e) {
log.error("sendUserMessage failed sessionid:{} {}", session.getId(), e.getMessage());
}
}
}
其实原因就是: handlerA和handlerB两个方法有可能同时执行,当A或者B方法遍历到某一个session并且调用sendMessage发送消息的时候,另外一个方法也正好也在使用相同的session发送另外一个消息(同一个session消息发送冲突了,也就是说同一个时刻,多个线程向一个socket写数据冲突了),就会报上面的异常。
解决方法其实很简单,就是在发送消息的时候加上一把锁,(保证一个session在某个时刻不会被调用多次):
public static void sendMessage(WebSocketSession session, Result result) {
if (session != null && session.isOpen()) {
try {
TextMessage textMessage = new TextMessage(JSONUtil.obj2json(result));
session.sendMessage(textMessage);
//不同handler使用同一个session发送消息冲突了,也就是说同一个时刻,多个线程向一个socket写数据冲突了
synchronized (session){
session.sendMessage(textMessage);
}
} catch (Exception e) {
log.error("sendUserMessage failed sessionid:{} {}", session.getId(), e.getMessage());
log.error("sendMessage failed sessionid:{} {}", session.getId(), e.getMessage());
}
}
}
如果服务器是配置了https的话, websocket需要用wss协议
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)