<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      SpringBoot整合WebSocket教程

      Websocket

      概述

      WebSocket 是基于 TCP 的一種新的網絡協議。它實現了瀏覽器與服務器全雙工通信——瀏覽器和服務器只需要完成一次握手,兩者之間就可以創建持久性的連接, 并進行雙向數據傳輸。

      HTTP協議和WebSocket協議對比:

      • HTTP是短連接
      • WebSocket是長連接
      • HTTP通信是單向的,基于請求響應模式
      • WebSocket支持雙向通信
      • HTTP和WebSocket底層都是TCP連接

      image-20240806193940175

      思考:既然WebSocket支持雙向通信,功能看似比HTTP強大,那么我們是不是可以基于WebSocket開發所有的業務功能?

      WebSocket缺點:

      服務器長期維護長連接需要一定的成本

      各個瀏覽器支持程度不一

      WebSocket 是長連接,受網絡限制比較大,需要處理好重連

      結論:WebSocket并不能完全取代HTTP,它只適合在特定的場景下使用

      使用場景

      1). 視頻彈幕

      2). 網頁聊天

      3). 體育實況更新

      入門案例

      (1)需求說明

      實現瀏覽器與服務器全雙工通信。瀏覽器既可以向服務器發送消息,服務器也可主動向瀏覽器推送消息。

      image-20240806193645308

      (2)流程如下

      image-20240806193659275

      • 需要準備客戶端,可以在瀏覽器上編寫客戶端
      • 服務端,使用java代碼實現,啟動一個服務
      • 客戶端與服務端連接成功以后
        • 客戶端可以發送數據到服務器端
        • 服務器端也可以發送數據到客戶端(瀏覽器)

      (3)功能實現

      客戶端

      定義websocket.html頁面充當客戶端

      <!DOCTYPE HTML>
      <html>
      <head>
          <meta charset="UTF-8">
          <title>WebSocket Demo</title>
      </head>
      <body>
          <input id="text" type="text" />
          <button onclick="send()">發送消息</button>
          <button onclick="closeWebSocket()">關閉連接</button>
          <div id="message">
          </div>
      </body>
      <script type="text/javascript">
          var websocket = null;
          var clientId = Math.random().toString(36).substr(2);
      
          //判斷當前瀏覽器是否支持WebSocket
          if('WebSocket' in window){
              //連接WebSocket節點
              websocket = new WebSocket("ws://localhost:8080/ws/"+clientId);
          }
          else{
              alert('Not support websocket')
          }
      
          //連接發生錯誤的回調方法
          websocket.onerror = function(){
              setMessageInnerHTML("error");
          };
      
          //連接成功建立的回調方法
          websocket.onopen = function(){
              setMessageInnerHTML("連接成功");
          }
      
          //接收到消息的回調方法
          websocket.onmessage = function(event){
              setMessageInnerHTML(event.data);
          }
      
          //連接關閉的回調方法
          websocket.onclose = function(){
              setMessageInnerHTML("close");
          }
      
          //監聽窗口關閉事件,當窗口關閉時,主動去關閉websocket連接,防止連接還沒斷開就關閉窗口,server端會拋異常。
          window.onbeforeunload = function(){
              websocket.close();
          }
      
          //將消息顯示在網頁上
          function setMessageInnerHTML(innerHTML){
              document.getElementById('message').innerHTML += innerHTML + '<br/>';
          }
      
          //發送消息
          function send(){
              var message = document.getElementById('text').value;
              websocket.send(message);
          }
              
              //關閉連接
          function closeWebSocket() {
              websocket.close();
          }
      </script>
      </html>
      

      服務端

      然后導入依賴

      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-websocket</artifactId>
      </dependency>
      

      定義WebSocket服務端組件

      @Slf4j
      @Component
      @ServerEndpoint("/ws/{sid}")
      public class WebSocketServer {
      
          private static Map<String,Session> sessionMap = new HashMap<>();
      
          /**
           * 連接建立時觸發
           * @param session
           * @param sid
           */
          @OnOpen
          public void onOpen(Session session , @PathParam("sid") String sid){
              log.info("有客戶端連接到了服務器 , {}", sid);
              sessionMap.put(sid, session);
          }
      
          /**
           * 服務端接收到消息時觸發
           * @param session
           * @param message
           * @param sid
           */
          @OnMessage
          public void onMessage(Session session , String message, @PathParam("sid") String sid){
              log.info("接收到了客戶端 {} 發來的消息 : {}", sid ,message);
          }
      
          /**
           * 連接關閉時觸發
           * @param session
           * @param sid
           */
          @OnClose
          public void onClose(Session session , @PathParam("sid") String sid){
              System.out.println("連接斷開:" + sid);
              sessionMap.remove(sid);
          }
      
          /**
           * 通信發生錯誤時觸發
           * @param session
           * @param sid
           * @param throwable
           */
          @OnError
          public void onError(Session session , @PathParam("sid") String sid , Throwable throwable){
              System.out.println("出現錯誤:" + sid);
              throwable.printStackTrace();
          }
      
          /**
           * 廣播消息
           * @param message
           * @throws IOException
           */
          public void sendMessageToAll(String message) throws IOException {
              Collection<Session> sessions = sessionMap.values();
              if(!CollectionUtils.isEmpty(sessions)){
                  for (Session session : sessions) {
                      //服務器向客戶端發送消息
                      session.getBasicRemote().sendText(message);
                  }
              }
          }
      }
      

      定義配置類,注冊WebSocket的服務端組件

      @Configuration
      public class WebSocketConfig {
      
          /**
           * 注冊基于@ServerEndpoint聲明的Websocket Endpoint
           * @return
           */
          @Bean
          public ServerEndpointExporter serverEndpointExporter(){
              return new ServerEndpointExporter();
          }
      
      }
      

      定義定時任務類,定時向客戶端推送數據

      @Component
      public class MessageTask {
      
          @Autowired
          private WebSocketServer webSocketServer;
      
          @Scheduled(cron = "0/5 * * * * ?")
          public void sendMessageToAllClient() throws IOException {
              webSocketServer.sendMessageToAll("Hello Client , Current Server Time : " + LocalDateTime.now());
          }
      }
      

      測試

      啟動后端服務,打開瀏覽器即可成功,在瀏覽器中可以看到服務器端推送的數據,瀏覽器也可以發送數據到服務器端

      客戶端的效果:

      image-20240806194002370

      服務端接收到的數據,在控制臺打印

      image

      posted @ 2025-02-24 16:42  kk小新  閱讀(3430)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 毛片免费观看视频| 日韩人妻无码精品久久| 亚洲精品无码日韩国产不卡av| 欧美成本人视频免费播放| 国产地址二永久伊甸园| 国产明星精品无码AV换脸| 国产一区二区三区小说| 波多野结衣视频一区二区| 伊人久久大香线蕉AV网禁呦| 蜜桃av亚洲精品一区二区| 国产精品人一区二区三区| 我国产码在线观看av哈哈哈网站| 日韩精品国产二区三区| 日韩黄色av一区二区三区| 少妇爽到爆视频网站免费| 亚洲第一香蕉视频啪啪爽| 亚洲中文字幕无码一久久区| 亚洲成亚洲成网| 阳谷县| 日韩一区二区三区精品区| 亚洲国产午夜福利精品| 成 人色 网 站 欧美大片| 中文字幕久久人妻熟人妻| 四虎在线成人免费观看| 日韩一区二区三区不卡片| 亚洲精品熟女一区二区| 2021国产精品视频网站| 亚洲国产中文在线有精品| 成在线人视频免费视频| 亚洲夂夂婷婷色拍ww47| 色欲国产精品一区成人精品| 国产中文字幕在线一区| 国产亚欧女人天堂AV在线| 日本一道一区二区视频| 国产中文三级全黄| 精品久久久中文字幕人妻| 人妻熟妇乱又伦精品无码专区| 亚洲欧美成人aⅴ在线| 国产在线线精品宅男网址| 精品无码日韩国产不卡av| 日本一区二区三区东京热|