【问题标题】:How to listen to NodeJS https socket close event如何监听 NodeJS https 套接字关闭事件
【发布时间】:2015-05-29 07:50:02
【问题描述】:

我有以下代码

var https = require("https");
var fs = require("fs");

var server = https.createServer({
    key: fs.readFileSync('key.pem'),
    cert: fs.readFileSync('cert.pem')
}, function (req, res) {
    res.writeHead(200);
    res.end(req.url);
});
server.listen(8765, "0.0.0.0", function() {
    console.log("listening");
});
server.on("connection", function(socket) {
    console.log("socket connected", socket.remotePort);
    socket.on("data", function() {
        console.log("socket data");
    });
    socket.on("close", function() {
        console.log("socket closed");
    });
    socket.setTimeout(3000);
    setInterval(function() {
        console.log("socket destroyed: ", socket.destroyed);
    }, 500);
});

当我向应用程序发出请求时,“socket connected PORT”会记录到控制台,但“socket data”和“socket closed”都不会记录。为了确保我的事件侦听器不会被忽略,我在 socket.destroyed 上设置了轮询,但无论我等待多长时间,它都会记录 false

我已经使用 chrome、safari、firefox、curl 发出了请求,但我的每一个请求都给出了相同的结果。我还做了一个 Wireshark 分析,客户端确实发送了一个 FIN 数据包,服务器用自己的 FIN 数据包响应它。

我的问题是,如何在 https 套接字关闭时收到通知?这个套接字是由密码创建的某种代理对象来创建明文流吗?

更新

NodeJS 使用的套接字确实关闭了,因为 server.connections 按预期更改,如果我调用 server.close(callback),回调确实会被执行并且进程会正常终止。

【问题讨论】:

  • documentation 声明:the socket will not emit readable events because of how the protocol parser attaches to the socket. 这可能是对您的提示吗?您可以查看 socket.io 实现,因为该框架还需要跟踪打开的套接字。

标签: node.js sockets https


【解决方案1】:

来自节点文档

socket.setTimeout(timeout[, callback])

“当触发空闲超时时,套接字将收到一个'超时'事件,但连接不会被切断。用户必须手动结束()或销毁()套接字。”

这可能意味着它不会调度 close 事件,因为连接并没有真正终止。

也尝试收听end 事件而不是close

未经测试的代码

server.on("connection", function(socket) {
    socket.setEncoding('UTF-8');
    console.log("socket connected", socket.remotePort);
    socket.on("data", function() {
        console.log("socket data");
    });
    socket.on("end", function() {
        console.log("socket closed");
    });
    socket.setTimeout(3000, function(){
      socket.end();
    });
    setInterval(function() {
        console.log("socket destroyed: ", socket.destroyed);
    }, 500);
});

【讨论】:

  • 我尝试收听结束事件,但什么也没提供。超时回调虽然有效,但这并不是一个真正的关闭事件。我尝试调试 NodeJS 附带的 net.js,查找 server.connections 计数器的增量和减量是否有效。结果非常惊人,因为在连接++之后发出的套接字与在连接中发出关闭事件的套接字不同——。也许这是一个 NodeJS 错误?
猜你喜欢
  • 2011-11-09
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
相关资源
最近更新 更多