2015-02-04 3 views
2

Примечание: Ближайший вопрос, который я нашел в шахте this one, но ответ для передачи данных с помощью функции прокси-сервера, который ожидает для readyState быть 1. Это не дубликат этого вопроса, хотя названия очень похожи; Я знаю, что моя проблема заключается в том, что мой сервер не передает данные клиенту, но я не знаю, что передать.JS WebSocket застрял в состоянии Подключение к TcpListener - VB.net

Деталь:

У меня есть TCP Слушатель определена в моей программе сервера как New TcpListener(ipAd, 8001) и я написал клиентскую программу как New TcpClient() для подключения к серверу. Эти программы работают по назначению, где, как только будет установлено соединение, клиент готов отправить данные на сервер.

После того, как я завершил работу с клиентом и сервером, я начал работать с веб-интерфейсом, чтобы выступать в роли клиента, поэтому я мог отправлять данные в сокет с любого устройства. Вот Javascript код WebSocket:

console.log("Attempting to connect..."); 

    ws = new WebSocket('ws://192.168.0.10:8001/'); 

    ws.onopen = function(msg) { 
     console.log('Connection successfully opened'); 
    }; 

    ws.onmessage = function(msg) { 
     console.log(msg); 
    }; 

    ws.onclose = function(msg) { 
     console.log("Closed."); 
    } 

    ws.error = function(err){ 
     console.log(err); 
    } 

Когда я загрузить веб-страницу, я вижу в моем сервере консоли приложение, которое производится подключение. Вот вывод:

GET/HTTP/1.1 
Host: 192.168.0.10:8001 
Connection: Upgrade 
Pragma: no-cache 
Cache-Control: no- 
cache 
Upgrade: websocket 
Origin: null 
Sec-WebSocket-Version: 13 
User-Agent: Mozilla/5.0 (Windows 
NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.99 Safari/537.36 
Accept-Enc 
oding: gzip, deflate, sdch 
Accept-Language: en-US,en;q=0.8 
Sec-WebSocket-Key: key_here 
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits 

Так ясно, что HTTP-заголовки отправлены и получены; Однако, мой сервер (на данный момент) не отправляет ничего обратно клиенту, поэтому, когда я пытаюсь выпустить ws.send("test"); из WebSocket, я получаю сообщение об ошибке в консоли:

Uncaught InvalidStateError: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state. 

Мой вопрос: Что мне нужно отправить обратно клиенту с моего сервера для завершения рукопожатия, чтобы я мог отправлять данные с ws.send();?

ответ

1

Вам необходимо реализовать серверную часть webSocket (или использовать библиотеку webSocket, которая сделает это для вас). Вот one sample implementation in VB. И a similar question with sample code.

соединение WebSocket работает следующим образом:

  1. Клиент делает запрос HTTP на сервер с настраиваемым заголовком запроса обновления до протокола WebSocket

  2. сервер отвечает, что обновление до WebSocket в порядке и случайно сгенерированный ключ безопасности.

  3. После того, как сервер отправит ответ, и клиент получит его, обе стороны перейдут в формат фрейма данных webSocket для будущих данных.

  4. Кроме того, есть некоторые обязательные сообщения, которые необходимо поддерживать, такие как пинг и понг, чтобы поддерживать постоянное сердцебиение, которое клиент будет использовать, чтобы узнать, жива ли связь.

См. Например this article ответы и описание формата фрейма данных webSocket.

Кроме того, браузеры применяют ограничения одного происхождения по умолчанию, поэтому, если вы пытаетесь подключиться из браузера к другому источнику, чем веб-страница, в которой находится Javascript, тогда вам понадобятся соответствующие заголовки CORS с вашего сервера для включения соединения с перекрестным концом.


Вот пример подключения:

Клиент посылает это:

GET /chat HTTP/1.1 
Host: example.com:8000 
Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== 
Sec-WebSocket-Version: 13 

сервер отвечает следующим образом:

HTTP/1.1 101 Switching Protocols 
Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= 

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

0     1     2     3 
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
+-+-+-+-+-------+-+-------------+-------------------------------+ 
|F|R|R|R| opcode|M| Payload len | Extended payload length | 
|I|S|S|S| (4) |A|  (7)  |    (16/64)   | 
|N|V|V|V|  |S|    | (if payload len==126/127) | 
| |1|2|3|  |K|    |        | 
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - + 
|  Extended payload length continued, if payload len == 127 | 
+ - - - - - - - - - - - - - - - +-------------------------------+ 
|        |Masking-key, if MASK set to 1 | 
+-------------------------------+-------------------------------+ 
| Masking-key (continued)  |   Payload Data   | 
+-------------------------------- - - - - - - - - - - - - - - - + 
:      Payload Data continued ...    : 
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + 
|      Payload Data continued ...    | 
+---------------------------------------------------------------+ 

И, конечно же, официальная спецификация webSocket RFC составляет here.

+1

Ваша ссылка на образец кода Mozilla работала, но для этого потребовалась быстрая смена. 'Dim FRRROPCODE Поскольку Byte()' нужно было изменить только на 'Byte', а не на массив. Также «Полученный» неправильно указан в этом коде. – Chad

+0

Пробовал войти в систему, чтобы изменить его, но Mozilla не примет мои учетные данные: \ – Chad

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