【发布时间】: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 实现,因为该框架还需要跟踪打开的套接字。