Sockets Nodejs Websocket关闭事件称为…最终

Sockets Nodejs Websocket关闭事件称为…最终,sockets,node.js,websocket,Sockets,Node.js,Websocket,我拼凑的以下代码有一些问题。所有的事件都像广告中所说的那样工作,但是,当客户机在没有首先断开连接的情况下离线时,close事件不会立即得到调用。如果你给它一分钟左右的时间,它最终会被呼叫。此外,我发现如果我继续向客户机发送数据,它会更快地接收到关闭事件,但不会立即接收。最后,如果客户机正常断开连接,则调用end事件 我知道这与升级和ondata等其他侦听事件有关 我还应该声明客户端是一个嵌入式设备 client http request: GET /demo HTTP/1.1\r\n Host:

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

我知道这与升级和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);

有人能提出一个解决方案来立即结束活动吗?我试图在不使用模块的情况下保持这个简单。提前感谢。

一旦TCP套接字连接被一端或另一端关闭,将调用关闭
事件,在系统“未意识到”套接字已关闭的情况下,很少会出现并发症,但这是罕见的情况。由于WebSocket是从HTTP开始的,所以请求服务器可能会一直保持活动状态,直到套接字超时。这涉及到延迟

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

那么,通过WebSocket发送和接收数据并不是纯粹的字符串。通过WebSockets协议发送的实际数据具有数据帧层,这涉及到为您发送的每条消息添加标题。此标头包含有关您发送的消息、屏蔽(从客户端到服务器)、长度和许多其他内容的详细信息。数据框架又取决于WebSocket的版本,所以实现会略有不同

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

这里最适合的是-实际纯WebSocket

Socket.IO不适合您的情况,因为它是一个更复杂、更繁重的库,它有多个支持回退的协议列表,并且有一些可能不是您想要的抽象。

人们为这些东西编写模块是有原因的。如果您想在不使用任何事先编写的代码的情况下实现一个符合交叉草稿要求的websocket实现,您将需要做大量的工作。@einaros+1。已经处理了这些问题,还有许多其他问题:@RohanSingh,我应该知道-我为socket.io编写了websocket代码。