国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|

服務器之家 - 編程語言 - JAVA教程 - Tomcat 實現WebSocket詳細介紹

Tomcat 實現WebSocket詳細介紹

2020-07-09 10:42汪洋之舟---seaboat JAVA教程

這篇文章主要介紹了Tomcat 如何實現WebSocket的相關資料,對WebSocket協議通信的過程進行了詳細介紹,需要的朋友可以參考下

Tomcat 如何實現WebSocket

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

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

Tomcat 實現WebSocket詳細介紹

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

?
1
2
3
4
5
6
7
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

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

?
1
2
3
4
5
6
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協議連接就被打破,接下去則是開始使用WebSocket協議進行雙方通信,這條連接還是原來的那條TCP/IP連接,端口也還是原來的80或443。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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,接著創建一個繼承MessageInbound的WebSocketMessageInbound類,在該類中填充onClose、onOpen、onBinaryMessage和onTextMessage等方法即可完成各個事件的邏輯,其中onOpen會在一個WebSocket連接建立時被調用,onClose會在一個WebSocket關閉時被調用,onBinaryMessage則是Binary方式下接收到客戶端數據時被調用,onTextMessage則是Text方式下接收到客戶端數據時被調用。上面一段代碼實現了一個廣播的效果。

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

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

Tomcat 實現WebSocket詳細介紹

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 午夜精品一区二区三区在线播放 | 日韩中文字幕在线 | 影音先锋网址 | 最好的2019中文大全在线观看 | 精品国产凹凸成av人导航 | 日韩国产精品一区二区三区 | 国产久 | 国产中文字幕在线观看 | 欧美一区二区三区四区五区 | 欧美三区| 狠狠久久婷婷 | 深夜精品| 日本不卡一区二区三区在线观看 | 色女人av | 91 在线免费观看 | 日本乱偷中文字幕 | 午夜亚洲 | 国产1区2区3区| 亚洲欧美中文字幕 | 久久99久久99精品免观看粉嫩 | 国产精品久久久久久久久免费高清 | 国产精品久久久久久吹潮 | 成人a视频在线观看 | 婷婷丁香综合 | 中文字幕在线一区 | 91在线网| 日本一区二区三区视频免费看 | 久久久久久久国产视频 | 午夜精品久久久久久久久久久久 | 国产免费久久 | 在线成人免费电影 | 天堂va蜜桃一区二区三区漫画版 | 色欧美片视频在线观看 | 一级毛片免费观看 | 亚洲 欧美 日韩 在线 | 懂色av成人一区二区三区 | 久久久久在线 | 青青草久久久 | 久久精品噜噜噜成人av农村 | 日本精品一区二 | 淫片在线观看 |