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