我试图发送一个UDP数据报(包含协议缓冲区消息)sendBufferSize()并获得消息太长异常之后过长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
谢谢你所有的答案。我希望避免TCP设置的麻烦,但显然这是不可能的。可惜的是,Java并没有正确报告可能的缓冲区大小(也没有API文档)。 – 2010-08-05 10:44:23
这里没有证据表明Java不'正确报告可能的缓冲区大小'。首先没有实际做到这一点的API。只有实际的发送缓冲区大小:*底层操作系统*可以自由修改所要求的缓冲区大小,向上或向下;这不是UDP有效负载大小的唯一限制。 – EJP 2011-07-06 22:37:18
@EJP:getSendBufferSize的文档说“为此DatagramSocket获取SO_SNDBUF选项的值,即平台用于在此DatagramSocket上输出的缓冲区大小。”把这个解释为可以使用的实际大小似乎并不合理。我发现那里的“平台”非常模糊,并将其作为报告底层操作系统要做什么的报道来阅读。我假定setSendBufferSize并不总是给你所要求的大小,但getSendBufferSize会告诉你你实际上可能拥有了什么。虽然谢谢澄清! – 2011-08-30 21:29:54