2016-03-01 143 views
1

我正在使用Netty編寫JavaFX應用程序來實現自定義協議。沒有會話狀態,但我想將服務器響應關聯到特定的出站請求(並將結果返回到正確的JavaFX Task。)到目前爲止,我還沒有能夠在客戶端代碼中這樣做,因爲responseFuture是一個ChannelFuture<Void>在Netty客戶端處理來自服務器的響應

future = tcpBoostrap.connect(address, 3333).sync(); 
final Channel channel = future.awaitUninterruptibly().channel(); 

ChannelFuture responseFuture = channel.writeAndFlush(requestBuilder.build()); 
responseFuture.addListener(new ChannelFutureListener() { 
    @Override 
    public void operationComplete(ChannelFuture channelFuture) throws Exception { 
     if (channelFuture.isSuccess()) { 
      logger.debug("completed operation: {}", channelFuture.toString()); 
     } 
    } 
}); 

我試圖尋找如何配置PipeLine以某種方式安裝ChannelHandlers將共享在共享上下文變量的信息,但我找不到任何顯著。

任何人都可以提出的地方我可以填充UI任務,我可以「完成」與Netty的響應的地方嗎?

回答

0

Netty無法爲您做這樣的工作,因爲它無法理解配對機制。在客戶端,您需要實現ChannelHandler並將初始化程序傳遞給.handler(handler)方法。詳情請參閱Netty TimeClient example。在處理程序channelRead中,處理來自服務器的響應,將其反序列化,並根據與之前創建的Future的應用程序對特定的機制進行反序列化,並完成它。 Future不需要Netty未來,因爲這部分完全不在Netty處理中。

對於配對我假設你使用一些你發送給服務器的id,服務器發送相同的id給客戶端。所以在這種情況下,一些Map<Long, Future<?>>就足夠了。

+0

所以基本上就像[這個答案](http://stackoverflow.com/a/9048781/261984)。保持初始化器中使用的管道和'addLast'客戶端處理程序,該客戶端處理程序持有任務參考號 – Eddy

+0

@Eddy:部分是,以他們構造處理程序的方式。但是請注意,該處理程序是爲連接而創建的(或者甚至可以共享),因此如果您對多個請求重複使用相同的連接,則無法爲它提供對Request/Future的引用。您需要維護SettableFuture或回調的請求標識的映射,然後在收到適當的響應後完成。 –

相關問題