1 2 4寫乙個 echo 客戶端

2021-07-24 22:52:18 字數 2515 閱讀 1350

客戶端要做的是:

跟寫伺服器一樣,我們提供 channelinboundhandler 來處理資料。下面例子,我們用 ******channelinboundhandler 來處理所有的任務,需要覆蓋三個方法:

listing 2.4 channelhandler for the client

@sharable                                //1

public class echoclienthandler extends

******channelinboundhandler

@override

public void channelread0(channelhandlercontext ctx,

bytebuf in)

@override

public void exceptioncaught(channelhandlercontext ctx,

throwable cause)

}

1.@sharable標記這個類的例項可以在 channel 裡共享

2.當被通知該 channel 是活動的時候就傳送資訊

3.記錄接收到的訊息

4.記錄日誌錯誤並關閉 channel

建立連線後該 channelactive() 方法被呼叫一次。邏輯很簡單:一旦建立了連線,位元組序列被傳送到伺服器。該訊息的內容並不重要;在這裡,我們使用了 netty 編碼字串 「netty rocks!」 通過覆蓋這種方法,我們確保東西被盡快寫入到伺服器。

接下來,我們覆蓋方法 channelread0()。這種方法會在接收到資料時被呼叫。注意,由伺服器所傳送的訊息可以以塊的形式被接收。即,當伺服器傳送 5 個位元組是不是保證所有的 5 個位元組會立刻收到 - 即使是只有 5 個位元組,channelread0() 方法可被呼叫兩次,第一次用乙個bytebuf(netty的位元組容器)裝載3個位元組和第二次乙個 bytebuf 裝載 2 個位元組。唯一要保證的是,該位元組將按照它們傳送的順序分別被接收。 (注意,這是真實的,只有面向流的協議如tcp)。

第三個方法重寫是 exceptioncaught()。正如在 echoserverhandler (清單2.2),所述的記錄 throwable 並且關閉通道,在這種情況下終止 連線到伺服器。

******channelinboundhandler vs. channelinboundhandler

何時用這2個要看具體業務的需要。在客戶端,當 channelread0() 完成,我們已經拿到的入站的資訊。當方法返回,******channelinboundhandler 會小心的釋放對 bytebuf(儲存資訊) 的引用。而在 echoserverhandler,我們需要將入站的資訊返回給傳送者,write() 是非同步的在 channelread()返回時,可能還沒有完成。所以,我們使用 channelinboundhandleradapter,無需釋放資訊。最後在 channelreadcomplete() 我們呼叫 ctxwriteandflush() 來釋放資訊。詳見第5、6章

客戶端引導需要 host 、port 兩個引數連線伺服器。

listing 2.5 main class for the client

public class echoclient 

public void start() throws exception

});channelfuture f = b.connect().sync(); //6

f.channel().closefuture().sync(); //7

} finally

}public static void main(string args) throws exception

final string host = args[0];

final int port = integer.parseint(args[1]);

new echoclient(host, port).start();

}}

1.建立 bootstrap

2.指定 eventloopgroup 來處理客戶端事件。由於我們使用 nio 傳輸,所以用到了 nioeventloopgroup 的實現

3.使用的 channel 型別是乙個用於 nio 傳輸

4.設定伺服器的 inetsocketaddress

5.當建立乙個連線和乙個新的通道時,建立新增到 echoclienthandler 例項 到 channel pipeline

6.連線到遠端;等待連線完成

7.阻塞直到 channel 關閉

8.呼叫 shutdowngracefully() 來關閉執行緒池和釋放所有資源

與以前一樣,在這裡使用了 nio 傳輸。請注意,您可以在 客戶端和伺服器 使用不同的傳輸 ,例如 nio 在伺服器端和 oio 客戶端。在第四章中,我們將研究一些具體的因素和情況,這將導致 您可以選擇一種傳輸,而不是另一種。

讓我們回顧一下我們在本節所介紹的要點

12 4 客戶端響應解碼

客戶端響應解碼整體流程 1 nettycodecadapter internaldecoder.decode channelhandlercontext ctx,bytebuf input,listout 2 new nettybackedchannelbuffer bytebuf buffer 建...

使用open live writer客戶端寫部落格

wlw window live writer 在很早之前就不更新了,後來出了乙個olw open live writer 基本跟wlw相同,只是開源,更小巧好用。選擇日誌服務型別為 其它日誌型別 新增日誌賬戶 備註 xiaofan012 126.com 安裝完olw open live olw剛裝上...

使用open live writer客戶端寫部落格

wlw window live writer 在很早之前就不更新了,後來出了乙個olw open live writer 基本跟wlw相同,只是開源,更小巧好用。選擇日誌服務型別為 其它日誌型別 新增日誌賬戶 備註 使用者名稱 xiaofan012 126.com 經過這樣乙個預設設定的修改,就可以...