我正在使用UDP传输实现客户端/服务器应用程序。这是我的代码部分:
客户:
InetAddress serverAddress = ...
int serverPort = ...
DatagramSocket socket = new DatagramSocket(9999);
...
String message = "<HELLO>";
byte[] outbuffer = new byte[1000];
outbuffer = message.getBytes();
DatagramPacket packet = new DatagramPacket(outbuffer, outbuffer.length, serverAddress, serverPort);
socket.send(this.packet);
服务器:
DatagramSocket serverSocket = new DatagramSocket(9876);
...
byte[] inbuffer = new byte[1000];
DatagramPacket packet = new DatagramPacket(inbuffer, inbuffer.length);
serverSocket.receive(packet);
String response = new String(packet.getData(), 0, packet.getLength());
System.out.println(response);
if("<HELLO>".equals(response)){
System.out.println("OK");
} else {
System.out.println("ERROR");
}
我的问题如下:如果我在客户端打印出来自客户端的响应字符串,一切看起来都很好(“”)。 但由于某些原因,当我尝试使用.equals或RegExp比较来自服务器的响应时,它会失败!
可能与String编码有关,但我不知道它失败的地点和原因。客户端和服务器现在都在同一主机上运行,因此它可能与JVM差异无关。
答案 0 :(得分:2)
您目前正在使用平台默认编码对字符串进行编码和解码。你绝对不应该那样做。在getBytes()
调用和构造函数调用中指定编码,例如
byte[] outBuffer = message.getBytes("UTF-8");
另请注意,您当前的代码会创建一个长度为1000的字节数组,然后立即抛出它:
byte[] outbuffer = new byte[1000];
// Byte array created on previous line is now useless!
outbuffer = message.getBytes();
......不要这样做。
我们无法从您提供给我们的代码中了解更多信息 - 如果您可以制作简短但完整的程序来证明问题,那将非常有帮助。
对于调试,我建议你记录你收到的数据报包的内容,同时仍然是二进制的。据推测,这不是你期望的,但这无助于展示 的内容。
编辑:这是做工作的一对简短但完整的程序:
import java.net.*;
public class Server {
public static void main(String[] args) throws Exception{
DatagramSocket socket = new DatagramSocket(9999);
byte[] inbuffer = new byte[1000];
DatagramPacket packet = new DatagramPacket(inbuffer, inbuffer.length);
socket.receive(packet);
String response = new String(packet.getData(), 0,
packet.getLength(), "UTF-8");
System.out.println(response);
if("<HELLO>".equals(response)){
System.out.println("OK");
} else {
System.out.println("ERROR");
}
}
}
// Client.java
import java.net.*;
public class Client {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket();
byte[] output = "<HELLO>".getBytes("UTF-8");
DatagramPacket packet = new DatagramPacket(output, output.length,
InetAddress.getLocalHost(),
9999);
socket.send(packet);
}
}
答案 1 :(得分:0)
您有一个变量response
和reponse
。
我假设它们不一样,你的测试应该失败。
这是您应该能够在调试器中看到的那种东西。