Я пытаюсь прочитать значение, полученное из JavaScript WebSocket, используя Java. У меня есть этот код JavaScript:

const socket = new WebSocket("wss://localhost:7999"); // start

socket.addEventListener("open", (event) => {
    socket.send("Hello!");
});

socket.addEventListener("message", (event) => {
    console.log("Received message.");
});

И этот код Java:

import java.io.*;
import java.net.*;

class Server {
    public static void main(String[] args) throws Exception {
        ServerSocket s = new ServerSocket(7999);
        Socket client = s.accept();

        System.out.println("I am in!");
        InputStream inputStream = client.getInputStream();

        InputStreamReader reader = new InputStreamReader(inputStream, "UTF-8");
        BufferedReader in = new BufferedReader(reader);
        String readLine;

        while ((readLine = in.readLine()) != null) {
            System.out.println(readLine);
        }
    }
}

Однако при запуске кода сервера и клиента я получаю это значение:

I am in!
���
�.isֿ���pO?��-4/P�P����- ���Q�`�:���x���wG�Z��x��v�##�6���,�+̩�0�/̨�$�#�
�   �(�'����=<5/�
}�� localhost�

��http/1.1
3+)�� �-l-h������ۥ n�}�>�zUZ�Ğ�-+

Моя цель - прочитать значение Hello, которое я отправил с помощью socket.send. Кто-нибудь знает, как исправить эту проблему? Спасибо.

0
user7289922 28 Ноя 2021 в 00:58
Я попробовал это сам и получил что-то похожее. ServerSocket по умолчанию не настроен для работы с WebSockets.
 – 
ControlAltDel
28 Ноя 2021 в 01:03
Спасибо, ты знаешь, как его настроить?
 – 
user7289922
28 Ноя 2021 в 01:04
Странно, как вы читаете "http / 1.1" выше. Я считаю, что это должно появиться перед данными заголовка HTTP. Вероятно, это связано с тем, что вы не используете библиотеку, предназначенную специально для WebSockets, которые используют очень специфический стандартизованный протокол и не просто отправляют все как байты UTF8. Возможно, попробуйте этот пакет: github.com/TooTallNate/Java-WebSocket
 – 
Wasabi Thumbs
28 Ноя 2021 в 01:06
Я выбрал Ratchet, реализацию веб-сокета PHP. Я нашел в Google некоторую информацию о том, как это сделать в Java EE 7: learn.vonage.com/blog/2018/10/22/…
 – 
ControlAltDel
28 Ноя 2021 в 01:08
Спасибо, попробую.
 – 
user7289922
28 Ноя 2021 в 01:16

1 ответ

Лучший ответ

ServerSocket - это конструкция довольно низкого уровня для обработки TCP-соединений. Websocket, несмотря на то, что он запускается как HTTP-запрос, требует, чтобы сервер запрашивал обновление соединения, происходит рукопожатие, а затем обрабатываются кадры веб-сокета, включая некоторые внутренние кадры, такие как ping / pong. Если вы не планируете реализовать всю эту функциональность, я бы посоветовал вам не использовать raw ServerSocket, а вместо этого использовать библиотеку, которая предоставляет поддержку веб-сокетов из коробки.

Вот некоторые варианты, на которые я мог бы вам указать:

  • нетти
  • vert.x
1
Mirek Pluta 28 Ноя 2021 в 01:06