2011-12-13 167 views
5

我試圖拼湊Netty客戶端。我需要發送一個請求到服務器(我不控制),我期待着迴應。Netty客戶端,如何從發送到服務器的請求獲得迴應

我不確定如何獲得迴應。

所以,如果我有:

ChannelFuture future = bootstrap.connect(new InetSocketAddress("foo.com", 1654)); 
Channel connector = future.awaitUninterruptibly().getChannel(); 
ChannelFuture response = connector.write(query); 

我如何獲得響應數據進行響應的ChannelFuture的?我是否需要將ChannelHandler添加到引導程序管道中?如果是這樣,我如何將響應與請求相關聯?

感謝,

+0

你最終找到你的問題的答案,因爲我有這個非常相同的問題... – 2012-01-28 21:18:33

回答

2

是的,你需要添加一個ChannelHandler。最簡單的方法是擴展SimpleChannelUpstreamHandler並覆蓋channelConnected(…)方法和messageReceived(…)方法。在channelConnected你會激發Channel.write(…)messageReceived你收到答覆。如果響應可以以不同的順序進入,那麼寫入您需要編寫自己的處理代碼。

另一種解決方案是在調用write之前將一個SimpleChannelUpstreamHandler添加到管道。類似這樣的:

channel.getPipeline().addLast("yourHandlerName", new SimpleChannelUpstreamHandler()) { 
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { 
     // remove handler after receiving response 
     ctx.getPipeline().remove(this); 

     // do logic 
     ... 
     } 
}); 
+2

感謝您對此作出迴應;很難相信ChannelFuture不會像......未來一樣。我不敢相信Google搜索了一個小時,終於在這裏找到了你的帖子,通過標記'netty'的東西。我注意到你參與4.0 alpha的一個問題關於這個 - 任何運動?就像我一樣,我實現了一個`Response ``我的`ChannelHandler`子類實現的接口。我把那個和`ChannelFuture`傳遞給一個實現`Future `的類的構造函數,並作爲包裝器。我想吊死自己。 – 2012-02-16 06:55:41

2

首先,您可能會參考localtime的示例。在「LocalTimeClientHandler」的處理程序中,您可以找到阻止請求/響應的技巧。

但這仍然是一個「Hello World」展示的項目,所以仍然有2個問題,我們需要考慮:

  1. 此示例中的想法是,一旦發送一批,並得到一個響應一旦。因此,重複使用同一頻道不適合連續發送生產模式。

  2. 如果您想要發送請求並在負載較重的情況下儘快找回正確的響應,則需要對隊列進行一些重構,否則性能非常差。

相關問題