joh*_*sd3 5 sockets websocket node.js
我拼凑在一起的以下代码遇到了一些问题。但是,所有事件均按广告进行工作,当客户端在未首先断开关闭事件的情况下脱机时,不会立即得到呼叫。如果您花一分钟左右的时间,它将最终被调用。另外,我发现如果我继续向客户端发送数据,它将更快地接收到关闭事件,但永远不会立即发生。最后,如果客户端正常断开连接,则将结束事件称为正常。
我了解这与其他监听事件(如升级和ondata)有关。
我还应该声明该客户端是嵌入式设备。
client http request:
GET /demo HTTP/1.1\r\n
Host: example.com\r\n
Upgrade: Websocket\r\n
Connection: Upgrade\r\n\r\n
//nodejs server (I'm using version 6.6)
var http = require('http');
var net = require('net');
var sys = require("util");
var srv = http.createServer(function (req, res){
});
srv.on('upgrade', function(req, socket, upgradeHead) {
socket.write('HTTP/1.1 101 Web Socket Protocol Handshake\r\n' +
'Upgrade: WebSocket\r\n' +
'Connection: Upgrade\r\n' +
'\r\n\r\n');
sys.puts('upgraded');
socket.ondata = function(data, start, end) {
socket.write(data.toString('utf8', start, end), 'utf8'); // echo back
};
socket.addListener('end', function () {
sys.puts('end'); //works fine
});
socket.addListener('close', function () {
sys.puts('close'); //eventually gets here
});
});
srv.listen(3400);
Run Code Online (Sandbox Code Playgroud)
谁能建议解决方案以立即结束活动?我试图在不使用模块的情况下保持简单。提前致谢。
close
一旦 TCP 套接字连接被一端或另一端关闭,事件就会被调用,当系统“没有意识到”套接字已经关闭时,很少有罕见情况的复杂性,但这种情况很少见。由于 WebSockets 从 HTTP 请求开始,服务器可能会一直保持活动状态,直到套接字超时。这涉及到延迟。
在您的情况下,您尝试执行握手,然后来回发送数据,但 WebSocket 的过程比这要复杂一些。
握手过程需要一些安全程序来验证两端(服务器和客户端),并且它是 HTTP 兼容标头。但是不同平台和浏览器支持的不同草案版本确实以不同的方式实现它,因此您的实现也应该考虑到这一点,并根据您需要支持的版本遵循有关 WebSockets 规范的官方文档。
那么通过 WebSockets 发送和接收数据就不是纯字符串了。通过 WebSockets 协议发送的实际数据具有数据帧层,其中涉及向发送的每条消息添加标头。此标头包含有关您发送的消息、屏蔽(从客户端到服务器)、长度和许多其他信息的详细信息。数据帧再次取决于 WebSockets 的版本,因此实现会略有不同。
我鼓励使用现有的库,因为它们已经以良好和干净的方式实现了您需要的一切,并且已在商业项目中广泛使用。
由于您的客户端是嵌入式平台,并且我假设服务器也是node.js,因此很容易在两端使用相同的库。
这里最适合的是ws-实际的纯 WebSockets。
Socket.IO 不适合您的情况,因为它是一个更加复杂和繁重的库,具有多个协议支持列表和后备,并且具有一些可能不是您正在寻找的抽象。
归档时间: |
|
查看次数: |
1954 次 |
最近记录: |