我想写一个TCP二进制协议的代理。我以Netty仓库中的HexDump示例为指导。https://github.com/netty/netty/tree/4.1/example/src/main/java/io/netty/example/proxy
这很好。但是我有时想根据原始请求修改响应。
环顾四周,似乎可以使用入站通道AttributeMap来存储此类请求详细信息。 (下面有更多详细信息)
io.netty.util.AttributeMap
但是在某种程度上可行有时一个请求会覆盖另一个请求的详细信息。
这很有意义,Netty是异步的,您无法真正保证何时会发生某些事情。
所以我想知道我如何可靠地将每个请求与响应相关联。请注意,我不能更改协议,这可能是在请求和响应之间传递详细信息的一种方法。
感谢您的见解。
HexDumpFrontendHandler
@Override
public void channelRead(final ChannelHandlerContext ctx, Object msg) throws InterruptedException {
…
ctx.channel().attr(utils.REQUEST_ATTRIBUTE).set(requestDetails);
…
}
@Override
public void channelActive(ChannelHandlerContext ctx) {
final Channel inboundChannel = ctx.channel();
// Start the connection attempt.
Bootstrap b = new Bootstrap();
b.group(inboundChannel.eventLoop())
.channel(ctx.channel().getClass())
.handler(new HexDumpBackendHandler(inboundChannel))
.option(ChannelOption.AUTO_READ, false);
ChannelFuture f = b.connect(remoteHost, remotePort);
outboundChannel = f.channel();
f.addListener((ChannelFutureListener) future -> {
if (future.isSuccess()) {
// connection complete start to read first data
inboundChannel.read();
} else {
// Close the connection if the connection attempt has failed.
inboundChannel.close();
}
});
}
HexDumpBackendHandler
@Override
public void channelRead(final ChannelHandlerContext ctx, Object msg) {
…
RequestDetails requestDetails = inboundChannel.attr(utils.REQUEST_ATTRIBUTE).getAndRemove();
…
}
我对此的解决方案(解决方案?)如下。我使用的协议无法保证每个请求的全局唯一标识符,但它确实在TCP连接中唯一标识了请求。
所以下面的组合使我可以创建一个ConcurrentHashMap,其以下为键主机+临时端口+连接本地的标识符
这项工作适合我的情况。我敢肯定他们在Netty框架本身中解决问题的其他方法