如何监听NodeJS https socket close事件

时间:2015-05-29 07:50:03

标签: node.js sockets https

我有以下代码

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);
});

当我向应用程序发出请求时,"套接字连接了PORT"记录到控制台,但没有"套接字数据"也没有"插座关闭"永远记录。为了确保我的事件监听器不被忽略,我在socket.destroyed设置了一个轮询,但无论我多久等待它都会记录false

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

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

更新

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

1 个答案:

答案 0 :(得分:0)

来自节点文档

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);
});