如何在使用UDP的java网络中使用flush()

如何在使用UDP的java网络中使用flush(),java,networking,Java,Networking,我试图使用基本UDP在java中进行双向服务器-客户机通信,但问题是,如果我输入字符串,它会溢出,因此我认为使用flush()刷新缓冲区是好的,但我不知道如何使用此函数 UDP中的服务器代码 import java.io.*; import java.net.*; class servee { public static void main(String args[]) throws Exception { DatagramSocket server

我试图使用基本UDP在java中进行双向服务器-客户机通信,但问题是,如果我输入字符串,它会溢出,因此我认为使用flush()刷新缓冲区是好的,但我不知道如何使用此函数

UDP中的服务器代码

    import java.io.*;
import java.net.*;

class servee
{
   public static void main(String args[]) throws Exception
      {
         DatagramSocket serverSocket = new DatagramSocket(9876);
            byte[] receiveData = new byte[1024];
            byte[] sendData = new byte[1024];
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));  
            while(true)
               {
                  DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                  serverSocket.receive(receivePacket);
                  String sentence = new String( receivePacket.getData());
                  System.out.println("RECEIVED: " + sentence);
                  InetAddress IPAddress = receivePacket.getAddress();
                  int port = receivePacket.getPort();
                  String servo = br.readLine();
          if(new String(servo).equals("bye")==true)
            break;
                  sendData = servo.getBytes();
                  DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
                  serverSocket.send(sendPacket);
          sendData=null;
               }

      }
}
    import java.io.*;
import java.net.*;

class clientee
{
   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];
      while(true)
      {
      String sentence = inFromUser.readLine();
      if(new String(sentence).equals("bye")==true)
    break;
      sendData = sentence.getBytes();
      DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
      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);
      }

   }
}
UDP中的客户端代码

    import java.io.*;
import java.net.*;

class servee
{
   public static void main(String args[]) throws Exception
      {
         DatagramSocket serverSocket = new DatagramSocket(9876);
            byte[] receiveData = new byte[1024];
            byte[] sendData = new byte[1024];
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));  
            while(true)
               {
                  DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                  serverSocket.receive(receivePacket);
                  String sentence = new String( receivePacket.getData());
                  System.out.println("RECEIVED: " + sentence);
                  InetAddress IPAddress = receivePacket.getAddress();
                  int port = receivePacket.getPort();
                  String servo = br.readLine();
          if(new String(servo).equals("bye")==true)
            break;
                  sendData = servo.getBytes();
                  DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
                  serverSocket.send(sendPacket);
          sendData=null;
               }

      }
}
    import java.io.*;
import java.net.*;

class clientee
{
   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];
      while(true)
      {
      String sentence = inFromUser.readLine();
      if(new String(sentence).equals("bye")==true)
    break;
      sendData = sentence.getBytes();
      DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
      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);
      }

   }
}
服务器的输出

客户端的输出

您不能将
flush()
DatagramSocket
DatagramPacket
结合使用。没有什么可冲洗的。调用
send()
时,将发送数据。当您调用
receive()
时,您将获得下一个可用数据包

刷新仅适用于在执行基于流的输出时写入
OutputStream
Writer
(或子类型)的情况



提示:如果服务器没有看到客户机发送的数据包,或者反之亦然,则它们可能在传输过程中丢失,或者由于拥塞而被接收方丢弃。UDP不提供可靠的消息传递。

您的代码假定
DatagramPacket.getBytes()
仅返回发送或接收的数据-但是它返回构建DatagramPacket时使用的整个数组。当您对许多接收重复使用相同的
sendData
阵列时,这会成为一个问题,因为当您接收的新数据比以前接收的数据短时,旧数据将保留在阵列中

您的客户端代码必须说明接收数据的长度:

String modifiedSentence = new String(receivePacket.getData(),0, receivePacket.getLength());
您的服务器代码必须执行相同的操作:

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

您不能也不需要刷新DatagramSOcket,请清楚地描述您的问题。@否如果我从服务器发送消息“oi”,它将在客户端显示为“oine”所以我需要刷新缓冲区中的垃圾值,但我确实收到了我上次发送的字符串的一部分,你能为此提出一些建议吗?谢谢@nos,这对我真的很有帮助。