【发布时间】:2012-01-03 23:17:14
【问题描述】:
我有一个使用数据报套接字交换消息的服务器-客户端应用程序。我最初将缓冲区大小设置为 1024 字节,因为我不知道消息的长度。当我发送小于 1024 字节的内容时,我的字符串的其余部分显示为一些奇怪的字符(空字符或者我不确定它们是如何被调用的)。 这是一个屏幕:
客户端代码:
byte[] buf = ("This is another packet.\n").getBytes();
DatagramPacket packet = new DatagramPacket(buf, buf.length, inetAddress, serverport);
socket.send(packet)
服务器代码:
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
【问题讨论】:
-
你说的是
BufferedReader的大小还是别的什么? -
IMO,最好更新您的 OP,而不是在 cmets 中发布您的代码。
-
@MikeMokkas UDP 数据报的最大大小为 65k。 short 给出的范围是 0 到 32 767(仅仅是因为您不能有负数据大小),并且我们没有任何大于 32767 的消息。如果有,则附加一个 4 字节整数。这仍然会为您留下 64k - 4 字节的可用数据传输空间。
-
@ThomasOwens,您可以使用
char作为无符号 16 位值。 -
@Thomas:你在这里混淆了很多零碎的东西。首先也是最重要的是Java DatagramPackets 知道它们的长度,因此绝对不需要在数据包的有效负载中对其进行编码。除此之外,没有理由考虑 Java 数据类型的“签名性”来决定是否需要 2 个字节(最多 64kB)或 4 个字节(最多 4TB)来编码数据包长度。最后,UDP数据报的最大载荷长度(Java DatagramSocket BTW不限于UDP)既不是65也不是64kB,而是受到IP数据包长度限制。
标签: java sockets networking udp datagram