5

在 Java 中,单个 char 是 16 位,2 个字节。这意味着如果我想向服务器发送一个 UDP 数据包,我必须找到字符串的长度(例如)并乘以 2?

String string = "My awesome string!";
byte[] buff = new byte[ string.length*2 ];
buff = string.getBytes();
...
packet = new DatagramPacket(buff, buff.length, address, port);
socket.send(packet);

UDP数据包限制呢?65k 一包。例如,如果我想向服务器发送数据文件,我必须发送 65/2k 数据!我将 65 分为 2,buff 限制是多少?65/2 还是 65 kb?

例如:

byte[] buff = new byte[ 65000 ]

//file and bufferreader handle
while( ( line = bufferedReader.readLine() ) != null ){
   buff = line.getBytes();
   packet = new DatagramPacket(buff, buff.length, address, port);
   socket.send(packet);
}

我在某处读过我可以发送超过 65k 的数据,因为 IPv4 协议会自动将数据包分成几块,而不是接收器将它们合并。这是真的?

为什么我的缓冲区中有空白?我已经编写了一个客户端和一个服务器应用程序,并且我使用的是 250 大小的缓冲区。如果我要发送一个字,例如“Test”,它有 8 个字节长,我会在“Test”字之后得到一个很长的空白:

byte[] buff = new byte[250];
packet = new DatagramPacket(buff, buff.length);
socket.receive(packet);
System.out.println("GET: " + buff);

控制台说:

获取:测试.................................................. ......................

(点代表空白)

4

2 回答 2

8

这意味着如果我想向服务器发送一个 UDP 数据包,我必须找到字符串的长度(例如)并乘以 2?

String.getBytes(),已经分配了正确长度的正确数组:

byte[] buff = string.getBytes();

然后,buff.length包含适当的长度。请注意,长度取决于用于将字符串转换为字节数组的字符集。

附带说明一下,您应该避免使用无参数,String.getBytes()因为它使用您平台的默认字符集将 转换String为字节数组。更好地明确传递编码:

byte[] buff = null;
try {
   buff = string.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
   e.printStackTrace();
}

我在某处读过我可以发送超过 65k 的数据,因为 IPv4 协议会自动将数据包分成几块,而不是接收器将它们合并。这是真的?

TCP 也是如此。我建议您在您的情况下使用 TCP,而不是 UDP。

于 2013-02-04T09:00:14.057 回答
4

我在某处读过可以发送超过 65k 的数据

不是通过UDP,你不能。IPv4 的绝对最大值为 65507 字节,实际限制为 534 字节。

因为 IPv4 协议会自动将数据包分成几部分,而不是接收者将它们合并。这是真的?

是的,但是重装成功只有TCP保证,并没有提高UDP的上限

使用 TCP。

于 2013-02-04T08:59:34.780 回答