Обновление соединения до WebSocket - PullRequest
0 голосов
/ 30 мая 2019

У меня плохо документированное устройство, которое должно взаимодействовать двумя способами RESTful и Websocket. Меня интересуют только функции, доступные через Websocket. Я открыл сокет и ожидал некоторый пакет Json, но получил сообщение:

GET /api/v1/tasks HTTP/1.1
Upgrade: websocket
Sec-WebSocket-Key: MjhkYjNVdk93M0Fnd3lwdw==
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Host: 192.168.0.80:3701
Sec-WebSocket-Version: 13
User-Agent: DVR Server
Accept-Language: en-us,en;q=0.5
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: Upgrade

Я полагаю, что это RESTful вызов, и это сообщение пытается предложить обновить до WebSocket. Я прав? Но как это принять? Что я должен отправить как ответ? Каков наилучший способ сделать это в Java?

1 Ответ

0 голосов
/ 30 мая 2019

Если вы хотите только принять рукопожатие через веб-сокет, следующий код сделает эту работу.Первый параметр функции acceptHandshake - это средство записи, которое записывает в OutputStream сокета.

private void acceptHandshake(PrintWriter output, String secureWebSocketKey) {
    try {
        output.println("HTTP/1.1 101 Switching Protocols");
        output.println("Upgrade: websocket");
        output.println("Connection: Upgrade");
        output.println("Sec-WebSocket-Accept: " + encode(key));
        output.println();
        output.flush();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private String encode(String key) throws Exception {
    key += "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
    byte[] bytes = MessageDigest.getInstance("SHA-1").digest(key.getBytes());
    return DatatypeConverter.printBase64Binary(bytes);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...