您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關Netty中如何實現客戶端與服務器端的長連接,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
Netty通過webSocket實現服務器與客戶端的長連接,Tomcat8,Spring,Netty提供了對websocket的支持,實現了真正意義上的長連接!
我們通過簡單的實現,體驗下這個長連接!
體驗之前先說下Http與websocket的關系介紹:
Http是一個無狀態的,協作的響應式鏈接,所謂的無狀態體現在服務器是無法追蹤到根消息來自哪個客戶端的,通過cookei,session的形式保存消息
在網頁聊天中,通過輪詢,commit的形式實現短時間的鏈接,這種通過重復建立鏈接的方式是效率較低,且最重要的是不能實時的,也就是準實時性。
持續鏈接的方式,體現在當服務器無結果返回時,客戶端無法感知,對于資源,帶寬的浪費;
websocket實現了真正意義上的客戶端與服務器端的長連接,節省帶寬,而關注內容本身
websocket:1--:雙向數據傳遞
2--:基于Http
3--:非瀏覽器場合
下面我們通過程序的運行體會一下!
建立server端!
我們發現無論是對Http的支持還是對socket連接,其建立運行的方式都是一致的,在server端新增了handler(new LoggingHnadler),用于打印日志
綁定端口號8899,new InetSocketAddress等同于直接綁定8899
建立serverInnitializer
這里的ws解釋為websocketPath,即為請求時pathcoment
例如本次:ws://localhost:8899/ws
ws是指文末的ws,而開頭的ws是固定的websocket的書寫方式
其中HttpObjectAggregator是聚合處理,點進去看一下
創建了一個示例,參數時max的文本長度,可聚合字節,相當于分段的理念
創建自己的handler
為了體驗消息的實時性,用localdateTime.now()打印系統時間
這里我們看下asLongText的源碼
ChannelId繼承了serializable
其中asShortText為:返回一個短文本但不是唯一的一個channelId'
其中asLongText為:返回一個長文本但是唯一的一個channelId‘
websocket支持Html或第三方庫的運行方式,我們寫一下頁面
一個發送數據的文本框,一個接收數據的文本框
js部分
我們先啟動server端
再啟動Html
當鏈接打開時,顯示了鏈接開啟!我們看下服務器端的變化
當鏈接建立時調用handleradd方法,并且打印了類似UUID的字符串
我們發送數據體驗一下
我們對比下除了正常相應內容以外,我們注意下時間
2019-01-20T13:09:14.322
2019-01-20T13:09:14.321
在毫秒級的偏差內到達!!!
我們打開開發者工具,刷新瀏覽器
與此同時服務器端變化:
test響應碼200,沒什么好說的
我們再看下ws:
比較一下
除了響應碼是特殊的101(Switching)以外,我們看到信息里還體現了幀(frame)
以及upgrade(提升):websocket
在這里體現了從Http提升到websocket的過程!!!
準備斷開
以上就是Netty中如何實現客戶端與服務器端的長連接,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。