天天看點

netty系列之:使用netty搭建websocket用戶端

簡介

在網速快速提升的時代,浏覽器已經成為我們通路各種服務的入口,很難想象如果離開了浏覽器,我們的網絡世界應該如何運作。現在恨不得把作業系統都搬上浏覽器。但是并不是所有的應用都需要浏覽器來執行,比如伺服器和伺服器之間的通信,就需要使用到自建用戶端來和伺服器進行互動。

本文将會介紹使用netty用戶端連接配接websocket的原理和具體實作。

浏覽器用戶端

在介紹netty用戶端之前,我們先看一個簡單的浏覽器用戶端連接配接websocket的例子:

這裡使用了浏覽器最通用的語言javascript,并使用了浏覽器提供的websocket api進行操作,非常的簡單。

那麼用netty用戶端實作websocket的連接配接是否和javascript使用一樣呢?我們一起來探索。

netty對websocket用戶端的支援

先看看netty對websocket的支援類都有哪些,接着我們看下怎麼具體去使用這些工具類。

和websocket server一樣,client中最核心的類也是handshaker,這裡叫做websocketclienthandshaker。這個類有什麼作用呢?一起來看看。

這個類主要實作的就是client和server端之間的握手。

我們看一下它的最長參數的構造類:

參數中有websocket連接配接的uri,像是:”ws://flydean.com/mypath”。

有請求子協定的類型subprotocol,有自定義的http headers:customheaders,有最大的frame payload的長度:maxframepayloadlength,有強制timeout關閉的時間,有使用http協定進行更新的uri位址。

怎麼建立handshaker呢?同樣的,netty提供了一個websocketclienthandshakerfactory方法。

websocketclienthandshakerfactory提供了一個newhandshaker方法,可以友善的建立各種不同版本的handshaker:

可以看到,根據傳入協定版本的不同,可以分為websocketclienthandshaker13、websocketclienthandshaker08、websocketclienthandshaker07、websocketclienthandshaker00這幾種。

通常來說,對于websocket協定,為了提升傳輸的性能和速度,降低網絡帶寬占用量,在使用過程中通常會帶上額外的壓縮擴充。為了處理這樣的壓縮擴充,netty同時提供了伺服器端和用戶端的支援。

對于伺服器端來說對應的handler叫做websocketservercompressionhandler,對于用戶端來說對應的handler叫做websocketclientcompressionhandler。

通過将這兩個handler加入對應pipline中,可以實作對websocket中壓縮協定擴充的支援。

對于協定的擴充有兩個級别分别是permessage-deflate和perframe-deflate,分别對應permessagedeflateclientextensionhandshaker和deflateframeclientextensionhandshaker。

至于具體怎麼壓縮的,這裡就不詳細進行講解了, 感興趣的小夥伴可以自行了解。

netty用戶端的處理流程

前面講解了netty對websocket用戶端的支援之後,本節将會講解netty到底是如何使用這些工具進行消息處理的。

首先是按照正常的邏輯建立用戶端的bootstrap,并添加handler。這裡的handler就是專門為websocket定制的client端handler。

除了上面提到的websocketclientcompressionhandler,就是自定義的handler了。

在自定義handler中,我們需要處理兩件事情,一件事情就是在channel ready的時候建立handshaker。另外一件事情就是具體websocket消息的處理了。

首先使用websocketclienthandshakerfactory建立handler:

然後在channel active的時候使用handshaker進行握手連接配接:

然後在進行消息接收處理的時候還需要判斷handshaker的狀态是否完成,如果未完成則調用handshaker.finishhandshake方法進行手動完成:

當handshake完成之後,就可以進行正常的websocket消息讀寫操作了。

websocket的消息處理比較簡單,将接收到的消息轉換成為websocketframe進行處理即可。

總結

本文講解了netty提供的websocket用戶端的支援和具體的對接流程,大家可以再次基礎上進行擴充,以實作自己的業務邏輯。

本文的例子可以參考:​​learn-netty4​​

本文已收錄于 ​​http://www.flydean.com/25-netty-websocket-client/​​ 最通俗的解讀,最深刻的幹貨,最簡潔的教程,衆多你不知道的小技巧等你來發現! 歡迎關注我的公衆号:「程式那些事」,懂技術,更懂你!