在Java中清空数据报缓冲区

6
所以我从互联网上得到了这个简单的UDP客户端/服务器代码,并且它能够正常运行。然而,当我输入比之前输入的更短的内容时,我会得到剩余的字符。例如,如果我先输入:
kitty

然后输入:
cat

第二个印刷品的内容为:
catty

我一直在查看其他遇到类似问题的人,他们大多数都通过清除字节数组来解决问题。然而,如果我尝试实现他们的答案,它并不能解决我的问题。我需要做什么,以及(可能更重要的是)代码中应该放在哪里?这是代码:
客户端:
import java.io.*;
import java.net.*;

class UDPClient
 {
    public static void main(String args[]) throws Exception
    {
       BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
       DatagramSocket clientSocket = new DatagramSocket();
       InetAddress IPAddress = InetAddress.getByName("localhost");
       byte[] sendData = new byte[1024];
       byte[] receiveData = new byte[1024];
       String sentence = inFromUser.readLine();
       sendData = sentence.getBytes();
       DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 20700);
       clientSocket.send(sendPacket);
       DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
       clientSocket.receive(receivePacket);
       String modifiedSentence = new String(receivePacket.getData());
       System.out.println("FROM SERVER:" + modifiedSentence);
       clientSocket.close();
    }
 }

服务器:
import java.io.*;
import java.net.*;
import java.util.*;

class UDPServer
 {
    public static void main(String args[]) throws Exception
       {
          DatagramSocket serverSocket = new DatagramSocket(21200);
          byte[] receiveData = new byte[1024];
          byte[] sendData = new byte[1024];
          while(true)
                {
                   DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                   serverSocket.receive(receivePacket);
                   String sentence = new String( receivePacket.getData(), 0, receivePacket.getLength());
                   System.out.println("RECEIVED: " + sentence);
                   InetAddress IPAddress = receivePacket.getAddress();
                   int port = receivePacket.getPort();
                   String capitalizedSentence = sentence.toUpperCase();
                   sendData = capitalizedSentence.getBytes();
                   DatagramPacket sendPacket =  new DatagramPacket(sendData, sendData.length, IPAddress, port);
                   serverSocket.send(sendPacket);
                }
       }
 }
2个回答

10

不需要清除字节数组,但是在接收后需要通过getLength()方法注意DatagramPacket的长度;例如:

new String(packet.getData(), packet.getOffset(), packet.getLength());

你在服务器上做得正确,但在客户端没有这样做。

在调用receive()之前,你还需要重置长度。否则DatagramPacket将保持收到的最小数据包长度。


1
DatagramPacket.setLength()? - user207421
@user1440061,您可以通过以下方式重置长度: receivePacket.setLength(receiveData.getLength()) - Chris.Jenkins
1
@Chris.Jenkins 你的意思是 receivePacket.setLength(receiveData.length) - user207421

0
来自未来的问候(发布后10年)。这篇帖子问了一个我遇到的问题,所以我会告诉你我是如何解决它的。
在提供的代码中,他的客户端关闭了,所以问题不是来自客户端,而是来自服务器端。我使用的解决方案是将...放在其中。
byte[] receiveData = new byte[1024];
byte[] sendData = new byte[1024];

在循环内部。这使它们成为局部变量,所以要小心不要意外地跳过它们。这也可能会影响内存,因为它每次都在删除和重新初始化。
不知道这是否是“最佳实践”,但它能正常工作,对于我的目的来说就足够好了。如果你也有一个重复的客户端,你也可以使用这种方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接