DatagramPacket不传输正确的消息

时间:2011-10-02 11:26:00

标签: java sockets

我正在使用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差异无关。

2 个答案:

答案 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)

您有一个变量responsereponse

我假设它们不一样,你的测试应该失败。

这是您应该能够在调试器中看到的那种东西。