Пакет данных не передает правильное сообщение

#java #sockets

#java #сокеты

Вопрос:

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

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

Ответ №1:

В настоящее время вы используете кодировку платформы по умолчанию как для кодирования, так и для декодирования строк. Вы абсолютно не должны этого делать. Укажите кодировку как в 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. Безусловно, это было связано с кодировкой! Большое спасибо!

Ответ №2:

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

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

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