Java datagramsocket 收到不完整的消息

Java datagramsocket receives incomplete message

我正在开发一个小程序,使用 udp.Most 我发送的字符串可以通过网络传输字符串命令,但是有一个特定的字符串没有完全接收到 received.I 不知道是不是有问题的发送方或接收方。 正确接收的字符串示例:"connect 123.123.1.1" 未正确接收的字符串:"a/name/123.123.1.1" 接收到的内容:"a/name/123." 发送代码:

public  void sendToAll(String massage) {
    //send massage to all clients

    byte[] sendData = new byte[1500];
    //clients is a linked list
    for (int i = 0; i < clients.size(); i++) {
        String ip = clients.get(i).ip;
        sendData = massage.getBytes();
        try {
            InetAddress IPAddress = InetAddress.getByName(ip);
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 11222);
            clientSocket.send(sendPacket);
        } catch (Exception e) {

        }
    }
}

领取码:

byte[] receiveData = new byte[1500];
while (true) {
      DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
      serverSocket.receive(receivePacket);
      String massage = new String(receivePacket.getData());

      //operations for other commands

      if (massage.startsWith("a/")) {

            String[] info = massage.split("/");
            //operations for this command
      }
}

虽然我目前不知道你的问题的原因,但我在你的代码中发现了一些需要寻找的东西,也许其中之一与所有这一切的原因有某种关系。 首先,在 send 方法中,您在将字符串命令编码为字节之前分配一个大小为 1500 的 sendData 缓冲区。它不是必需的,因为方法 getBytes() return 是一个新的字节数组。不过,这真的应该不会造成任何问题。

更让我担心的是接收方法,那一行:

String massage = new String(receivePacket.getData());

根据 java api 文档,数据包的方法 getData() 将 return 一个缓冲区传递给它。该缓冲区有 1500 个字节长,尝试以这种方式使用 String 构造函数会导致占用整个 1500 个字节。它可能应该是:

String massage = new String(receivePacket.getData(), 0, receivePacket.getLength());