Java 在Netty客户端中处理来自服务器的响应

Java 在Netty客户端中处理来自服务器的响应,java,netty,Java,Netty,我正在使用Netty编写一个JavaFX应用程序来实现一个自定义协议。没有会话状态,但我希望将服务器响应与特定出站请求关联(并将结果返回到正确的JavaFX任务),到目前为止,我无法在客户端代码中这样做,因为响应未来是一个通道未来 我试图寻找如何配置管道,以某种方式安装ChannelHandlers,该管道将在共享上下文变量中共享信息,但我找不到任何有意义的内容 有谁能推荐一个惯用的地方,在那里我可以用Netty中的响应“完成”UI任务?Netty无法为您完成这些工作,因为它无法理解配对机制。在

我正在使用Netty编写一个JavaFX应用程序来实现一个自定义协议。没有会话状态,但我希望将服务器响应与特定出站请求关联(并将结果返回到正确的JavaFX
任务
),到目前为止,我无法在客户端代码中这样做,因为响应未来是一个
通道未来

我试图寻找如何配置
管道
,以某种方式安装
ChannelHandlers
,该管道将在共享上下文变量中共享信息,但我找不到任何有意义的内容


有谁能推荐一个惯用的地方,在那里我可以用Netty中的响应“完成”UI任务?

Netty无法为您完成这些工作,因为它无法理解配对机制。在客户端,您需要实现
ChannelHandler
,并将初始值设定项传递给
.handler(handler)
方法。有关详细信息,请参阅。在handler
channelRead
方法中,处理来自服务器的响应,将其反序列化,并根据特定于应用程序对的机制,使用先前创建的
Future
完成响应。
Future
不一定是Netty Future,因为该部分完全没有Netty处理


对于配对,我假设您使用发送到服务器的某个id,服务器将相同的id发送回客户端。因此,在这种情况下,一些
MapNetty无法为您完成这些工作,因为它无法理解配对机制。在客户端,您需要实现
ChannelHandler
,并将初始值设定项传递给
.handler(handler)
方法。有关详细信息,请参阅。在handler
channelRead
方法中,处理来自服务器的响应,将其反序列化,并根据特定于应用程序对的机制,使用先前创建的
Future
完成响应。
Future
不一定是Netty Future,因为该部分完全没有Netty处理


对于配对,我假设您使用发送到服务器的某个id,服务器将相同的id发送回客户端。在这种情况下,一些
MapSo基本上是这样的。保留初始值设定项中使用的管道,并保留对Task@Eddy:部分是,以他们构造处理程序的方式。但是请注意,处理程序是为连接创建的(或者甚至可以共享),因此,如果对多个请求重用同一连接,则不可能为其提供对Request/Future的引用。您需要维护请求ID到SettableFuture或回调的映射,然后在收到相应响应时完成。保留初始值设定项中使用的管道,并保留对Task@Eddy:部分是,以他们构造处理程序的方式。但是请注意,处理程序是为连接创建的(或者甚至可以共享),因此,如果对多个请求重用同一连接,则不可能为其提供对Request/Future的引用。您需要维护请求ID到SettableFuture或回调的映射,然后在收到适当的响应后完成该映射。
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());
        }
    }
});