Mina发送频率过快,导致接收到的数据包被合并

Mina transmission frequency is too fast, causing received packets are merged

我用的是Apache Mina服务器端和客户端通信的框架,我在测试程序的时候,发现如果我的传输频率太快,收到的包会合并成一个大包,应该是每个单独的包。

我的客户端曾经发送消息,代码如下:

public static void main(String[] args) {
        // IoConnector instance
        IoConnector connector = new NioSocketConnector();
        connector.setConnectTimeoutMillis(3000); // 连接超时时间

        // configure filters
        // connector.getFilterChain().addLast("coderc", new ProtocolCodecFilter(
        // new TextLineCodecFactory(Charset.forName("UTF-8"))));
        DefaultIoFilterChainBuilder builder = (DefaultIoFilterChainBuilder) connector.getFilterChainBuilder();
        Map<String, IoFilter> filters = new LinkedHashMap<>();
        filters.put("protocolCodecFilter", new ProtocolCodecFilter(new TcpCodecFactory()));
       
        filters.put("executor", new ExecutorFilter());
        filters.put("loggingFilter", new LoggingFilter());
        builder.setFilters(filters);
        connector.setFilterChainBuilder(builder);
        // set handler
        connector.setHandler(new TcpServerHandler());

        // connect to the server
        ConnectFuture future = connector.connect(new InetSocketAddress(address, port));
        future.awaitUninterruptibly(); // waiting for connection

        IoSession session = future.getSession();
        byte[] data = new byte[10];
        for (int i = 0; i < 100; ++i) {
            data[0] = (byte)i;  // first byte means the message sequence number
            for (int j = 1; j < 10; ++j) {
                data[j] = (byte) (j + 10);
            }
            // try {
            //     Thread.sleep(100);
            // } catch (InterruptedException e) {
            //     e.printStackTrace();
            // }
            session.write(data);
        }
        session.getCloseFuture().awaitUninterruptibly();    // wait for close
        connector.dispose();
        
    }    

当我评论睡眠代码时,这意味着我经常发送消息,我收到的消息如下:

消息序号为0,1,6...,如果我取消注释睡眠代码,消息序号为0,1, 2、3...

有什么区别?如何避免快速传输中的混包?

您使用的是 TCP 套接字,它是一个流通道,而 UDP 是一个消息通道。您的消息正在合并,因为这就是 TCP 在所有平台上的工作方式,以有效地创建尽可能少的网络数据包。

除非消息乱序,否则这是预期的行为。