【问题标题】:Netty WebSocket - to drive "operationComplete" of "ChannelFuture" correctlyNetty WebSocket - 正确驱动“ChannelFuture”的“operationComplete”
【发布时间】:2024-01-19 00:54:01
【问题描述】:

我正在编写一个应用程序,通过 WebSocket 将小文件(~2kb)从 Netty 服务器发送到客户端。

为了测试文件是否发送成功,我做了如下测试。

  1. 客户端连接到服务器。
  2. 设置为从客户端计算机上的服务器丢弃所有数据包。
  3. 服务器向客户端发送文件。
  4. 在服务器上检查“ChannelFuture”的结果。

当我在这个测试中发送一个 ~2kb 的文件时,我立即从“future.isSuccess()”和“future.isDone()”得到了正确的结果,即使客户端无法接收到该文件。

我对较大的文件重复了这个测试。我发现如果文件大小大于~7kb,“ChannelFuture future”将等待传输反馈。这是我预期的结果。

我正在使用 Netty3.6.1,我的应用程序是基于“org.jboss.netty.example.http.websocketx.server”构建的。

这是我的代码的一部分:

ChannelBuffer cb = ChannelBuffers.copiedBuffer(myfile_byteArray);   
ChannelFuture result = ctx.getChannel().write( new BinaryWebSocketFrame( cb ) );
result.addListener(new ChannelFutureListener() {
            public void operationComplete(ChannelFuture future) throws Exception {
                if (future.isSuccess()){  
                    System.err.println("future.isSuccess()");  
                }  
                if (future.isDone()){  
                    System.err.println("future.isDone()");  
                }  
                if (future.isCancelled()){  
                    System.err.println("future.isCancelled()");  
                }  
            }
        });

有谁知道我怎样才能让“ChannelFuture”对小文件正常工作?

非常感谢!

【问题讨论】:

    标签: websocket netty


    【解决方案1】:

    只有当数据可以写入远程对等方时,才会通知 ChannelFuture。因此,如果它被通知,那么另一个对等方接收到的数据没有问题。这适用于所有大小的数据。

    【讨论】:

    • 我的测试有问题吗?发送小文件时,ChannelFuture 在我的应用程序中无法正常工作......如果连接断开,我如何使用 ChannelFuture 进行测试?非常感谢!
    • 我认为当 Netty 将数据写入操作系统缓冲区时会通知 ChannelFuture。如果没有明确的应用程序级确认消息,应用程序不可能确定数据已到达远程对等方。它可能似乎在等待更大的消息被传输,但我怀疑这只是基于网络条件的巧合。
    • 感谢您解释 ChannelFuture 的详细信息。添加确认消息似乎是解决我的问题的唯一方法。再次感谢您的帮助!