Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Proxy 在Netty 4.x中阻止tcp数据包接收_Proxy_Netty - Fatal编程技术网

Proxy 在Netty 4.x中阻止tcp数据包接收

Proxy 在Netty 4.x中阻止tcp数据包接收,proxy,netty,Proxy,Netty,如何在netty 4.x中阻止netty向客户端发送ACK响应 我试图在netty中控制TCP数据包接收速度,以便将这些数据包转发到另一台服务器。Netty会立即接收所有客户端数据包,但Netty需要更多的时间将它们发送出去,所以客户端认为在发送给Netty后就完成了 所以,我想知道当netty将之前接收到的数据包转发到另一台服务器时,如何阻止接收到的数据包 不确定是否真正理解您的问题。因此,我尝试重新表述: 我假设您的Netty服务器充当客户端和另一台服务器之间的代理 我假设您要做的是,仅当

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

我试图在netty中控制TCP数据包接收速度,以便将这些数据包转发到另一台服务器。Netty会立即接收所有客户端数据包,但Netty需要更多的时间将它们发送出去,所以客户端认为在发送给Netty后就完成了


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

不确定是否真正理解您的问题。因此,我尝试重新表述:

  • 我假设您的Netty服务器充当客户端和另一台服务器之间的代理
  • 我假设您要做的是,仅当您真正将转发的数据包发送到最终服务器(不一定由最终服务器接收,但至少通过Netty代理发送)时,才将ack发送回客户端
如果是这样,那么您应该使用转发数据包的未来来使用ack进行响应,例如(伪代码):

其中:

  • channelOrCtxToFinalServer
    是从Netty代理连接到远程最终服务器的
    ChannelHandlerContext
    Channel
    之一
  • ctxOfClientChannel
    是来自Netty处理程序的当前
    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();
                    }
                }
            });
        }
    }
    
  • 最后,使用完全相同的逻辑将最终确认添加到客户端(确认当然取决于您的协议):(请参阅和)


谢谢弗雷德里克~你正确地理解了我的观点。但你的建议并没有解决我的问题。原谅我的英语不好。我有一个大文件需要上传(超过6000kb)。首先,客户机(三方客户机)在1秒内将其发送给netty,进度条在客户机上显示为100%。我认为netty接受所有文件并将它们缓存在缓冲区中。然后,开始转发。最后,向clent发送服务器响应。所以,客户将在很长一段时间内100%等待响应。我希望客户机耐心地转发每个数据包,而不是一次发送所有文件。也许我应该首先问:你们的处理器和编码器/解码器是什么?这个问题的原因是:超过6000kb的数据包是通过多个数据包发送的,因此您当然也可以逐个数据包管理转发到下一个服务器的数据包。但除此之外,您还可以管理Netty服务器的“可读”属性,这样一旦它得到一个数据包,它将禁用传入通道(客户端通道)的读取过程,直到它完成对最终服务器的写入,然后重新激活客户端通道的可读性。这样做,你可以管理数据包接收的速度。我编辑我的answear,用Netty的代理示例解释我的想法。。。希望它能帮助你们…我已经尝试使用“SetAutoRead”,我可以阻止netty发送缓冲区给我的处理程序。但我无法阻止客户端向netty发送数据包。也许客户把它们送到了内蒂的缓存里“可读”属性只是阻止缓存发送缓冲区到处理程序。我认为netty在底层自动接收数据包。应用层协议将一次发送包含多个数据包的所有数据,例如HttpRequest、POP3,它们是不可控的吗?顺便说一句,我使用了许多编码和解码缓冲区处理程序。我需要把密码发给你吗?非常感谢:PAuto_read阻止客户端向Netty服务器发送任何内容,因为它会阻止读取操作,因此会阻止来自客户端的传入消息。请参阅自动阅读的其他问题:
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);
    }
}