我正在尝试发送UDP数据报(包含协议缓冲区消息)并获取消息太长的异常:
java.io.IOException: Message too long
at java.net.PlainDatagramSocketImpl.send(Native Method)
at java.net.DatagramSocket.send(DatagramSocket.java:625)
我设置了发送缓冲区大小,并检查了getBufferSize()的返回值,它大于消息:
byte[] b = msg.toByteArray();
System.out.println( "Serialised message in " + b.length + " bytes (max length: " + network.getSendBufferSize() + ")");
DatagramPacket p = new DatagramPacket( b, b.length, host, port );
network.send( p );
输出:
VM version: 16.3-b01-279
Runtime version: 1.6.0_20-b02-279-9M3165
Vendor: Apple Inc.
Serialised message in 69424 bytes (max length: 531075)
Problem sending packet: java.io.IOException: Message too long
我能理解它是否拒绝设置一个大尺寸的缓冲区,但它似乎设置了我要求的任何东西,然后不尊重它。
这是在OSX上;我已经尝试了1.6和1.5
答案 0 :(得分:10)
IPv4中UDP数据报有效负载的限制是65535-28 = 65507字节,实际限制是路径的MTU,如果幸运的话,更像是1460字节。
< / LI>当UDP被分段时,如果片段丢失,则丢失数据报,因为没有重传。
使用TCP。
答案 1 :(得分:4)
UDP数据报不能大于64K
答案 2 :(得分:1)
UDP的最大限制为64K。您的邮件已超过此限制。
此外,你不应该使用UDP来处理这么大的消息。当UDP被分段时,如果一个段丢失,它必须重新传输整个东西。使用TCP。