天天看點

Netty4詳解二:開發第一個Netty應用程式

    既然是入門,那我們就在這裡寫一個簡單的demo,用戶端發送一個字元串到伺服器端,伺服器端接收字元串後再發送回用戶端。

2.1、配置開發環境

1.安裝jdk

2.去官網下載下傳jar包

(或者通過pom建構)

2.2、認識下netty的client和server

     一個netty應用模型,如下圖所示,但需要明白一點的是,我們寫的server會自動處理多用戶端請求,理論上講,處理并發的能力決定于我們的系統配置及jdk的極限。   

Netty4詳解二:開發第一個Netty應用程式

client連接配接到server端

建立連結發送/接收資料

server端處理所有client請求

     這裡有一個形象的比喻來形容netty用戶端和伺服器端的互動模式,比如把你比作一個client,把山比作一個server,你走到山旁,就是和山建立了連結,你向山大喊了一聲,就代表向山發送了資料,你的喊聲經過山的反射形成了回聲,這個回聲就是伺服器的響應資料。如果你離開,就代表斷開了連結,當然你也可以再回來。好多人可以同時向山大喊,他們的喊聲也一定會得到山的回應。

2.3 寫一個netty server

     一個nettyserver程式主要由兩部分組成:

bootstrapping:配置伺服器端基本資訊

serverhandler:真正的業務邏輯處理

2.3.1 bootstrapping的過程:

     1. 建立一個serverbootstrap執行個體

     2. 建立一個eventloopgroup來處理各種事件,如處理連結請求,發送接收資料等。

     3. 定義本地inetsocketaddress( port)好讓server綁定

     4. 建立childhandler來處理每一個連結請求   

     5. 所有準備好之後調用serverbootstrap.bind()方法綁定server

2.3.2 業務邏輯serverhandler:

     要想處理接收到的資料,我們必須繼承channelinboundhandleradapter接口,重寫裡面的messagereceive方法,每當有資料到達,此方法就會被調用(一般是byte類型數組),我們就在這裡寫我們的業務邏輯:

2.3.3關于異常處理:

     我們在上面程式中也重寫了exceptioncaught方法,這裡就是對當異常出現時的處理。

2.4 寫一個netty client

一般一個簡單的client會扮演如下角色:

連接配接到server

向server寫資料

等待server傳回資料

關閉連接配接

4.4.1 bootstrapping的過程:

     和server端類似,隻不過client端要同時指定連接配接主機的ip和port。

     3. 定義一個遠端inetsocketaddress好讓用戶端連接配接

     4. 當連接配接完成之後,handler會被執行一次   

     5. 所有準備好之後調用serverbootstrap.connect()方法連接配接server

4.4.2 業務邏輯clienthandler:

  我們同樣繼承一個simplechannelinboundhandler來實作我們的client,我們需要重寫其中的三個方法:

    其中需要注意的是channelread0()方法,此方法接收到的可能是一些資料片段,比如伺服器發送了5個位元組資料,client端不能保證一次全部收到,比如第一次收到3個位元組,第二次收到2個位元組。我們可能還會關心收到這些片段的順序是否可發送順序一緻,這要看具體是什麼協定,比如基于tcp協定的位元組流是能保證順序的。

    還有一點,在client端我們的業務handler繼承的是simplechannelinboundhandler,而在伺服器端繼承的是channelinboundhandleradapter,那麼這兩個有什麼差別呢?最主要的差別就是simplechannelinboundhandler在接收到資料後會自動release掉資料占用的bytebuffer資源(自動調用bytebuffer.release())。而為何伺服器端不能用呢,因為我們想讓伺服器把用戶端請求的資料發送回去,而伺服器端有可能在channelread方法傳回前還沒有寫完資料,是以不能讓它自動release。