Nodejs Websocket关闭事件被调用......最终

时间:2012-02-14 04:58:57

标签: sockets node.js websocket

我在下面的代码中遇到了一些问题。然而,所有事件都按照所宣传的方式工作,当客户端脱机而没有首先断开关闭事件时,不会立即接到电话。如果你给它一分钟左右,它最终会被调用。此外,我发现如果我继续向客户端发送数据,它会更快地获取关闭事件,但不会立即发送。最后,如果客户端正常断开连接,则会调用结束事件。

我知道这与其他监听事件有关,例如upgrade和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);

有人可以提出解决方案来接收即时关闭事件吗?我试图在不使用模块的情况下保持这种简单。提前谢谢。

1 个答案:

答案 0 :(得分:0)

一旦TCP套接字连接被一个或另一个端关闭,将会调用

close事件,当系统“没有意识到”该套接字已经关闭时很少发生并发症,但这种情况很少见。当WebSockets从HTTP请求服务器启动时,它可能只是保持活动状态,直到超时套接字为止。这涉及到延迟。

在您的情况下,您尝试执行握手,然后来回发送数据,但WebSockets的过程比这更复杂。
握手过程需要一些安全性过程来验证两端(服务器和客户端),并且它是HTTP兼容的头。但是不同平台和浏览器支持的不同草案版本确实以不同的方式实现它,因此您的实现也应考虑到这一点,并遵循基于您需要支持的版本的WebSockets规范的官方文档。

然后通过WebSockets发送和接收数据不是纯字符串。通过WebSockets协议发送的实际数据具有数据框架层,其中包括为您发送的每封邮件添加标头。此标头包含有关您发送的消息,屏蔽(从客户端到服务器),长度和许多其他内容的详细信息。数据框架再次依赖于WebSockets的版本,因此实现会略有不同。

我会鼓励使用现有的库,因为他们已经以良好和干净的方式实现了您所需的一切,并且已广泛用于商业项目。
由于您的客户端是嵌入式平台,我假设服务器也是node.js,因此很容易在两端使用相同的库。

此处最适合的是ws - 实际的纯WebSockets Socket.IO不适合你的情况,因为它是一个更加复杂和繁重的库,有多个协议列表支持回退,并且有一些可能不是你想要的抽象。