当前位置: 首页 > 知识库问答 >
问题:

netty拆分的套接字消息

逑彬炳
2023-03-14

我编写了一个基于Netty4的REST服务器。客户端处理程序如下所示。

netty提供的msg中的bytebuffer容量各不相同。当客户端消息大于缓冲区时,消息将被拆分。我发现每个片段都调用channelRead和ChannelReadComplete。我通常看到的是ByteBuf在512左右,message在600左右。对于前512个字节,我得到一个channelRead,然后是一个ChannelReadComplete,然后是另一个channelRead,对于剩下的100个字节,还有一个ChannelReadComplete--2个消息,而不是1个。

public class ClientHandler extends ChannelInboundHandlerAdapter {
    ....
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        Report.debug("Read from client");
        ByteBuf buf = (ByteBuf) msg;
        String contents = buf.toString(io.netty.util.CharsetUtil.US_ASCII);
        ReferenceCountUtil.release(msg);

        ClientConnection client = ClientConnection.get(ctx);
        if (client != null) {
            client.messageText(contents);   // adds text to buffer
            return;
        }
        ((parse serial number from contents, process registration))
        ClientConnection.online(serialNumber, ctx);     // register success, create the client object
    }

    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        ClientConnection client = ClientConnection.get(ctx);
        if (client == null) 
            Report.debug("completed read of message from unregistered client");
        else {
            Report.debug("completed read of message from client " + client.serialNumber());
            String contents = client.messageText();
            ... ((process message))
        }
    }
 }

共有1个答案

井轶
2023-03-14

channelReadComplete不在每个ChannelRead之后调用。netty事件循环将从NIO套接字读取并激发多个channelRead,直到没有更多的数据要读取或应该放弃为止,然后激发channelReadComplete。

 类似资料:
  • Netty TCP Server在端口处运行,接收格式的数据。它使用Marine API库将胡言乱语转换为需要从套接字输入流的有意义的信息。 如何获得正在使用的netty服务器端口的输入流?

  • 创建套接字并建立连接后,我使用BufferedReader和PrintWriter从套接字进行写/读操作。 当我用完插座后,我就把它关上。 这将导致发送一个TCP fin,并留下一个半开的传输控制协议。有什么方法可以检测客户端/服务器是否关闭了连接?

  • 我有几个关于Java套接字编程的问题。 > 我有一个进程需要跨多个套接字连接发送一条消息。现在我有如下内容 这是原子能的吗?或者,在并发环境中,它们是否有可能在几乎相同的时间发送? 在并发环境中,套接字连接(设置为PrintWriter)的输出流是否已经互斥?比如说,两个线程想要同时写入PrintWriter。如果没有在PrintWriter上显式互斥,流的任何输出都会被弄乱吗?

  • 我刚刚开始学习Netty,想慢慢来真正理解它是如何工作的。我有一个基于独立套接字测试程序的初始用例: 从客户端连接到服务器时,立即发送消息并处理响应 很简单...或者我是这么想的。我已经看了好几天了,不太明白为什么它的表现不如预期。 这是最初的测试程序,它再次简单地连接到远程服务器,并立即向服务器写入字节缓冲区。然后服务器立即发送一个ack响应,该响应被写入控制台。 我用Netty做了同样的测试,

  • 已经问过类似的问题,但是删掉了,既然以为我修好了,但是我错了。 我在生产中为我的一个web项目使用Play framework。有时播放不呈现主页面或不返回一些静态内容文件。 最初应用程序运行良好,它必须工作5-7天,我可以看到这个问题。很难重现,它发生了15次中的1次,我不得不删除缓存数据和重新加载页面。(按下FF中的CRTL-F5)。问题可以在不同机器和操作系统的大多数浏览器中重现。最初,我认

  • 我正试图用Netty开发以下用例: 客户端连接到上的中间服务器(端口 8900)。 客户端将具有配置的处理器请求发送到另一台计算机。 第 3 台计算机根据配置启动处理器。 处理器连接到根据配置中标识的端口(例如端口 8901)启动处理器的同一服务器。 服务器现在根据两者之间共享的匹配唯一哈希绑定客户端和处理器。 将为每个新的客户端连接创建新处理器。 客户端连接不是问题。我有一个处理这些请求的客户端