我的目标是从客户端收集数据,将数据发送到UDP服务器,将数据串联在一起(仅用于测试)并将整个连接的字符串发送回客户端。 UDPClient和UDPServer之间的通信非常完美。我可以发送数据并接收它。但我想知道为什么我不能连接StringBuffer中的数据,因为当我尝试这个时,客户端总是得到我发送的第一个字符串。无论我发送到服务器的是什么,字符串都不会改变。 以下是服务器类的代码:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UDPServer extends Thread {
DatagramSocket serverSocket;
DatagramPacket receivePacket;
String sentence;
InetAddress IPAddress;
StringBuffer data = new StringBuffer();
public UDPServer() throws SocketException {
serverSocket = new DatagramSocket(9876);
}
public void run() {
while (true) {
byte[] receiveData = new byte[1024];
byte[] sendData = new byte[1024];
receivePacket = new DatagramPacket(receiveData, receiveData.length);
try {
serverSocket.receive(receivePacket);
} catch (IOException e) {
System.out.println("receive....");
e.printStackTrace();
}
sentence = new String(receivePacket.getData());
IPAddress = receivePacket.getAddress();
int port = receivePacket.getPort();
data.append(sentence);
sendData = data.toString().trim().getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData,
sendData.length, IPAddress, port);
try {
serverSocket.send(sendPacket);
} catch (IOException e) {
System.out.println("send...");
e.printStackTrace();
}
}
}
}
我已经调试过它:变量“sentence”总是得到正确的数据,但行data.append(句子);什么都不做它只是不附加数据。为什么会这样?
答案 0 :(得分:5)
您的问题与StringBuffer无关,但使用此行:
sentence = new String(receivePacket.getData());
当发送方的发送量小于缓冲区大小时,您将整个缓冲区转换为字符串。因此,您在结果字符串中得到一堆零字节,这会导致您打印的数据被截断。
您需要根据实际读取的数据截断接收缓冲区:
sentence = new String(receivePacket.getData(), 0, receivePacket.getLength());