<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                點對點通信就像是私聊。websocket 實現點對點通信可以采用三種方式來實現。 <br/> 下面分別用三種方法來實現 zhangsan 與 lisi 的私聊。 [TOC] # 1. convertAndSend方法實現 步驟如下: **1. 調用方法convertAndSend** ```java @RestController public class TestController { @Autowired private SimpMessagingTemplate messagingTemplate; @MessageMapping("/v5/point") public void pointChat01(Map<String, Object> params) { //關鍵點就是訂閱地址需要是動態的 messagingTemplate.convertAndSend("/topic/v5/chat/" + params.get("to"), params.get("message")); } } ``` **2. 前端代碼** ```js //訂閱地址是:/topic/v5/chat/lisi,下面發送時傳入了 'to':'lisi' 到后端組成了該地址 client.subscribe('/topic/v5/chat/lisi', (res) => {}) client.send('/app/v5/point', {}, JSON.stringify({'to':'lisi', 'message':'你好,李四.'})) ``` <br/> # 2. @SendToUser實現 步驟如下: **1. 配置類中設置setUserDestinationPrefix** ```java @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/endpoint-websocket") .setAllowedOrigins("*") .withSockJS(); } @Override public void configureMessageBroker(MessageBrokerRegistry registry) { registry.enableSimpleBroker("/topic"); registry.setApplicationDestinationPrefixes("/app"); //點對點通信時客戶端需要添加的前綴,不設置默認為/user registry.setUserDestinationPrefix("/users/"); } } ``` **2. 方法上標注注解`@SendToUser`** ```java @RestController public class TestController { @Autowired private SimpMessagingTemplate messagingTemplate; /** * 缺點就是訂閱地址是死的,zhangsan發送消息給lisi,則必須有一個@SendToUser("/topic/v6/lisi")方法 * 反過來又必須有一個 @SendToUser("/topic/v6/zhangsan") 的方法。 */ @MessageMapping("/v6/point") @SendToUser("/topic/v6/lisi") public String pointChat02(String message) { return message; } } ``` **3. 前端代碼** ```js //添加了前綴 /users client.subscribe('/users/topic/v6/lisi', (res) => {}) client.send('/app/v6/point', {}, '你好,李四.') ``` <br/> # 3. convertAndSendToUser方法實現 步驟如下: **1. 配置類中設置setUserDestinationPrefix** ```java @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/endpoint-websocket") .setAllowedOrigins("*") .withSockJS(); } @Override public void configureMessageBroker(MessageBrokerRegistry registry) { registry.enableSimpleBroker("/topic"); registry.setApplicationDestinationPrefixes("/app"); //點對點通信時客戶端需要添加的前綴,不設置默認為/user registry.setUserDestinationPrefix("/users/"); } } ``` **2. 存儲用戶連接的sessionId** ```java @Component public class ConnectListener implements ApplicationListener<SessionConnectEvent> { @Override public void onApplicationEvent(SessionConnectEvent event) { StompHeaderAccessor header = StompHeaderAccessor.wrap(event.getMessage()); //下面將通過前端傳遞一個key為userId的請求頭 String userId = header.getFirstNativeHeader("userId"); String sessionId = header.getSessionId(); //UserConstants.usersMap是我自己創建的一個public static Map對象,用來存儲每個用戶的sessionId UserConstants.usersMap.put(userId, sessionId); } } ``` **3. 調用方法convertAndSendToUser** ```java @RestController public class TestController { @Autowired private SimpMessagingTemplate messagingTemplate; /** * 方法 convertAndSendToUser(String user, String destination, Object payload, @Nullable Map<String, Object> headers) * user:用戶的sessionId * destination:訂閱地址 * payload:訂閱的數據 * headers:請求頭 */ @MessageMapping("/v7/point") public void pointChat03(Map<String, Object> params) { String sessionId = UserConstants.usersMap.get((String) params.get("userId")); SimpMessageHeaderAccessor header = SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE); //把sessionId放到請求頭中 header.setSessionId(sessionId); header.setLeaveMutable(true); //必須以配置類中的 registry.enableSimpleBroker("/topic") 注冊的 /topic 為前綴 messagingTemplate.convertAndSendToUser(sessionId, "/topic/message", "你好,李四!", header.getMessageHeaders()); } } ``` **4. 前端代碼** ```js //前端連接的時候傳入key為userId的請求頭 client.connect({'userId': 'lisi'}, () => { //訂閱地址添加 /users 為前綴 client.subscribe('/users/topic/message', (res) => {}) }) //這里我也傳了 userId 去與后端匹配 client.send('/app/v7/point', {}, JSON.stringify({'userId': 'lisi', 'message': '你好,李四.'})) ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看