【问题标题】:socket.setTimeout() in node.jsnode.js 中的 socket.setTimeout()
【发布时间】: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


【解决方案1】:

解决方案是在sock.end()之后的超时函数内添加sock.destroy()

【讨论】:

  • end() 之后调用destroy() 而不是仅仅destroy() 的原因是什么?
猜你喜欢
  • 2016-03-26
  • 2015-02-04
  • 2021-01-25
  • 2016-09-26
  • 2021-09-15
  • 2011-09-18
  • 2012-04-07
  • 2014-07-14
  • 2011-08-03
相关资源
最近更新 更多