Я пытался реализовать сервер низкого уровня 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-байтовые пакеты?