痞子374 2024-04-27 15:06 采纳率: 94.6%
浏览 43
已结题

Websocket中调用onOpen参数如何传参

Java开发中,想要通过Websocket主动推送信息,但是在业务代码中需要先调用onOpen方法开启websocket,onOpen方法中session、userId参数应该如何传递

  • 写回答

4条回答 默认 最新

  • 关注

    下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    首先,我们需要明确WebSocket的onOpen方法是在客户端连接服务器时被调用的,因此无法在业务代码中主动调用。当WebSocket连接成功后,服务器会自动触发onOpen方法,此时我们可以在方法中获取到Session实例。

    Session实例是WebSocket通信中的一个重要概念,每个客户端连接都会对应一个Session实例,通过该实例可以实现双向通信。我们可以在onOpen方法中将Session保存到一个全局Map中,用于后续的推送操作。

    关于如何传递userId参数,我们可以在客户端连接WebSocket时,将用户id作为URL参数传递给服务器。例如:

    ws://localhost:8080/ws?userId=123456
    

    在服务器端的onOpen方法中,可以通过如下代码获取用户id:

    @OnOpen  
    public void onOpen(Session session, @PathParam("userId") String userId) {
        //保存session和userId到全局Map中
    }
    

    这样就可以实现WebSocket通信中的双向通信,并且根据业务需求,实现主动推送信息功能了。下面是相关配置的代码:

    @ServerEndpoint("/ws/{userId}")
    public class WebSocketServer {
    
        private static Map<String, Session> sessionMap = new ConcurrentHashMap<>();
    
        @OnOpen
        public void onOpen(Session session, @PathParam("userId") String userId) {
            sessionMap.put(userId, session);
        }
    
        @OnClose
        public void onClose(Session session, @PathParam("userId") String userId) {
            sessionMap.remove(userId);
        }
    
        /**
         * 主动推送消息
         */
        public static void sendMessage(String userId, String message) {
            Session session = sessionMap.get(userId);
            if (session != null && session.isOpen()) {
                session.getAsyncRemote().sendText(message);
            }
        }
    }
    

    在业务代码中,就可以调用WebSocketServer的sendMessage方法主动向客户端推送消息了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 5月6日
  • 已采纳回答 4月28日
  • 创建了问题 4月27日

悬赏问题

  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错
  • ¥15 拓扑学,凸集,紧集。。
  • ¥15 如何扩大AIS数据容量
  • ¥15 单纯型python实现编译报错
  • ¥15 c++2013读写oracle
  • ¥15 c++ gmssl sm2验签demo
  • ¥15 关于模的完全剩余系(关键词-数学方法)
  • ¥15 有没有人懂这个博图程序怎么写,还要跟SFB连接,真的不会,求帮助
  • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因