Netty 4.x 寫個(gè)應(yīng)答服務(wù)器

2018-10-26 09:50 更新

寫個(gè)應(yīng)答服務(wù)器

到目前為止,我們雖然接收到了數(shù)據(jù),但沒有做任何的響應(yīng)。然而一個(gè)服務(wù)端通常會(huì)對一個(gè)請求作出響應(yīng)。讓我們學(xué)習(xí)怎樣在 ECHO 協(xié)議的實(shí)現(xiàn)下編寫一個(gè)響應(yīng)消息給客戶端,這個(gè)協(xié)議針對任何接收的數(shù)據(jù)都會(huì)返回一個(gè)響應(yīng)。

和 discard server 唯一不同的是把在此之前我們實(shí)現(xiàn)的 channelRead() 方法,返回所有的數(shù)據(jù)替代打印接收數(shù)據(jù)到控制臺上的邏輯。因此,需要把 channelRead() 方法修改如下:


    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        ctx.write(msg); // (1)
        ctx.flush(); // (2)
    }
  1. ChannelHandlerContext 對象提供了許多操作,使你能夠觸發(fā)各種各樣的 I/O 事件和操作。這里我們調(diào)用了 write(Object) 方法來逐字地把接受到的消息寫入。請注意不同于 DISCARD 的例子我們并沒有釋放接受到的消息,這是因?yàn)楫?dāng)寫入的時(shí)候 Netty 已經(jīng)幫我們釋放了。
  2. ctx.write(Object) 方法不會(huì)使消息寫入到通道上,他被緩沖在了內(nèi)部,你需要調(diào)用 ctx.flush() 方法來把緩沖區(qū)中數(shù)據(jù)強(qiáng)行輸出。或者你可以用更簡潔的 cxt.writeAndFlush(msg) 以達(dá)到同樣的目的。

如果你再一次運(yùn)行 telnet 命令,你會(huì)看到服務(wù)端會(huì)發(fā)回一個(gè)你已經(jīng)發(fā)送的消息。

完整的echo服務(wù)的代碼放在了 io.netty.example.echo包下面。

譯者注:翻譯版本的項(xiàng)目源碼見 https://github.com/waylau/netty-4-user-guide-demos 中的com.waylau.netty.demo.echo 包下

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號