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 在所有平台上的工作方式,以有效地创建尽可能少的网络数据包。
除非消息乱序,否则这是预期的行为。
我用的是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 在所有平台上的工作方式,以有效地创建尽可能少的网络数据包。
除非消息乱序,否则这是预期的行为。