2015-01-20 6 views
0

Я создаю сервер веб-сокетов (огромная головная боль для меня), и его оказалось намного сложнее, чем я ожидал.Chrome Websocket Handshake

В настоящее время у меня возникла проблема с получением хром, чтобы принять рукопожатие. По какой-то причине он отлично работает в Firefox, но в chrome - соединение сразу закрывается.

Клиент Рукопожатие

GET /chat HTTP/1.1 
GET /chat HTTP/1.1 
    Host: localhost:8181 
Host: localhost:8181 
    Connection: Upgrade 
Connection: Upgrade 
    Pragma: no-cache 
Pragma: no-cache 
    Cache-Control: no-cache 
Cache-Control: no-cache 
    Upgrade: websocket 
Upgrade: websocket 
    Origin: http://localhost:8080 
Origin: http://localhost:8080 
    Sec-WebSocket-Version: 13 
Sec-WebSocket-Version: 13 
    User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.99 Safari/537.36 
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.99 Safari/537.36 
    Accept-Encoding: gzip, deflate, sdch 
Accept-Encoding: gzip, deflate, sdch 
    Accept-Language: en-US,en;q=0.8 
Accept-Language: en-US,en;q=0.8 
    Sec-WebSocket-Key: ANzq7Z0GL4lfvw518WOnig== 
Sec-WebSocket-Key: ANzq7Z0GL4lfvw518WOnig== 
    Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits 
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits 

и мой ответ выглядит следующим образом:

String response = "HTTP/1.1 101 Switching Protocols" + Environment.NewLine + 
           "Upgrade: websocket" + Environment.NewLine + 
           "Connection: Upgrade" + Environment.NewLine + 
           "Sec-WebSocket-Accept: " + wsAccept + Environment.NewLine + 
           "Sec-WebSocket-Protocol: " + protocol + Environment.NewLine + 
           Environment.NewLine; 

где wsAccept = Convert.ToBase64String(sha1.ComputeHash(Encoding.UTF8.GetBytes(key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11")))

и protocol = "chat";

Есть ли сайт или что-то я могу использовать в качестве ссылка? Я чувствую, что я рисую здесь пробел.

Любая помощь очень ценится.

Благодаря

решаемые

Я finlly получил, как это сделать. Я отправлял по многим параметрам обратно, последние

"Sec-WebSocket-Protocol: " + protocol 

был излишним! Итак, рукопожатие должно выглядеть так:

String response = "HTTP/1.1 101 Switching Protocols" + Environment.NewLine + 
           "Upgrade: websocket" + Environment.NewLine + 
           "Connection: Upgrade" + Environment.NewLine + 
           "Sec-WebSocket-Accept: " + wsAccept + Environment.NewLine + 
           Environment.NewLine; 

Надеюсь, это поможет любому, кто сталкивается с подобной проблемой!

ответ

0
String response = "HTTP/1.1 101 Switching Protocols" + Environment.NewLine + 
           "Upgrade: websocket" + Environment.NewLine + 
           "Connection: Upgrade" + Environment.NewLine + 
           "Sec-WebSocket-Accept: " + wsAccept + Environment.NewLine + 
           Environment.NewLine; 

Слишком много атрибутов был отправлен раньше. Работает на iOS/8.1, Chrome/40 и Firefox/35.

1

Вам не хватает Sec-WebSocket-Accept ответного заголовка.

Посмотрите на http://en.wikipedia.org/wiki/WebSocket#WebSocket_protocol_handshake

Клиент посылает Sec-WebSocket-Key, который представляет собой случайное значение, которое имеет были в формате base64. Чтобы сформировать ответ, GUID 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 прилагается к этому базовому кодирующему ключу64 . Закодированный ключ base64 не будет декодирован первым. [10] Затем полученная строка хэшируется с SHA-1, а затем кодируется base64. Наконец, полученный ответ возникает в заголовке Sec-WebSocket-Accept.

Read:

https://developer.mozilla.org/en-US/docs/WebSockets/Writing_WebSocket_servers

и

https://developer.mozilla.org/en-US/docs/WebSockets/Writing_WebSocket_server#Handshaking

+0

Спасибо за ваш ответ, однако, я не дал вам ваш правильный ответ. Я обновил ответ с реальным ответом. – Paul

+1

Вы уверены, что проблема в рукопожатии? Вы видите какую-либо ошибку на консоли Google Chrome? – vtortola

+0

Я пробовал читать чистые внутренние элементы, но все, что я нахожу под сокетами, это UDP-Sockets - Что я должен искать? Я все еще верю, что что-то пошло не так, как рукопожатие, так как он сразу же не работает, когда сокет «открывается». Это довольно странно работает в Firefox. – Paul

Смежные вопросы