最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Tomcat 實(shí)現(xiàn)WebSocket詳細(xì)介紹

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

Tomcat 如何實(shí)現(xiàn)WebSocket

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

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

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

此時(shí)如果服務(wù)器端支持WebSocket協(xié)議,則它會(huì)發(fā)送一個(gè)同意客戶端升級(jí)協(xié)議的報(bào)文,具體報(bào)文類似如下,其中Upgrade: websocket就是告訴客戶端我同意你升級(jí)協(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é)議進(jìn)行雙方通信,這條連接還是原來(lái)的那條TCP/IP連接,端口也還是原來(lái)的80或443。

下面舉一個(gè)Tomcat中編寫WebSocket的簡(jiǎn)單例子:

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();        
      }
    }
  }
}

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

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

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

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

相關(guān)文章

  • 使用jaxp進(jìn)行dom解析_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    使用jaxp進(jìn)行dom解析_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了使用jaxp進(jìn)行dom解析的相關(guān)資料,需要的朋友可以參考下
    2017-08-08
  • spring boot啟動(dòng)后直接關(guān)閉了的問題解決

    spring boot啟動(dòng)后直接關(guān)閉了的問題解決

    本文主要介紹了spring boot啟動(dòng)后直接關(guān)閉了的問題解決,SpringBoot項(xiàng)目啟動(dòng)后自動(dòng)關(guān)閉的原因是未引入web依賴,導(dǎo)致以普通Java項(xiàng)目運(yùn)行,下面就來(lái)介紹一下解決方法,感興趣的可以了解一下
    2025-02-02
  • java如何根據(jù)提供word模板導(dǎo)出word文檔詳解

    java如何根據(jù)提供word模板導(dǎo)出word文檔詳解

    在日常的開發(fā)工作中,我們時(shí)常會(huì)遇到導(dǎo)出Word文檔報(bào)表的需求,比如公司的財(cái)務(wù)報(bào)表、醫(yī)院的患者統(tǒng)計(jì)報(bào)表、電商平臺(tái)的銷售報(bào)表等等,這篇文章主要給大家介紹了關(guān)于java如何根據(jù)提供word模板導(dǎo)出word文檔的相關(guān)資料,需要的朋友可以參考下
    2023-09-09
  • Java中Easyexcel?實(shí)現(xiàn)批量插入圖片功能

    Java中Easyexcel?實(shí)現(xiàn)批量插入圖片功能

    這篇文章主要介紹了Easyexcel?實(shí)現(xiàn)批量插入圖片,本文通過(guò)實(shí)例代碼給大家介紹了easyexcel文檔處理工具、自定義圖片處理器的相關(guān)知識(shí),需要的朋友可以參考下
    2022-04-04
  • Java?中的整型數(shù)據(jù)類型((byte,?short,?int,?long?)的取值范圍及使用不同的整型的場(chǎng)景分析

    Java?中的整型數(shù)據(jù)類型((byte,?short,?int,?long?)的取值范圍及使用不同的整型的場(chǎng)景

    Java中的整型數(shù)據(jù)類型包括byte、short、int和long,每種類型都有不同的內(nèi)存占用和取值范圍,選擇合適的整型類型取決于具體需求,如內(nèi)存敏感場(chǎng)景、性能考量和避免整數(shù)溢出,示例代碼展示了如何聲明和初始化不同整型變量,并打印它們的最大值,感興趣的朋友一起看看吧
    2025-03-03
  • 淺談JVM系列之從匯編角度分析NullCheck

    淺談JVM系列之從匯編角度分析NullCheck

    在virtual call中執(zhí)行nullcheck的時(shí)候,如果已經(jīng)知道傳遞的參數(shù)是非空的。JIT會(huì)對(duì)代碼進(jìn)行優(yōu)化嗎?本文將詳細(xì)介紹JVM系列之從匯編角度分析NullCheck。
    2021-06-06
  • Java?深入學(xué)習(xí)static關(guān)鍵字和靜態(tài)屬性及方法

    Java?深入學(xué)習(xí)static關(guān)鍵字和靜態(tài)屬性及方法

    這篇文章主要介紹了Java?深入學(xué)習(xí)static關(guān)鍵字和靜態(tài)屬性及方法,文章通過(guò)圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • 詳解spring cloud feign踩坑記錄

    詳解spring cloud feign踩坑記錄

    這篇文章主要介紹了spring cloud feign踩坑記錄,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • SpringBoot配置ShedLock分布式定時(shí)任務(wù)

    SpringBoot配置ShedLock分布式定時(shí)任務(wù)

    ShedLock是一個(gè)在分布式環(huán)境中使用的定時(shí)任務(wù)框架,這篇文章主要介紹了SpringBoot配置ShedLock分布式定時(shí)任務(wù),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 聊聊springboot中整合log4g2的問題

    聊聊springboot中整合log4g2的問題

    這篇文章主要介紹了springboot中整合log4g2的方法,自定義文件名需要在application.yml中配置,在config中配置log4g2.xml文件,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-11-11

最新評(píng)論

承德县| 徐州市| 德安县| 锡林浩特市| 汉源县| 绥滨县| 吴旗县| 本溪| 盐津县| 衡阳市| 高碑店市| 忻州市| 灵山县| 巴彦淖尔市| 余干县| 大同市| 黑龙江省| 平定县| 衡南县| 乐东| 靖宇县| 濉溪县| 永登县| 玉龙| 马关县| 华亭县| 什邡市| 上杭县| 伊通| 黎平县| 江津市| 安岳县| 濉溪县| 乐业县| 靖州| 江口县| 满城县| 儋州市| 察隅县| 镇康县| 扶风县|