国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網(wǎng)站 > 建站經(jīng)驗 > 正文

Tomcat實現(xiàn)WebSocket的方法

2019-11-02 16:36:52
字體:
供稿:網(wǎng)友

 WebSocket協(xié)議屬于HTML5標準,越來越多瀏覽器已經(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.1Origin: http://localhost:8080Connection: UpgradeHost: localhost:8080Sec-WebSocket-Key: uRovscZjNol/umbTt5uKmw==Upgrade: websocketSec-WebSocket-Version: 13

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

HTTP/1.1 101 WebSocket Protocol HandshakeDate: Fri, 10 Feb 2016 17:38:18 GMTConnection: UpgradeServer: Kaazing GatewayUpgrade: WebSocketSec-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);}@Overrideprotected void onBinaryMessage(ByteBuffer message) throws IOException {}@Overrideprotected 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)了一個廣播的效果。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 邵武市| 金川县| 丰原市| 南皮县| 临沂市| 雷州市| 威海市| 普安县| 安化县| 东平县| 舞钢市| 巴塘县| 和田市| 留坝县| 天祝| 瑞丽市| 得荣县| 云龙县| 永泰县| 鄂托克旗| 曲周县| 龙口市| 盐池县| 海淀区| 余江县| 白城市| 汉中市| 文成县| 湛江市| 高陵县| 苏尼特左旗| 肇源县| 内乡县| 玉田县| 皮山县| 徐闻县| 南昌县| 永泰县| 乌鲁木齐市| 宁都县| 崇阳县|