首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TCPListener卡在状态连接到TCPListener- VB.net

TCPListener卡在状态连接到TCPListener- VB.net
EN

Stack Overflow用户
提问于 2015-02-04 17:00:07
回答 1查看 3.4K关注 0票数 3

备注:我发现的最接近于的问题是这一个,但答案是通过一个等待readyState为1的代理函数发送数据。虽然标题非常相似,但这并不是这个问题的重复;我知道我的问题在于我的服务器没有将数据传回客户端,但我不知道该传递什么。

详细信息:

我在服务器程序中将一个TCP侦听器定义为New TcpListener(ipAd, 8001),并以New TcpClient()的形式编写了一个客户端程序以连接到服务器。这些程序按预期工作,一旦连接完成,客户端就可以将数据发送到服务器。

在完成客户端和服务器之后,我开始在web接口上充当客户端,这样我就可以从任何设备向套接字发送数据。以下是websocket的javascript代码:

代码语言:javascript
复制
    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);
    }

当我加载网页时,我在服务器控制台应用程序中看到连接已经建立。这是输出:

代码语言:javascript
复制
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

因此,headers显然是发送和接收的;但是,我的服务器(当前)没有向客户端发送任何内容,所以当我试图从websocket发出ws.send("test");时,在控制台中会收到一个错误:

代码语言:javascript
复制
Uncaught InvalidStateError: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.

我的问题:,我需要从服务器向客户端发送什么才能完成握手,这样我就可以用ws.send();发送数据。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-04 17:16:07

您需要实现webSocket的服务器端(或者使用为您提供的webSocket库)。这是VB中的一个示例实现。和与样例代码类似的问题

webSocket连接的工作方式如下:

  1. 客户端使用自定义头向服务器发出http请求,请求升级到webSocket协议。
  2. 服务器响应到webSocket的升级是正常的,并使用随机生成的安全密钥。
  3. 在服务器发送响应并由客户端接收响应后,双方切换到webSocket数据帧格式,以获取未来的数据。
  4. 此外,还必须支持一些必须支持的消息,如ping和pong,以支持客户端将用来知道连接是否仍处于活动状态的保持活动心跳。

例如,请参阅这篇文章响应和webSocket数据帧格式的说明。

此外,默认情况下,浏览器强制执行相同的源限制,因此,如果您试图从浏览器连接到与Javascript所在的网页不同的来源,那么您将需要来自服务器的适当的CORS头来启用跨源连接。

下面是一个示例连接:

客户端发送以下内容:

代码语言:javascript
复制
GET /chat HTTP/1.1
Host: example.com:8000
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13

服务器响应如下:

代码语言:javascript
复制
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

然后,数据帧如下所示:

代码语言:javascript
复制
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官方规范是这里

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28327119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档