网络相关请求和响应

问题描述 投票:0回答:1

我想写一个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();
…
}
java proxy netty
1个回答
0
投票

我对此的解决方案(解决方案?)如下。我使用的协议无法保证每个请求的全局唯一标识符,但它确实在TCP连接中唯一标识了请求。

所以下面的组合使我可以创建一个ConcurrentHashMap,其以下为键主机+临时端口+连接本地的标识符

这项工作适合我的情况。我敢肯定他们在Netty框架本身中解决问题的其他方法

© www.soinside.com 2019 - 2024. All rights reserved.