Мой WebSocket не работает должным образом;сервер реализован на Java, а клиент на JavaScript - PullRequest
1 голос
/ 13 ноября 2010

Кажется, у меня возникают проблемы с установлением «правильного» соединения между моим сервером Java и клиентом JavaScript. Похоже, что все в порядке, клиент отправляет свой заголовок в порядке, но это все, что он получает. Функции onopen или onmessage вообще никогда не срабатывают.

Вот код для сервера Java:

import java.net.*;
import java.io.*;
public class Server {
    static DataOutputStream out;
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(8112);
            System.out.println("Server Started");
            while(true) {
            Socket socket = serverSocket.accept();
            System.out.println("A client connected");
            out = new DataOutputStream(socket.getOutputStream());

            //Send a simple-as-can-be handshake encoded with UTF-8
            String handshake = "HTTP/1.1 101 Web Socket Protocol Handshake\r" +
            "Upgrade: WebSocket\r" +
            "Connection: Upgrade\r" +
            "WebSocket-Origin: http://localhost\r" +
            "WebSocket-Location: ws://localhost:8112/\r" +
            "WebSocket-Protocol: sample\r\n\r\n";
            out.write(handshake.getBytes("UTF8"));
            System.out.println("Handshake sent.");

            //Send message 'HI!' encoded with UTF-8
            String message = "HI!";
            out.write(0x00);
            out.write(message.getBytes("UTF8"));
            out.write(0xff);
            System.out.println("Message sent!");

            //Cleanup
            socket.close();
            out.close();
            System.out.println("Everything closed!");
        }
    } catch(Exception e) {
        System.out.println(e.getMessage());
    }
}

А вот код для клиента:

<html>
  <head>
    <meta charset="UTF-8">
    <script>
      function load() {
        var ssocket = new WebSocket("ws://localhost:8112/");
        socket.onopen = function(e) { alert("opened"); }
        socket.onclose = function(e) { alert("closed"); }
        socket.onmessage = function(e) { alert(e.data); }
      }
    </script>
  </head>
    <body onload="load();">
    </body>
</html>

Почему не срабатывает onopen или onmessage? Я пробовал много разных вещей, которые просто не могу этого сделать.

Что я делаю не так?

Ответы [ 2 ]

5 голосов
/ 13 ноября 2010

В протоколе есть ответ на запрос-ответ, который, по-видимому, отсутствует - клиент отправляет два дополнительных заголовка и некоторые случайные данные:

GET /demo HTTP/1.1
Host: example.com
Connection: Upgrade
<b>Sec-WebSocket-Key2: 12998 5 Y3 1  .P00</b>
Sec-WebSocket-Protocol: sample
Upgrade: WebSocket
<b>Sec-WebSocket-Key1: 4 @1  46546xW%0l 1 5</b>
Origin: http://example.com

<b>^n:ds[4U</b>

, и сервер должен получить ответ MD5 с помощью:

  • извлечение цифр из каждого ключа (4146546015, 1299853100)
  • деление на количество пробелов в ключе
  • сериализация ключей в виде 4-байтовых целых чисел, объединение с данными
  • вычисление дайджеста MD5

, выдающего ответ типа:

HTTP/1.1 101 WebSocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Origin: http://example.com
Sec-WebSocket-Location: ws://example.com/demo
Sec-WebSocket-Protocol: sample

<b>8jKS'y:G*Co,Wxa-</b>

Этот процесс предназначен для предотвращения обработки запросов не-WebSocket серверами WebSocket - см.раздел 1.3 протокола WebSocket для подробностей.

0 голосов
/ 13 ноября 2010

Здесь много возможных проблем. HTTP является протоколом запроса-ответа. Вы не должны отправлять сначала с сервера: вы должны сначала отправить запрос от клиента. Терминатор конца строки определяется как \ r \ n в HTTP. Вы должны создавать новый поток для каждого соединения на сервере. Вы должны закрыть поток вывода, а не сокет.

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