发送响应后如何关闭底层套接字?

时间:2018-12-17 13:30:32

标签: node.js http server

我有一个简单的服务器示例。在我的服务器中,响应发送到客户端后,我必须关闭基础的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秒后关闭。

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

enter image description here

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

1 个答案:

答案 0 :(得分:0)

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

客户:

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

服务器:

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