Nodejs net.socket 关闭问题讨论

发布于 1周前 作者 yuanlaile 来自 nodejs/Nestjs

代码大概是这样的

let s: Socket;

//之前 查阅资料后发现不优雅 不发送 FIN 包 s.destroy();

//现在 使用 end 在销毁 s.end(() => s.destroy());

//现在这个 s 依旧没有立即销毁,还能收到数据,需要在等一会才会关闭

有没有好的解决方案


Nodejs net.socket 关闭问题讨论
11 回复

谁说 socket.destroy() 不会发送 FIN 的?我抓包看了会发。


那就是我不够严谨了 我在谷歌搜了别人的回答是这么说的…

但是发了 destroy 之后 这个连接还开着 这就有点麻烦了

https://stackoverflow.com/questions/9191587/how-to-disconnect-from-tcp-socket-in-nodejs
但调用时 socket.destroy ,客户端连接会在没有强行接收 FIN 包的情况下被破坏。最好的做法是 socket.destroy 尽可能避免致电。

end 发送 fin 后,客户端暂时不给你回 fin2 而是继续发送数据,那你就是能继续收到数据的啊,就算客户端立刻关闭,那已发送的数据就应该继续收完了,本来你就需要等 close 事件,没啥问题啊,否则你直接 destory 就好了

tcp 四次挥手没学好?


他说的也不是不发送 FIN ,而是不等对端发送 FIN 就关闭。
他也没有给出避免使用 socket.destroy() 的理由。具体用不用当然要看用途,比如你的客户端收到了一大堆错误数据,那用 socket.destroy() 关闭并没什么问题,难不成还只能用 socket.end() 然后等半天对方发完错误数据?

我试试。还没发现这个 api

我觉得你是对的 这个 api 非常有用 可以快速的关闭这个连接 并且提醒对方也关闭这个连接

找到了一个更合适的 api .destroySoon()

在Node.js中,使用net模块创建和管理TCP套接字时,正确关闭套接字是一个重要环节,以确保资源得到释放并避免潜在的内存泄漏或连接泄漏。

当你创建一个套接字(socket)后,通常会在数据传输完成后或发生错误时关闭它。以下是一个简单的示例,展示了如何创建TCP服务器和客户端,并在适当的时候关闭套接字:

// 服务器代码
const net = require('net');
const server = net.createServer((socket) => {
  socket.on('data', (data) => {
    console.log('Received:', data.toString());
    socket.write('Message received');
    // 关闭连接
    socket.end('Server closing connection\n');
  });

  socket.on('end', () => {
    console.log('Client disconnected');
  });
});

server.listen(8080, () => {
  console.log('Server listening on port 8080');
});

// 客户端代码
const client = net.createConnection({ port: 8080 }, () => {
  console.log('Connected to server');
  client.write('Hello, server!');
  // 关闭连接
  client.end();
});

client.on('end', () => {
  console.log('Disconnected from server');
});

在上述代码中,服务器在接收到数据后通过socket.end()方法关闭连接,并发送一条关闭消息。客户端在连接建立后立即发送一条消息,然后通过client.end()方法关闭连接。socket.on('end')事件监听器用于处理连接关闭事件。

确保在所有可能的执行路径上调用socket.end()socket.destroy()来关闭套接字,这是管理Node.js中TCP连接的关键。

回到顶部