天天看點

Netty入門系列(1) --使用Netty搭建服務端和用戶端

引言

前面我們介紹了網絡一些基本的概念,雖然說這些很難吧,但是至少要做到了解吧。有了之前的基礎,我們來正式揭開netty這神秘的面紗就會簡單很多。

服務端

我們來分析一下上面的這段代碼(下面的每一點對應上面的注釋)

1~2:首先我們建立了兩個nioeventloopgroup執行個體,它是一個由netty封裝好的包含nio的線程組。為什麼建立兩個?我想經過前面的學習大家應該都清楚了。對,因為netty的底層是io多路複用,bossgroup 是用于接收用戶端的連接配接,原理就是一個實作的selector的reactor線程。而workergroup用于進行socketchannel的網絡讀寫。

3:建立一個serverbootstrap對象,可以把它想象成netty的入口,通過這類來啟動netty,将所需要的參數傳遞到該類當中,大大降低了的開發難度。

4:将兩個nioeventloopgroup執行個體綁定到serverbootstrap對象中。

5:建立channel(典型的channel有niosocketchannel,nioserversocketchannel,oiosocketchannel,oioserversocketchannel,epollsocketchannel,epollserversocketchannel),這裡建立的是nioserversocketchannel,它的功能可以了解為當接受到用戶端的連接配接請求的時候,完成tcp三次握手,tcp實體鍊路建立成功。并将該“通道”與workergroup線程組的某個線程相關聯。

6:設定參數,這裡設定的so_backlog,意思是用戶端連接配接等待隊列的長度為1024.

7:建立連接配接後的具體handler。就是我們接受資料後的具體操作,例如:記錄日志,對資訊解碼編碼等。

8:綁定端口,同步等待成功

9:等待服務端監聽端口關閉

綁定該服務端的handler

printserverhandler 繼承 channelhandleradapter  ,在這裡它的功能為 列印用戶端發來的資料并且傳回用戶端列印成功。

我們隻需要實作channelread,exceptioncaught,前一個為接受消息具體邏輯的實作,後一個為發生異常後的具體邏輯實作。

1:我們可以看到,接受的消息被封裝為了object ,我們将其轉換為bytebuf ,前一章的講解中也說明了該類的作用。我們需要讀取的資料就在該緩存類中。

2~3:我們将寫好的資料封裝到bytebuf中,然後通過write方法寫回到用戶端,這裡的3調用flush方法的作用為,防止頻繁的發送資料,write方法并不直接将資料寫入socketchannel中,而是把待發送的資料放到發送緩存數組中,再調用flush方法發送資料。

用戶端

我們繼續來分析一下上面的這段代碼(下面的每一點對應上面的注釋)

1:差別于服務端,我們在用戶端隻建立了一個nioeventloopgroup執行個體,因為用戶端你并不需要使用i/o多路複用模型,需要有一個reactor來接受請求。隻需要單純的讀寫資料即可

2:差別于服務端,我們在用戶端隻需要建立一個bootstrap對象,它是用戶端輔助啟動類,功能類似于serverbootstrap。

3:将nioeventloopgroup執行個體綁定到bootstrap對象中。

4:建立channel(典型的channel有niosocketchannel,nioserversocketchannel,oiosocketchannel,oioserversocketchannel,epollsocketchannel,epollserversocketchannel),差別與服務端,這裡建立的是niosocketchannel.

5:設定參數,這裡設定的tcp_nodelay為true,意思是關閉延遲發送,一有消息就立即發送,預設為false。

6:建立連接配接後的具體handler。注意這裡差別與服務端,使用的是handler()而不是childhandler()。handler和childhandler的差別在于,handler是接受或發送之前的執行器;childhandler為建立連接配接之後的執行器。

7:發起異步連接配接操作

8:當代用戶端鍊路關閉

綁定該用戶端的handler

printclienthandler 繼承 channelhandleradapter  ,在這裡它的功能為 發送資料并列印服務端發來的資料。

我們隻需要實作channelactive,channelread,exceptioncaught,第一個為建立連接配接後立即執行,後兩個與一個為接受消息具體邏輯的實作,另一個為發生異常後的具體邏輯實作。

1:将發送的資訊封裝到bytebuf中。

2:發送消息。

3:接受用戶端的消息并列印

4:發生異常時,列印異常資訊,釋放用戶端資源

總結

這是一個入門程式,對應前面所講的i/o多路複用模型以及nio的特性,能很有效的了解該模式的程式設計方式。如果這幾段代碼看着很費勁,那麼可以看看之前部落客的netty基礎系列。

如果部落客哪裡說得有問題,希望大家提出來,一起進步~