繁体   English   中英

如何收听NodeJS https套接字关闭事件

[英]How to listen to NodeJS https socket close event

我有以下代码

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.destroyed上设置了一个轮询,但无论等待多少,它始终记录为false

我已经使用chrome,safari,firefox,curl发出了请求,但是我的每个请求都给出了相同的结果。 我还进行了Wireshark分析,并且客户端确实发送了FIN数据包,而服务器使用自己的FIN数据包对其进行响应。

我的问题是,https套接字关闭时如何获得通知? 这个套接字是密码生成的某种代理对象,用于创建明文流吗?

更新

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

从节点文档

socket.setTimeout(timeout [,callback])

“当触发空闲超时时,套接字将收到一个'timeout'事件,但不会断开连接。用户必须手动end()或destroy()套接字。”

这可能意味着它不会调度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);
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM