亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Tomcat 實現(xiàn)WebSocket詳細介紹

 更新時間:2016年12月01日 15:00:18   作者:汪洋之舟---seaboat  
這篇文章主要介紹了Tomcat 如何實現(xiàn)WebSocket的相關(guān)資料,對WebSocket協(xié)議通信的過程進行了詳細介紹,需要的朋友可以參考下

Tomcat 如何實現(xiàn)WebSocket

WebSocket協(xié)議屬于HTML5標(biāo)準(zhǔn),越來越多瀏覽器已經(jīng)原生支持WebSocket,它能讓客戶端和服務(wù)端實現(xiàn)雙向通信。在客戶端和服務(wù)器端建立一條WebSocket連接后,服務(wù)器端消息可直接發(fā)送到客戶端,從而打破傳統(tǒng)的請求響應(yīng)模式,避免了無意義的請求。比如傳統(tǒng)的方式可能會使用AJAX不斷請求服務(wù)器端,而WebSocket則可以直接發(fā)送數(shù)據(jù)到客戶端且客戶端不必請求。同時,由于有了瀏覽器的原生支持,編寫客戶端應(yīng)用程序也變得更加便捷且不必依賴第三方插件。另外,WebSocket協(xié)議摒棄了HTTP協(xié)議繁瑣的請求頭,而是以數(shù)據(jù)幀的方式進行傳輸,效率更高。

圖為WebSocket協(xié)議通信的過程,首先客戶端會發(fā)送一個握手包告訴服務(wù)器端我想升級成WebSocket,不知道你服務(wù)器端是否同意,這時如果服務(wù)器端支持WebSocket協(xié)議則會返回一個握手包告訴客戶端沒問題,升級已確認。然后就成功建立起了一條WebSocket連接,該連接支持雙向通信,并且使用WebSocket協(xié)議的數(shù)據(jù)幀格式發(fā)送消息。

握手過程需要說明下,為了讓W(xué)ebSocket協(xié)議能和現(xiàn)有HTTP協(xié)議Web架構(gòu)互相兼容,所以WebSocket協(xié)議的握手要基于HTTP協(xié)議,比如客戶端會發(fā)送類似如下的HTTP報文到服務(wù)器端請求升級為WebSocket協(xié)議,其中包含的Upgrade: websocket就是告訴服務(wù)器端我想升級協(xié)議:

  GET ws://localhost:8080/hello HTTP/1.1
  Origin: http://localhost:8080
  Connection: Upgrade
  Host: localhost:8080
  Sec-WebSocket-Key: uRovscZjNol/umbTt5uKmw==
  Upgrade: websocket
  Sec-WebSocket-Version: 13

此時如果服務(wù)器端支持WebSocket協(xié)議,則它會發(fā)送一個同意客戶端升級協(xié)議的報文,具體報文類似如下,其中Upgrade: websocket就是告訴客戶端我同意你升級協(xié)議:

 HTTP/1.1 101 WebSocket Protocol Handshake
  Date: Fri, 10 Feb 2016 17:38:18 GMT
  Connection: Upgrade
  Server: Kaazing Gateway
  Upgrade: WebSocket
  Sec-WebSocket-Accept: rLHCkw/SKsO9GAH/ZSFhBATDKrU=

完成如上握手后,HTTP協(xié)議連接就被打破,接下去則是開始使用WebSocket協(xié)議進行雙方通信,這條連接還是原來的那條TCP/IP連接,端口也還是原來的80或443。

下面舉一個Tomcat中編寫WebSocket的簡單例子:

public class HelloWebSocketServlet extends WebSocketServlet {
  private static List<MessageInbound> socketList = new ArrayList<MessageInbound>();

  protected StreamInbound createWebSocketInbound(String subProtocol,HttpServletRequest request){
    return new WebSocketMessageInbound();
  }

  public class WebSocketMessageInbound extends MessageInbound{
    protected void onClose(int status){
      super.onClose(status);
      socketList.remove(this);      
    }
    protected void onOpen(WsOutbound outbound){
      super.onOpen(outbound);
      socketList.add(this);
    }
    @Override
    protected void onBinaryMessage(ByteBuffer message) throws IOException {

    }
    @Override
    protected void onTextMessage(CharBuffer message) throws IOException {
      for(MessageInbound messageInbound : socketList){
        CharBuffer buffer = CharBuffer.wrap(message);
        WsOutbound outbound = messageInbound.getWsOutbound();
        outbound.writeTextMessage(buffer);
        outbound.flush();        
      }
    }
  }
}

這個Servlet必須要繼承WebSocketServlet,接著創(chuàng)建一個繼承MessageInbound的WebSocketMessageInbound類,在該類中填充onClose、onOpen、onBinaryMessage和onTextMessage等方法即可完成各個事件的邏輯,其中onOpen會在一個WebSocket連接建立時被調(diào)用,onClose會在一個WebSocket關(guān)閉時被調(diào)用,onBinaryMessage則是Binary方式下接收到客戶端數(shù)據(jù)時被調(diào)用,onTextMessage則是Text方式下接收到客戶端數(shù)據(jù)時被調(diào)用。上面一段代碼實現(xiàn)了一個廣播的效果。

按照上面的處理邏輯,Tomcat對WebSocket的集成就不會太難了,就是在處理請求時如果遇到WebSocket協(xié)議請求則做特殊處理,保持住連接并在適當(dāng)?shù)臅r機調(diào)用WebSocketServlet的MessageInbound的onClose、onOpen、onBinaryMessage和onTextMessage等方法。由于WebSocket一般建議在NIO模式下使用,所以看看NIO模式集成WebSocket協(xié)議。

如圖,對于WebSocket的客戶端連接被接收器接收后注冊到NioChannel隊列中,Poller組件不斷輪休是否有NioChannel需要處理,如果有則經(jīng)過處理管道后進到繼承了WebSocketServlet的Servlet上,WebSocketServlet的doGet方法會處理WebSocket握手,告訴返回客戶端同意升級協(xié)議。往后Poller繼續(xù)不斷輪休相關(guān)NioChannel,一旦發(fā)現(xiàn)是使用WebSocket協(xié)議的管道則會調(diào)用MessageInbound的相關(guān)方法,完成不同事件的處理,從而實現(xiàn)對WebSocket協(xié)議的支持。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • Java中Boolean引發(fā)缺陷的解決

    Java中Boolean引發(fā)缺陷的解決

    本文主要介紹了Java中Boolean引發(fā)缺陷的解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 解決idea找不到setting.xml文件的問題

    解決idea找不到setting.xml文件的問題

    這篇文章主要介紹了解決idea找不到setting.xml文件的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • java中stream去重的幾種方式舉例

    java中stream去重的幾種方式舉例

    Stream流是數(shù)據(jù)渠道,用于操作數(shù)據(jù)源(集合、數(shù)組等)所生成的元素序列,這篇文章主要給大家介紹了關(guān)于java中stream去重的幾種方式,需要的朋友可以參考下
    2023-07-07
  • JVM中四種GC算法案例詳解

    JVM中四種GC算法案例詳解

    這篇文章主要介紹了JVM中四種GC算法案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Java8新特性之Base64詳解_動力節(jié)點Java學(xué)院整理

    Java8新特性之Base64詳解_動力節(jié)點Java學(xué)院整理

    這篇文章主要為大家詳細介紹了Java8新特性之Base64的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • websocket在springboot+vue中的使用教程

    websocket在springboot+vue中的使用教程

    這篇文章主要介紹了websocket在springboot+vue中的使用教程,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • Java使用反射生成JDK代理示例

    Java使用反射生成JDK代理示例

    這篇文章主要介紹了Java使用反射生成JDK代理,結(jié)合實例形式分析了java基于反射實現(xiàn)jdk動態(tài)代理相關(guān)操作技巧,需要的朋友可以參考下
    2019-07-07
  • Springboot詳解線程池與多線程及阻塞隊列的應(yīng)用詳解

    Springboot詳解線程池與多線程及阻塞隊列的應(yīng)用詳解

    本例應(yīng)用線程池、多線程、阻塞隊列處理一個流程任務(wù)。本例處理一個訂單流程,主要包括生成訂單、訂單處理、訂單入庫,下面我們一起看看
    2022-06-06
  • Java?斷言?assert的用法詳解

    Java?斷言?assert的用法詳解

    Java?assert斷言機制是Java5中推出的新特性,它主要用于在程序運行時檢查狀態(tài)或假設(shè)的正確性,本篇文章將全面詳細地講解Java?assert斷言機制,包括斷言概述、語法規(guī)則、工作原理、使用場景、注意事項以及示例代碼等方面,需要的朋友可以參考下
    2023-05-05
  • Java實現(xiàn)PDF轉(zhuǎn)Word的示例代碼(無水印無頁數(shù)限制)

    Java實現(xiàn)PDF轉(zhuǎn)Word的示例代碼(無水印無頁數(shù)限制)

    這篇文章主要為大家詳細介紹了如何利用Java語言實現(xiàn)PDF轉(zhuǎn)Word文件的效果,并可以無水印、無頁數(shù)限制。文中的示例代碼講解詳細,需要的可以參考一下
    2022-05-05

最新評論