我有以下代码
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)
,则回调会执行并且进程正常终止。
答案 0 :(得分:0)
来自节点文档
"当触发空闲超时时,套接字将收到'超时'事件但连接不会被切断。用户必须手动结束()或销毁()套接字。"
这可能意味着它不会发送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);
});