Кажется, неправильно сформированный пакет WebSocket отправляется при закрытии соединения - PullRequest
0 голосов
/ 07 марта 2020

Я пытался реализовать сервер низкого уровня Java для обработки WebSockets от клиентов на основе браузера. Я использовал этот простой тестовый код для клиента html.

function connect() {
  console.log("Connecting to server...");
  webSocket = new WebSocket("ws://localhost:2000");
  webSocket.onopen = function(e) {
    console.log("Connected to server");
  }
  webSocket.onclose = function(e) {
    console.log("Connection closed");
  }
  webSocket.onmessage = function(e) {
    console.log(event.data);
  }
}
function send(string) {
  if(webSocket.readyState == WebSocket.OPEN) {
    webSocket.send(string);
  } else {
    return "Error: Not connected";
  }
}

Мой сервер работает нормально при чтении отправленных текстовых пакетов (код операции 1) - он принимает каждого подключенного клиента и может читать содержимое пакеты, отправленные от клиента, которые оформлены в соответствии с разделом 5.2 RF C -6455 WebSocket spe c.

FIN равен 1, RSV1, RSV2 и RSV3 все равны 0, а код операции равен 1, указывая, что данные полезной нагрузки являются текстовыми (выглядит как 1000 0001). Пакетные данные декодируются на основе 4-байтового маскирующего ключа, и я получаю ту же строку, которую я отправил от клиента, для отображения в моей реализации сервера.


Проблема возникает, когда мой клиент отключается. Я пробовал это на нескольких браузерах и получил те же результаты. Вызов метода close() в WebSocket или простое закрытие / обновление вкладки отключает клиента, но отправляет неверно сформированный пакет на сервер.

Пакет, полученный сервером, похоже, не соответствует ни одному из кадров руководящие принципы, установленные RF C -6455 . Пакет всегда имеет длину 6 байтов, но я не могу понять, как декодировать / понять содержимое пакета. Код FIN не всегда равен 1, но всегда отправляется 1 пакет. RSV1, RSV2 и RSV3 не всегда равны нулю, а код операции является случайным.

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

00111110 01100100 00110111 00011011 00111101 10001101

11011011 01101011 00101010 11011001 11011000 10000010

00101100 01100100 00001110 01111110 00101111 10001101

10100110 11100100 10110000 01011000 10100101 00001101

Я хотел бы понять, почему я получаю эти пакеты от моего стандартного barebone-браузера WebSocket-клиента, когда он отключен, и как я могу с ними справиться мой сервер. Кажется, я могу понять, что это только close пакеты, потому что они не соответствуют спецификации кадров.

Возможно, это другой тип пакета, который мне нужно прочитать в другом путь? Или, может быть, мой клиент / сервер просто неправильно отправляет / читает пакеты?

Редактировать: я открыл WireShark и увидел правильно оформленный пакет WebSocket с отправляемым кодом операции закрытия. Проблема решена - я получаю хороший закрытый пакет, и мой сервер распознает его как закрытый пакет. Я забыл фактически закрыть входной поток, который я использовал (это происходило через некоторое время l oop).

Однако я все еще получаю странные пакеты во входном потоке после отправки пакета закрытия соединения Итак, есть идеи, что это за 6-байтовые пакеты?

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