如何摆脱剩余的缓冲区?

我有一个服务器客户端应用程序,它使用数据报套接字来交换消息。 我最初将缓冲区大小设置为1024字节,因为我不知道消息的长度。 当我发送短于1024字节的内容时,我将其余的字符串显示为一些奇怪的字符(空字符或我不确定它们是如何被调用的)。 这是一个屏幕: 字符串缓冲区空字符

客户端代码: byte[] buf = ("This is another packet.\n").getBytes(); DatagramPacket packet = new DatagramPacket(buf, buf.length, inetAddress, serverport); socket.send(packet) 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); byte[] buf = new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, buf.length); socket.receive(packet);

 socket.receive(packet); byte[] data = new byte[packet.getLength()]; System.arraycopy(packet.getData(), packet.getOffset(), data, 0, packet.getLength()); 

DatagramPacket.getLength()返回接收数据包的实际长度。 除非您使用非零offet创建数据包,否则表示数据位于{0..getLength()-1}

请注意,这意味着您创建DatagramPacket的原始长度丢失,这反过来意味着您必须每次接收使用一个新的DatagramPacket ,或者至少通过setData()重新初始化其数据缓冲区。 否则, DatagramPacket将继续缩小到收到的最小数据包的大小。

您必须检查packet.getOffset()以查找缓冲区中接收数据的起始位置,并通过packet.getLength()获取数据的长度(以字节数表示)。

您还应该考虑如果收到的数据包太大而无法容纳在提供的缓冲区中(在您的情况下> 1024字节),则会丢弃额外的数据。 除非你必须非常小心内存使用,否则你应该使用更大的缓冲区来确保整个数据包都适合。 在UDP的情况下,最大数据包大小为64kB。

好的,我想出了一个适合我的解决方案:

  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 

编辑:使用ByteArrayOutputStream存在一个更好的解决方案,可以在这里找到: 如何重新初始化数据包的缓冲区?