[英]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)
,则回调将得到执行,并且进程将正常终止。
从节点文档
“当触发空闲超时时,套接字将收到一个'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.