阻止Netty 4.x中的TCP数据包接收 [英] Blocking tcp packet receiving in Netty 4.x

查看:20
本文介绍了阻止Netty 4.x中的TCP数据包接收的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何阻止netty向Netty 4.x中的客户端发送ACK响应?

我正在尝试控制网络中的TCP包接收速度,以便将这些包转发到另一台服务器。Netty立即收到所有客户端数据包,但Netty需要更多时间将其发送出去,因此客户端在发送到Netty后认为它已经完成。

所以,我想知道当网络将之前收到的数据包转发到另一台服务器时,如何阻止收到的数据包。

推荐答案

不确定是否真正理解您的问题。所以我试着重新表述:

  • 我认为您的Netty服务器正在充当客户端和另一台服务器之间的代理。
  • 我想您要做的是,只有当您真正将转发的数据包发送到最终服务器(不一定由最终服务器接收,但至少通过Netty代理发送)时,才将ACK发送回客户端。

如果是,那么您应该使用转发的数据包的未来来响应ACK,例如(伪代码):

channelOrCtxToFinalServer.writeAndFlush(packetToForward).addListener(new ChannelFutureListener() {
  public void operationComplete(ChannelFuture future) {
    // Perform Ack write back
    ctxOfClientChannel.writeAndFlush(AckPacket);
  }
});

其中:

  • channelOrCtxToFinalServer是从Netty代理连接到远程最终服务器的ChannelHandlerContextChannel之一
  • ctxOfClientChannelChannelHandlerContext方法中从客户端接收数据包的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当然取决于您的协议):(请参阅herehere)

    /**
     * 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数据包接收的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆