【发布时间】:2013-06-10 19:24:05
【问题描述】:
我正在尝试基于 net 模块实现 http 服务器。
我需要在其中实现keep-alive,所以我调用sock.setKeepAlive(true) 然后sock.setTimeout 在2 秒超时后关闭套接字。
这是我的代码:
var server = net.createServer({ allowHalfOpen: false},socketListener);
function start(port){
server.listen(port,'localhost');
}
function socketListener(sock){
sock.setEncoding("utf8");
sock.setKeepAlive(true);
sock.setTimeout(2000,function(){
sock.end("HTTP/1.1 200 OK\r\nConnection: close\r\n\r\n");
});
sock.on("data",responser.responserCreator(sock,httpParser,baseDir,stat));
}
但是当我第一次打开浏览器并http://localhost:1234/profile.html 时它工作正常,但如果我在 2 秒后刷新它会引发异常 -
错误:此套接字已被对方在 Socket.writeAfterFIN [as write] (net.js:274:12) 结束
如果我评论超时一切正常。
我的代码有什么问题?
【问题讨论】:
-
启用 TCP keepalive 并设置不切实际的读取超时并不构成实现 HTTP keepalive。它们是完全不同的东西。 HTTP keepalive 需要保持连接 open 并发送适当的标头来说明。
-
Tnx 回答。所以我需要删除套接字上的超时,并且只在超时时添加
Connection: Keep-Alive标头+发送Connection: close(2 秒 - 这是规范。我收到了)?
标签: javascript node.js sockets http keep-alive