Nodejs Websocket关闭事件已调用..最后



我在拼凑的以下代码中遇到了一些问题。然而,所有事件都像广告中所说的那样工作,当客户端在没有首先断开连接的情况下离线时,关闭事件不会立即得到调用。如果你给它一分钟左右的时间,它最终会被呼叫。此外,我发现如果我继续向客户端发送数据,它会更快地接收到关闭事件,但永远不会马上。最后,如果客户端正常断开连接,则调用结束事件。

据我所知,这与升级和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不适合您的情况,因为它是一个更复杂、更重的库,具有多个协议列表支持和回退,并且有一些抽象可能不是您想要的。

相关内容

  • 没有找到相关文章

最新更新