如何在使用UDP的java网络中使用flush()
我试图使用基本UDP在java中进行双向服务器-客户机通信,但问题是,如果我输入字符串,它会溢出,因此我认为使用flush()刷新缓冲区是好的,但我不知道如何使用此函数 UDP中的服务器代码如何在使用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
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,这对我真的很有帮助。