-
WebSocket如何關(guān)閉鏈接:
1、服務(wù)器關(guān)閉底層TCP鏈接
2、客戶端發(fā)起TCP Close
底層的TCP ,正常情況下應(yīng)該首先由服務(wù)器關(guān)閉 ,在異常情況下客戶端可以發(fā)起TCP Close。
流程:當服務(wù)器被指示關(guān)閉WebSocket鏈接時,服務(wù)端會發(fā)起一個TCP Close操作, 客戶端應(yīng)該等待服務(wù)器的TCP Close
查看全部 -
WebSocket生命周期:
1、打開事件:端點上建立新鏈接時,該事件是先于其他任何事件發(fā)生之前。該事件發(fā)生會產(chǎn)生三部分信息。
1.1、創(chuàng)建WebSocket Session對象:用于表示已經(jīng)建立好的鏈接
1.2、配置對象:包含配置端點的信息。
1.3、一組路徑參數(shù),用于打開節(jié)點握手時,WebSocket端入棧匹配的URI
2、消息事件:主要是接收WebSocket對話中,另一端發(fā)送的消息。鏈接上的消息將會有三種形式抵達客戶端。
2.1、文本消息 用String處理
2.2、二進制消息 用byteBuffer或者byte[]處理
2.3、pong消息 用Java WebSocket API中的pong.message接口的實例來處理
3、錯誤事件:WebSocket鏈接或者端點發(fā)生錯誤時產(chǎn)生。可以處理入棧消息時發(fā)生的各種異常。入棧消息可能產(chǎn)生的三種異常。
3.1、WebSocket建立鏈接時發(fā)生錯誤:SessionException類型
3.2、WebSocket試圖將入棧消息解碼成開發(fā)人員使用的對象時 EncodeException類型
3.3、WebSocket端點的其他方法運行時產(chǎn)生的錯誤,WebSocket實現(xiàn)將記錄端點操作過程中產(chǎn)生的任何異常
4、關(guān)閉事件:WebSocket鏈接端點關(guān)閉,做一些清理工作,可以由參與連接的任意一個端點發(fā)出。
查看全部 -
WebSocket建立連接過程:
1、客戶端發(fā)起握手請求。
2、服務(wù)端響應(yīng)請求。
3、建立連接。
詳細流程:
建立一個WebSocket連接,客戶端或瀏覽器首先向服務(wù)器發(fā)送一個特殊的Http請求(攜帶一些附加頭信息)Upgrade:websocket,服務(wù)端解析附加頭信息,產(chǎn)生應(yīng)答消息,然后響應(yīng)給客戶端,之后客戶端就與服務(wù)端建立響應(yīng)的鏈接。
查看全部 -
WebSocket的優(yōu)點:
節(jié)省通信開銷,之前WebServer實現(xiàn)通信,都使用輪詢(每隔特定時間間隔瀏覽器自動發(fā)送Http請求,去獲取服務(wù)端的響應(yīng))該情況下,需要不停的向服務(wù)器發(fā)送請求,而HttpRequest的handler很長,請求包含真正的數(shù)據(jù)可能很小,會占用很多額外的帶寬和服務(wù)器資源。
服務(wù)器主動傳送數(shù)據(jù)給客戶端,在給定時間,服務(wù)器和客戶端在任意時刻相互推送信息,瀏覽器(客戶端)和服務(wù)器只需要做一個握手的動作。建立連接后,服務(wù)器可主動傳數(shù)據(jù)給客戶端,客戶端也可以隨意向服務(wù)端傳數(shù)據(jù)。交換數(shù)據(jù)時所攜帶的頭信息很小。
實時通信:WebSocket不僅限于Ajax方式通信。ajax方式需要瀏覽器發(fā)起請求。而WebSocket技術(shù) 服務(wù)端和客戶端可以彼此相互推送信息,從而實現(xiàn)實時通信。
查看全部 -
什么是WebSocket:是一種H5協(xié)議規(guī)范,通過握手機制客戶端與服務(wù)器之間就能夠建立一個類似Tcp的連接,從而方便客戶端與服務(wù)器之間的通信。
它是一種解決客戶端與服務(wù)端實時通信而產(chǎn)生的技術(shù):WebSocket本質(zhì)是一種基于TCP協(xié)議,先通過Http/Https發(fā)一個特殊的Http請求進行握手,握手后會創(chuàng)建一個用于交換數(shù)據(jù)的TCP鏈接,之后客戶端和服務(wù)端使用該TCP鏈接進行實時通信。當WebSocket的客戶端和服務(wù)端握手后 建立通信后,就不再需要之前的http請求參與。
查看全部 -
Netty的優(yōu)勢:
業(yè)界流行的NIO框架之一,健壯性,功能,可定制性,可擴展性都比較好,得到了業(yè)界的認可與證明,比如在dubbo框架中的底層應(yīng)用
API使用簡單,定制能力強,可以靈活擴展
入門門檻低,易學(xué),功能強大,預(yù)置了多種編解碼功能,支持多種主流通信協(xié)議
性能高
成熟,穩(wěn)定
查看全部 -
原生NIO的缺陷
類庫和API繁雜
入門門檻高,需要其他額外的知識做鋪墊
工作量和難度大,客戶端會面臨斷開,重連,網(wǎng)絡(luò)閃斷,失敗緩存,網(wǎng)絡(luò)擁堵等問題
JDK NIO存在缺陷,可能會導(dǎo)致selector空輪詢,導(dǎo)致CPU飆升
查看全部 -
四種IO對比:(IO類型,客戶端個數(shù),API使用難度,調(diào)試難度,可靠性,吞吐量)
BIO:?阻塞同步的IO,客戶端的個數(shù)與服務(wù)端的IO線程數(shù)呈1比1的關(guān)系,API使用簡單,調(diào)試比較簡單,可靠性非常差,吞吐量非常低
偽異步IO:?阻塞同步的IO,客戶端的個數(shù)與服務(wù)端的IO線程數(shù)呈M比N的關(guān)系,API使用簡單,調(diào)試簡單,相比于BIO的可靠性,來說相對好一點,但也很差,吞吐量中等
NIO:?非阻塞同步的IO,客戶端的個數(shù)與服務(wù)端的IO線程數(shù)呈M比1的關(guān)系, API使用復(fù)雜,調(diào)試相對復(fù)雜,可靠性要高一些,吞吐量高
AIO:?非阻塞異步IO,客戶端的個數(shù)與服務(wù)端的IO線程數(shù)呈M比0的關(guān)系,不需要啟動額外的IO線程,它是被動回調(diào)的,API使用復(fù)雜,調(diào)試相對復(fù)雜,可靠性比較高,吞吐量比較高
查看全部 -
AIO通信:它是連接注冊讀寫事件和回調(diào)函數(shù),讀寫方法異步,同時它是主動通知程序。AIO異步通信提供了兩種方式獲取操作結(jié)果:第一種方式是通過java.util.concurrent的Future類來表示異步操作的結(jié)果;第二種方式是在執(zhí)行異步操作的時候傳入一個java.nio.channels.CompletionHandler接口的實現(xiàn)類作為操作完成回調(diào)。NIO的異步套接字回調(diào),是真正的異步非阻塞IO,對應(yīng)于Unix網(wǎng)絡(luò)編程中的事件驅(qū)動IO,不需要通過多路復(fù)用器對被注冊的通道進行輪詢操作即可實現(xiàn)異步讀寫,從而簡化NIO的編程模型。
查看全部 -
NIO通信:
緩存區(qū)Buffer:? 它是一個對象,它包含一些要寫入或要讀出的數(shù)據(jù),在NIO中加入Buffer對象,體現(xiàn)了新庫與原IO的重要區(qū)別。在面向流的IO中,可以將數(shù)據(jù)直接寫入或者將數(shù)據(jù)直接讀到Strem對象中。在NIO中,所有數(shù)據(jù)都是用緩沖區(qū)進行處理的,在讀取數(shù)據(jù)時,直接讀緩沖區(qū)中,在寫入數(shù)據(jù)時,是直接寫入緩沖區(qū)中。任何時候處理NIO中的數(shù)據(jù)時都是通過緩沖區(qū)進行操作。
通道Channel:? 網(wǎng)絡(luò)數(shù)據(jù)通過通道Channel讀取和寫入,通道與流的不同之處在于通道是雙向的,而流只是在一個方向上移動,一個流必須是InputStream或OutputStream的子類,而通道可以用于讀寫或二者同時進行。
多路復(fù)用器selector:? selector提供了選擇已經(jīng)就緒的任務(wù)的能力,會通過不斷輪詢在其上的Channel,在某個Channel上面發(fā)生讀或者寫事件,則該Channel處于就緒狀態(tài),會被Selector輪詢出來,然后獲取Channel的集合進行后續(xù)IO的操作。
NIO通信并沒有最大連接數(shù)的限制,可以接入成千上萬的客戶端
查看全部 -
偽異步IO通信模型:
當有N個新的客戶端接入的時候,偽異步IO通信將客戶端的socket封裝成一個Task投遞到后端的線程池中進行處理,JDK的線程池負責(zé)維護一個消息隊列和N個活躍的線程,它與BIO通信模型最大的不同點是:偽異步IO通信的服務(wù)端不再針對每一個客戶端都創(chuàng)建一個獨立的線程,它是由一個線程池來統(tǒng)一處理所有客戶端的接入請求。
當有大量客戶端接入的時候,并發(fā)量不斷上漲,將會出現(xiàn)線程池阻塞問題。
查看全部 -
偽異步IO通信:當有新的客戶端接入的時候,將客戶端的socket封裝成一個task投遞到后端的線程池進行處理,線程池維護一個消息隊列和N個活躍的線程,對消息隊列中的任務(wù)進行相關(guān)的處理。也就是說當有M個客戶端接入的時候,服務(wù)端將會創(chuàng)建一個具有N個線程的線程池來對客戶端的請求進行處理。由于線程池可以設(shè)置消息隊列的大小和最大線程數(shù),因此它的資源占用是可控的,無論多少個客戶端對它訪問,都不會導(dǎo)致資源的耗盡和宕機。缺點:當有大量的客戶端進入的時候,隨著并發(fā)訪問量的不斷增加,偽異步IO通信可能會造成線程池阻塞。
查看全部
舉報