我在拼凑的以下代码中遇到了一些问题。然而,所有事件都像广告中所说的那样工作,当客户端在没有首先断开连接的情况下离线时,关闭事件不会立即得到调用。如果你给它一分钟左右的时间,它最终会被呼叫。此外,我发现如果我继续向客户端发送数据,它会更快地接收到关闭事件,但永远不会马上。最后,如果客户端正常断开连接,则调用结束事件。
据我所知,这与升级和ondata等其他侦听事件有关。
我还应该声明客户端是一个嵌入式设备。
client http request:
GET /demo HTTP/1.1rn
Host: example.comrn
Upgrade: Websocketrn
Connection: Upgradernrn
//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 Handshakern' +
'Upgrade: WebSocketrn' +
'Connection: Upgradern' +
'rnrn');
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);
有人能提出一个立即结束活动的解决方案吗?我试图在不使用模块的情况下保持简单。提前谢谢。
一旦TCP套接字连接被一端或另一端关闭,就会调用close
事件,在系统"没有意识到"套接字已经关闭的罕见情况下,这种情况很少发生。当WebSockets从HTTP请求服务器启动时,它可能会一直保持活动状态,直到套接字超时。这涉及到延迟。
在您的案例中,您试图执行握手,然后来回发送数据,但WebSockets是一个比这更复杂的过程
握手过程需要一些安全过程来验证两端(服务器和客户端),并且它是HTTP兼容的头。但是,不同平台和浏览器支持的不同草案版本确实以不同的方式实现了它,所以您的实现也应该考虑到这一点,并根据您需要支持的版本遵循WebSockets规范的官方文档。
那么通过WebSockets发送和接收数据就不是纯字符串了。通过WebSockets协议发送的实际数据具有数据帧层,这涉及到向您发送的每个消息添加标头。此标头包含有关您发送的消息、屏蔽(从客户端到服务器)、长度和许多其他内容的详细信息。数据帧再次取决于WebSockets的版本,所以实现会略有不同。
我强烈建议使用现有的库,因为它们已经以良好和干净的方式实现了您需要的一切,并且已经在商业项目中广泛使用
由于您的客户端是嵌入式平台,服务器也是node.js,所以很容易在两端使用相同的库。
这里最适合的是ws-实际的纯WebSocket
Socket.IO不适合您的情况,因为它是一个更复杂、更重的库,具有多个协议列表支持和回退,并且有一些抽象可能不是您想要的。