代码块

    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协议

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐