【发布时间】:2015-08-13 16:55:02
【问题描述】:
如何阻止 netty 在 netty 4.x 中向客户端发送 ACK 响应?
我正在尝试控制 netty 中的 TCP 数据包接收速度,以便将这些数据包转发到另一台服务器。 Netty立即收到所有客户端数据包,但是netty需要更多时间将它们发送出去,所以客户端认为它发送到netty后就完成了。
所以,我想知道当 netty 将之前收到的数据包转发到另一台服务器时,如何阻止收到的数据包。
【问题讨论】:
如何阻止 netty 在 netty 4.x 中向客户端发送 ACK 响应?
我正在尝试控制 netty 中的 TCP 数据包接收速度,以便将这些数据包转发到另一台服务器。 Netty立即收到所有客户端数据包,但是netty需要更多时间将它们发送出去,所以客户端认为它发送到netty后就完成了。
所以,我想知道当 netty 将之前收到的数据包转发到另一台服务器时,如何阻止收到的数据包。
【问题讨论】:
不确定是否真正理解您的问题。所以我尝试重新制定:
如果是这样,那么你应该使用转发数据包的future来回应ack,例如(伪代码):
channelOrCtxToFinalServer.writeAndFlush(packetToForward).addListener(new ChannelFutureListener() {
public void operationComplete(ChannelFuture future) {
// Perform Ack write back
ctxOfClientChannel.writeAndFlush(AckPacket);
}
});
地点:
channelOrCtxToFinalServer 是从 Netty 代理连接到远程最终服务器的 ChannelHandlerContext 或 Channel 之一,ctxOfClientChannel 是来自您的Netty 处理程序的当前ChannelHandlerContext,它以public void channelRead(ChannelHandlerContext ctxOfClientChannel, Object packetToForward) 方法从客户端接收数据包。编辑: 对于大文件传输问题,您可以查看代理示例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();
}
}
});
}
}
最后,使用相同的逻辑向您的客户端添加最终确认(确认当然取决于您的协议):(参见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);
}
}
【讨论】: