开发者

DatagramPacket not transmitting the right message

I'm implementing a client/server application using UDP transmissions. Here is my part of my co开发者_开发技巧de :

Client :

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);

Server :

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");
}

My problem is the following: if I print the response String on the client side that is comming from the client, everything looks fine (""). But for some reasons when I trie to compare the response coming from the server using .equals or a RegExp it fails !

May be it's related to String encoding but I don't know where and why it fails. Both client and server are running on the same host right now, so it might not be related to JVM differences.


You're currently using the platform default encoding to both encode and decode strings. You should absolutely not do that. Specify the encoding both in the getBytes() call and the constructor call, e.g.

byte[] outBuffer = message.getBytes("UTF-8");

Also note that your current code creates a byte array of length 1000 and then immediately throws it away:

byte[] outbuffer = new byte[1000];
// Byte array created on previous line is now useless!
outbuffer = message.getBytes();

... don't do that.

We can't really tell much more from the code you've given us - if you could produce short but complete programs demonstrating the problem, that would really help.

For debugging, I would suggest you log the contents of the datagram packet you receive, while still in binary. Presumably it's not what you expected, but that doesn't help to show what it was.

EDIT: Here's a pair of short but complete programs which do work:

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);
    }
}


You have a variable response and reponse.

I am assuming that they won't be the same and your test should fail.

This is the sort of thing you should be able to see in a debugger.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜