本文介绍了阻止Netty 4.x中的TCP数据包接收的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如何阻止netty
向Netty 4.x中的客户端发送ACK响应?
所以,我想知道当网络将之前收到的数据包转发到另一台服务器时,如何阻止收到的数据包。
推荐答案
不确定是否真正理解您的问题。所以我试着重新表述:
- 我认为您的Netty服务器正在充当客户端和另一台服务器之间的代理。
- 我想您要做的是,只有当您真正将转发的数据包发送到最终服务器(不一定由最终服务器接收,但至少通过Netty代理发送)时,才将ACK发送回客户端。
如果是,那么您应该使用转发的数据包的未来来响应ACK,例如(伪代码):
channelOrCtxToFinalServer.writeAndFlush(packetToForward).addListener(new ChannelFutureListener() {
public void operationComplete(ChannelFuture future) {
// Perform Ack write back
ctxOfClientChannel.writeAndFlush(AckPacket);
}
});
其中:
channelOrCtxToFinalServer
是从Netty代理连接到远程最终服务器的ChannelHandlerContext
或Channel
之一- 和
ctxOfClientChannel
是ChannelHandlerContext
方法中从客户端接收数据包的Netty处理程序的当前ChannelHandlerContext
。
编辑:对于大的文件传输问题,您可以查看代理示例here。
尤其要注意以下几点:
使用相同的逻辑,注意从客户端逐个接收数据:
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(); } } }); } }
最后,使用完全相同的逻辑将最终ACK添加到您的客户端(ACK当然取决于您的协议):(请参阅here和here)
/** * 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); } }
这篇关于阻止Netty 4.x中的TCP数据包接收的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!