我正在使用ws包在nodeJS中创建websockets。
但是,我想要做的是一旦数据被发送到服务器,套接字必须终止。我不知道该怎么做。
我的代码现在看起来像这样,但这里的问题是在发送任何数据之前终止。
ws.on('open', function open() {
console.log('subscribing');
ws.send(creds);
ws.terminate();
resolve(1);
});
这样做的正确方法是什么?
答案 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;
});
正如您所注意到的那样,服务器发送的消息未在客户端上进行检查,这只是一个等待的信号。