gpt4 book ai didi

Java UDP数据包大小

转载 作者:搜寻专家 更新时间:2023-10-31 08:23:23 25 4
gpt4 key购买 nike

在 Java 中,单个字符是 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);

控制台显示:

GET: Test...........................................................................

(点代表空白)

最佳答案

That means if I want to send an UDP packet to a server, I must find the length of the string (for example) and multiply by 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();
}

I have read somewhere that I can send over than 65k data, because IPv4 protocol automatically divides the packet into pieces than the receiver will merge them. Is this true?

TCP 是这样。我建议您在您的情况下使用 TCP,而不是 UDP。

关于Java UDP数据包大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14683267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com