#c# #google-chrome #firefox #websocket #handshake
#c# #google-chrome #firefox #websocket #рукопожатие
Вопрос:
В настоящее время я разрабатываю небольшой сервер websocket на C # для обработки подключений из браузеров.
В основном я использовал код из Mozilla и Microsoft (соответственно здесь и там). К сожалению, когда я пытаюсь подключиться к своему базовому серверу из браузера (сценарий был взят из websocket.org ), запрос GET выглядит фрагментированным…
Я хотел бы понять, почему запрос GET разделен на две части. Позвольте мне показать вам мой код и результат, который я получаю от него.
Код:
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
data = Encoding.UTF8.GetString(bytes,0,i);
Console.WriteLine("Received: {0}", data);
}
Вывод:
Received: GET / HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0
Accept: text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Received:
Sec-WebSocket-Version: 13
Origin: null
Sec-WebSocket-Key: 2QYy54zGPPKAkNyPgFjkbw==
Connection: keep-alive, Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Я также попробовал Chrome, чтобы увидеть, насколько он будет отличаться, и, запустив тот же код и тот же скрипт в браузере, я получаю следующий результат:
Received: GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: 127.0.0.1
Origin: null
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: mp5oLqe/YaQAxRksoVZWKg==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: permessage-deflate; client_
Received: max_window_bits, x-webkit-deflate-frame
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
Я не вижу ничего плохого в выводе с Chrome, поэтому я не совсем понимаю, почему запрос разделяется при использовании firefox…
Я мог бы объединить две части запроса вместе, но если я правильно понял RFC6455, любой неверный запрос должен быть удален сервером.
Есть предложения?
Большое вам спасибо.
Комментарии:
1. Я также написал сервер WebSocket на C #, исходный код может иметь отношение к вам: vtortola.github.io/WebSocketListener
Ответ №1:
Это совершенно нормально. Возможно, Firefox отправляет информацию таким образом (медленнее), что вам нужно дважды прочитать сетевой буфер, но это нормально. Кажется, что сначала отправляется общая информация, которая никогда не меняется, а после последней информации о websocket (которая должна генерироваться каждый раз), вероятно, для уменьшения «времени для первого байта».
Что касается протокола HTTP, заголовок заканчивается, когда появляется пустая строка, поэтому, пока вы ее не получите, а сетевой буфер содержит информацию (прочитано! = 0), вы можете продолжить чтение заголовка.
Обычно вы часто сталкиваетесь с такой ситуацией при сетевом программировании. Вы должны продолжать чтение, пока сетевой поток не сообщит readed = 0.