Proxy 在Netty 4.x中阻止tcp数据包接收
如何在netty 4.x中阻止Proxy 在Netty 4.x中阻止tcp数据包接收,proxy,netty,Proxy,Netty,如何在netty 4.x中阻止netty向客户端发送ACK响应 我试图在netty中控制TCP数据包接收速度,以便将这些数据包转发到另一台服务器。Netty会立即接收所有客户端数据包,但Netty需要更多的时间将它们发送出去,所以客户端认为在发送给Netty后就完成了 所以,我想知道当netty将之前接收到的数据包转发到另一台服务器时,如何阻止接收到的数据包 不确定是否真正理解您的问题。因此,我尝试重新表述: 我假设您的Netty服务器充当客户端和另一台服务器之间的代理 我假设您要做的是,仅当
netty
向客户端发送ACK响应
我试图在netty中控制TCP数据包接收速度,以便将这些数据包转发到另一台服务器。Netty会立即接收所有客户端数据包,但Netty需要更多的时间将它们发送出去,所以客户端认为在发送给Netty后就完成了
所以,我想知道当netty将之前接收到的数据包转发到另一台服务器时,如何阻止接收到的数据包 不确定是否真正理解您的问题。因此,我尝试重新表述:
- 我假设您的Netty服务器充当客户端和另一台服务器之间的代理
- 我假设您要做的是,仅当您真正将转发的数据包发送到最终服务器(不一定由最终服务器接收,但至少通过Netty代理发送)时,才将ack发送回客户端
是从Netty代理连接到远程最终服务器的channelOrCtxToFinalServer
或ChannelHandlerContext
之一Channel
是来自Netty处理程序的当前ctxOfClientChannel
,它在ChannelHandlerContext
方法中从客户端接收数据包public void channelRead(ChannelHandlerContext ctxOfClientChannel,Object packetToForward)
编辑: 对于大文件传输问题,您可以看看代理示例 尤其要注意以下几点:
- 使用相同的逻辑,注意从客户端逐个接收数据:
yourServerBootstrap..childOption(ChannelOption.AUTO_READ, false); // Allow to control one by one the speed of reception of client's packets
- 在前端处理程序中:
public void channelRead(final ChannelHandlerContext ctx, Object msg) { if (outboundChannel.isActive()) { outboundChannel.writeAndFlush(msg).addListener(new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture future) { if (future.isSuccess()) { // was able to flush out data, start to read the next chunk ctx.channel().read(); } else { future.channel().close(); } } }); } }
- 最后,使用完全相同的逻辑将最终确认添加到客户端(确认当然取决于您的协议):(请参阅和)
public void channelRead(final ChannelHandlerContext ctx, Object msg) {
if (outboundChannel.isActive()) {
outboundChannel.writeAndFlush(msg).addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) {
if (future.isSuccess()) {
// was able to flush out data, start to read the next chunk
ctx.channel().read();
} else {
future.channel().close();
}
}
});
}
}
/**
* Closes the specified channel after all queued write requests are flushed.
*/
static void closeOnFlush(Channel ch) {
if (ch.isActive()) {
ch.writeAndFlush(AckPacket).addListener(ChannelFutureListener.CLOSE);
}
}