清除报缓冲器中的Java
问题描述:
所以我从网上得到这个简单的UDP客户端/服务器代码,和它的作品。然而,当我输入的东西比我在它之前输入的东西短时,我会留下剩余的字符。例如,如果我先进入:清除报缓冲器中的Java
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);
}
}
}
答
你并不需要清除字节数组,但你需要采取的长度的一些通知后的所述接收的DatagramPacket经由getLength()
方法;例如:
new String(packet.getData(), packet.getOffset(), packet.getLength());
你在服务器上正确地做到了这一点,但在客户端却没有这样做。
您还需要调用之前重置长度。否则DatagramPacket
将继续萎缩到迄今收到的最小数据包的长度。
它的工作,谢谢!我如何重置长度? – user1440061
DatagramPacket.setLength()? – EJP
@ user1440061您通过重置长度: 'receivePacket.setLength(receiveData.getLength())' –