溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Netty中如何實(shí)現(xiàn)客戶端與服務(wù)器端的長連接

發(fā)布時(shí)間:2021-11-23 22:17:07 來源:億速云 閱讀:2296 作者:柒染 欄目:大數(shù)據(jù)

本篇文章給大家分享的是有關(guān)Netty中如何實(shí)現(xiàn)客戶端與服務(wù)器端的長連接,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

Netty通過webSocket實(shí)現(xiàn)服務(wù)器與客戶端的長連接,Tomcat8,Spring,Netty提供了對(duì)websocket的支持,實(shí)現(xiàn)了真正意義上的長連接!

我們通過簡單的實(shí)現(xiàn),體驗(yàn)下這個(gè)長連接!

體驗(yàn)之前先說下Http與websocket的關(guān)系介紹:

       Http是一個(gè)無狀態(tài)的,協(xié)作的響應(yīng)式鏈接,所謂的無狀態(tài)體現(xiàn)在服務(wù)器是無法追蹤到根消息來自哪個(gè)客戶端的,通過cookei,session的形式保存消息

        在網(wǎng)頁聊天中,通過輪詢,commit的形式實(shí)現(xiàn)短時(shí)間的鏈接,這種通過重復(fù)建立鏈接的方式是效率較低,且最重要的是不能實(shí)時(shí)的,也就是準(zhǔn)實(shí)時(shí)性。

         持續(xù)鏈接的方式,體現(xiàn)在當(dāng)服務(wù)器無結(jié)果返回時(shí),客戶端無法感知,對(duì)于資源,帶寬的浪費(fèi);

         websocket實(shí)現(xiàn)了真正意義上的客戶端與服務(wù)器端的長連接,節(jié)省帶寬,而關(guān)注內(nèi)容本身

          websocket:1--:雙向數(shù)據(jù)傳遞

                               2--:基于Http

                               3--:非瀏覽器場(chǎng)合

下面我們通過程序的運(yùn)行體會(huì)一下!

建立server端!

Netty中如何實(shí)現(xiàn)客戶端與服務(wù)器端的長連接

我們發(fā)現(xiàn)無論是對(duì)Http的支持還是對(duì)socket連接,其建立運(yùn)行的方式都是一致的,在server端新增了handler(new LoggingHnadler),用于打印日志

綁定端口號(hào)8899,new InetSocketAddress等同于直接綁定8899

建立serverInnitializer

Netty中如何實(shí)現(xiàn)客戶端與服務(wù)器端的長連接

這里的ws解釋為websocketPath,即為請(qǐng)求時(shí)pathcoment

例如本次:ws://localhost:8899/ws

ws是指文末的ws,而開頭的ws是固定的websocket的書寫方式

其中HttpObjectAggregator是聚合處理,點(diǎn)進(jìn)去看一下

Netty中如何實(shí)現(xiàn)客戶端與服務(wù)器端的長連接

創(chuàng)建了一個(gè)示例,參數(shù)時(shí)max的文本長度,可聚合字節(jié),相當(dāng)于分段的理念

創(chuàng)建自己的handler

Netty中如何實(shí)現(xiàn)客戶端與服務(wù)器端的長連接

為了體驗(yàn)消息的實(shí)時(shí)性,用localdateTime.now()打印系統(tǒng)時(shí)間

這里我們看下asLongText的源碼

Netty中如何實(shí)現(xiàn)客戶端與服務(wù)器端的長連接

ChannelId繼承了serializable

其中asShortText為:返回一個(gè)短文本但不是唯一的一個(gè)channelId'

其中asLongText為:返回一個(gè)長文本但是唯一的一個(gè)channelId‘

websocket支持Html或第三方庫的運(yùn)行方式,我們寫一下頁面

Netty中如何實(shí)現(xiàn)客戶端與服務(wù)器端的長連接

一個(gè)發(fā)送數(shù)據(jù)的文本框,一個(gè)接收數(shù)據(jù)的文本框

js部分

Netty中如何實(shí)現(xiàn)客戶端與服務(wù)器端的長連接

我們先啟動(dòng)server端

Netty中如何實(shí)現(xiàn)客戶端與服務(wù)器端的長連接

再啟動(dòng)Html

Netty中如何實(shí)現(xiàn)客戶端與服務(wù)器端的長連接

當(dāng)鏈接打開時(shí),顯示了鏈接開啟!我們看下服務(wù)器端的變化

Netty中如何實(shí)現(xiàn)客戶端與服務(wù)器端的長連接

當(dāng)鏈接建立時(shí)調(diào)用handleradd方法,并且打印了類似UUID的字符串

我們發(fā)送數(shù)據(jù)體驗(yàn)一下

Netty中如何實(shí)現(xiàn)客戶端與服務(wù)器端的長連接

Netty中如何實(shí)現(xiàn)客戶端與服務(wù)器端的長連接

我們對(duì)比下除了正常相應(yīng)內(nèi)容以外,我們注意下時(shí)間

2019-01-20T13:09:14.322

2019-01-20T13:09:14.321

在毫秒級(jí)的偏差內(nèi)到達(dá)?。?!

我們打開開發(fā)者工具,刷新瀏覽器

Netty中如何實(shí)現(xiàn)客戶端與服務(wù)器端的長連接

與此同時(shí)服務(wù)器端變化:

Netty中如何實(shí)現(xiàn)客戶端與服務(wù)器端的長連接

test響應(yīng)碼200,沒什么好說的

我們?cè)倏聪聎s:

Netty中如何實(shí)現(xiàn)客戶端與服務(wù)器端的長連接

比較一下

Netty中如何實(shí)現(xiàn)客戶端與服務(wù)器端的長連接

除了響應(yīng)碼是特殊的101(Switching)以外,我們看到信息里還體現(xiàn)了幀(frame)

以及upgrade(提升):websocket

在這里體現(xiàn)了從Http提升到websocket的過程?。?!

準(zhǔn)備斷開

Netty中如何實(shí)現(xiàn)客戶端與服務(wù)器端的長連接

以上就是Netty中如何實(shí)現(xiàn)客戶端與服務(wù)器端的長連接,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI