NodeJS Websockets - 在发送数据后终止套接字

时间:2017-06-11 16:37:21

标签: javascript node.js websocket terminate

我正在使用ws包在nodeJS中创建websockets。

但是,我想要做的是一旦数据被发送到服务器,套接字必须终止。我不知道该怎么做。

我的代码现在看起来像这样,但这里的问题是在发送任何数据之前终止。

        ws.on('open', function open() {
        console.log('subscribing');
        ws.send(creds);
        ws.terminate();
        resolve(1);
    });

这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

这是你优雅地终止它的方式:

map[Matt:42 updated_at:2009-11-10 23:00:00 +0000 UTC]

但是,当数据到达客户端时,除非客户端回复您,否则无法从服务器获知。所以你应该做的是做另一个事件,确保客户端已收到数据并回复你,然后终止他在该事件上的连接。

ws.close()

答案 1 :(得分:-1)

编辑:我可能已经在服务器端切换了客户端,但概念仍然保持不变。您需要发回确认信号。

这不是websocket问题。这是一个TCP / IP问题。发送数据时,您可能知道它何时从网络适配器的缓冲区中刷出,但您无法判断最后一个数据包何时(或是否)到达另一个端点。

这是所有TCP / IP连接的常见问题,我在几个用例中找到的唯一绝对安全的解决方案就是将ACK(确认)发送回客户端。

在服务器上,收到消息后:

ws.send(""); // acknowledge the server received the message
// don't close the connection, linger instead
// process the message...

在客户端:

// create ws and immediately set a flag
ws.lingering = false;

// attach receive event before you open the socket
ws.on("data", function () {
  if (ws.lingering)
  {
    // now you can terminate the connection
    ws.terminate();
    resolve(1);
  }
});

// now open the socket and send message without terminating, yet
ws.on("open", function () {
    console.log("subscribing...");
    ws.send(creds);
    ws.lingering = true;
});

正如您所注意到的那样,服务器发送的消息未在客户端上进行检查,这只是一个等待的信号。