我有一个服务器客户端应用程序,它使用数据报套接字来交换消息。我最初将缓冲区大小设置为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);
答案 0 :(得分:9)
socket.receive(packet);
byte[] data = new byte[packet.getLength()];
System.arraycopy(packet.getData(), packet.getOffset(), data, 0, packet.getLength());
答案 1 :(得分:4)
DatagramPacket.getLength()
返回接收数据包的实际长度。除非您使用非零offet创建数据包,否则表示数据位于{0..getLength()-1}
。
请注意,这意味着您创建的DatagramPacket
原始长度已丢失,这反过来意味着您必须每次接收使用新的DatagramPacket
,或者至少重新初始化其数据缓冲区通过setData()
。否则,DatagramPacket
将缩小到收到的最小数据包的大小。
答案 2 :(得分:1)
您必须检查packet.getOffset()
以查找缓冲区中接收数据的起始位置,并packet.getLength()
获取数据的长度(以字节数表示)。
您还应该考虑,如果收到的数据包太大而无法容纳在提供的缓冲区中(在您的情况下> 1024字节),则会丢弃额外的数据。除非你必须非常小心内存使用,否则你应该使用更大的缓冲区来确保整个数据包都适合。在UDP的情况下,最大数据包大小为64kB。
答案 3 :(得分:1)
好的,所以我想出了一个适合我的解决方案:
public String getRidOfAnnoyingChar(DatagramPacket packet){
String result = new String(packet.getData());
char[] annoyingchar = new char[1];
char[] charresult = result.toCharArray();
result = "";
for(int i=0;i<charresult.length;i++){
if(charresult[i]==annoyingchar[0]){
break;
}
result+=charresult[i];
}
return result;
}
修改强>
使用ByteArrayOutputStream
存在更好的解决方案,可在此处找到:How to reinitialize the buffer of a packet?