Java WebSocket сервер OutputStream не сбрасывается

Я прочитал похожий вопрос, но моя проблема не была решена.

Ради обучения я пытаюсь создать свой собственный сервер Java WebSocket. Сервер настроен нормально, он принимает входящие соединения и получает данные рукопожатия от клиента. Мой сервер затем вычисляет данные возврата рукопожатия и пытается записать и очистить их. Тем не менее, в веб-инспекторе заголовки ответа для клиента и onopen-JavaScript событие никогда не запускается.

String EOL = System.getProperty("line.separator"); // actually a class-defined constant

BufferedReader inputStream = currentClient.getInputStream();
OutputStream outputStream = currentClient.getOutputStream();

String inputLine;
String handshake = "";

try {

    if(!inputStream.ready()){ continue; }

    System.out.println("Receiving:\n");

    while ((inputLine = inputStream.readLine()).length() > 0) {

        if(inputLine.startsWith("Sec-WebSocket-Key: ")){

            String inputKey = inputLine.replace("Sec-WebSocket-Key: ", "");
            String outputKey = WebSocket.getWebSocketKey(inputKey);

            handshake += "HTTP/1.1 101 Switching Protocols"+EOL;
            handshake += "Upgrade: websocket"+EOL;
            handshake += "Connection: Upgrade"+EOL;
            handshake += "Sec-WebSocket-Accept: "+outputKey;

        }

        System.out.println(inputLine);

    }

} catch (Exception e) {

    e.printStackTrace();

}

System.out.println("\n\nSending:\n");

System.out.println(handshake);
try {
    outputStream.write(handshake.getBytes(Charset.forName("UTF-8")));
    outputStream.flush();
} catch (IOException e) {
    e.printStackTrace();
}

Итак, вот пример того, что я получаю:

GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: localhost:65432
Origin: http://localhost
Sec-WebSocket-Key: ph1CO1PCF60uojeP+nql5A==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame

И что я пытаюсь отправить:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: Z2Vy9p7Lp+MZPdZOe+L5GhVBDpc=

Я хотел бы отметить, что отправки отправляемых мной заголовков должно быть достаточно, поскольку на разработанном мной сервере PHP WebSocket отправка не более, чем эти заголовки, ДЕЙСТВУЕТ.

1 ответ

Решение

Рукопожатие websocket - это HTTP-запрос, за которым следует HTTP-ответ. RFC2616 утверждает, что маркером конца строки для HTTP является CRLF ("\ r \ n").

HTTP-запросы заканчиваются двойной новой строкой ("\ r \ n \ r \ n" - см. Раздел 4 RFC); ответ рукопожатия websocket является ответом HTTP, поэтому также должен заканчиваться следующим образом.

Другие вопросы по тегам