【问题标题】:How to close underlying socket after response is sent?发送响应后如何关闭底层套接字?
【发布时间】:2018-12-17 13:30:31
【问题描述】:

我有简单的服务器示例。在我的服务器中,在将响应发送到客户端后,我必须关闭底层的 NET 套接字。我试过了。

var counter = 0;

app.post("/enddev", (req, res) => {
  console.log("REQUEST TO ", req.route.path);

  setInterval(() => {
    console.log(++counter);
  }, 1000);

  setTimeout(() => {
    res.write("upd\r\n");
    res.end();
  }, 1000);

  res.on("finish", () => {
    console.log("Res socket: ", res.socket);
  });
});


server.on("connection", socket => {
  console.log(
    "New connection",
    "Address: " + socket.address().address,
    "Port: " + socket.address().port
  );

  socket.on("timeout", () => {
    console.log("socket timeout");
    socket.end();
  });

  socket.on("error", err => {
    console.log("Socket error: ", err);
  });

  socket.on("close", hadError => {
    console.log(
      hadError
        ? "Socket closed due to ERROR during transmission"
        : "Socket closed"
    );
  });
});

当我运行这个程序时,我观察到套接字在请求发出大约 5 秒后关闭。套接字不会在res.end() 时关闭,而是在 5 秒后关闭。

这是程序运行的控制台快照:

我想在res.end()之后立即关闭套接字。

【问题讨论】:

    标签: node.js http server


    【解决方案1】:

    更好的方法是检查套接字连接是否已经存在。如果没有,那么您应该创建一个连接:

    客户:

    if (!this.socket) {
        this.socket= io("URL", { secure: true });
    }
    

    服务器:

    socket.on('disconnect', () => {
        const userId = socket.userId;
            userOperation.logout(dbConnection, userId);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-10
      • 2012-06-04
      • 1970-01-01
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多