DatagramPacket не передает правильное сообщение - PullRequest
0 голосов
/ 02 октября 2011

Я реализую клиент-серверное приложение, используя передачи 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, это не получается!

Может быть, это связано со строковым кодированием, но я не знаю, где и почему он не работает.И клиент, и сервер сейчас работают на одном и том же хосте, поэтому это может быть не связано с различиями в JVM.

Ответы [ 2 ]

2 голосов
/ 02 октября 2011

В настоящее время вы используете кодировку платформы по умолчанию для кодирования и декодирования строк. Вы должны абсолютно не делать этого . Укажите кодировку как в вызове 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);
    }
}
0 голосов
/ 02 октября 2011

У вас есть переменные response и reponse.

Я предполагаю, что они не будут одинаковыми, и ваш тест не пройдёт.

Это то, что вы должны увидеть в отладчике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...