在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,那么增益极限是多少? 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协议(protocol)会自动将数据包分为几部分,而不是接收者将其合并。这是真的?

为什么我将空白带入缓冲区?我已经编写了一个客户端和一个服务器应用程序,并且正在使用250大小的缓冲区。如果我要发送一个单词,例如“Test”,它的长度为8个字节,那么我在“Test”单词之后会得到一个很长的空格:
byte[] buff = new byte[250];
packet = new DatagramPacket(buff, buff.length);
socket.receive(packet);
System.out.println("GET: " + buff);

控制台显示:



(点代表空白)

最佳答案



否。String.getBytes()已经分配了正确长度的适当数组:

byte[] buff = string.getBytes();

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

附带说明一下,您应该避免使用无参数的String.getBytes(),因为它使用平台的默认字符集将String转换为字节数组。最好显式地传递编码:
byte[] buff = null;
try {
   buff = string.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
   e.printStackTrace();
}



对于TCP来说是正确的。我建议您使用TCP,而不是UDP。

09-11 03:28
查看更多