【问题标题】:NodeJS Websockets - terminate socket after sending dataNodeJS Websockets - 发送数据后终止套接字
【发布时间】:2017-11-13 03:33:58
【问题描述】:
我正在使用 ws 包在 nodeJS 中创建 websocket。
但是,我想要做的是一旦数据发送到服务器,套接字必须终止。我不知道该怎么做。
我的代码现在看起来像这样,但这里的问题是在发送任何数据之前终止。
ws.on('open', function open() {
console.log('subscribing');
ws.send(creds);
ws.terminate();
resolve(1);
});
这样做的正确方法是什么?
【问题讨论】:
标签:
javascript
node.js
websocket
terminate
【解决方案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;
});
您可能注意到,服务器发送的消息没有在客户端检查,它只是一个等待的信号。
【解决方案2】:
这就是你优雅地终止它的方式:
ws.close()
但请注意,除非客户端回复您,否则您无法从服务器知道数据何时到达客户端。所以你应该做的是再做一个事件,确保客户端已经收到数据并回复你,然后在那个事件上终止他的连接。
ws.on('open', function open() {
console.log('subscribing');
ws.send(creds);
});
ws.on('credsanswer', function incoming(message) {
//user has received creds ands calls us back
ws.close()
});