【发布时间】:2010-07-31 18:14:20
【问题描述】:
我的目标是从客户端收集数据,这些客户端将数据发送到 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();
}
}
}
}
我已经调试过了:变量“sentences”总是得到正确的数据,但是 data.append(sentence);不做任何事情。它只是不附加数据。为什么会这样?
【问题讨论】:
-
您是否使用调试器在追加之前/之后查看了字符串缓冲区??
-
还有一个错误。您的字符串缓冲区变量需要在附加新数据之前被清除。可能是 data.setLength(0) 然后开始追加新数据。但这并不能解决你原来的问题
-
我认为这与您的问题无关,但始终使用 new String(...) 和 String.getBytes(...) 指定一个字符集。我建议始终使用“UTF-8”。另外,您的行 sendData = new byte[1024];没用。 sendData 将是 data.toString() 方法返回的任何内容,可能大于 1024 字节。据推测,这是您代码中的错误。
标签: java multithreading udp