如何在NodeJs中断开TCP套接字连接

47

我使用以下命令在 Node.js 中连接到套接字服务器:

client = net.createConnection()

我应该如何正确地从服务器断开连接?

我尝试了client.end()甚至是client.destroy()

但是当我使用netstat检查连接状态时,它显示连接处于FIN_WAIT2状态。

我该如何完全关闭和销毁连接?


你尝试过 client.close() 吗? - fent
8
没有 client.close 方法。 - mgamer
3个回答

43

8
"结束"和"销毁"有什么区别?在使用"销毁"之后,我也可以在netstat中看到状态为"FIN_WAIT2"的记录。 - mgamer
5
end() 方法只关闭套接字的写入流,远程主机可以保持其写入流的打开状态并向您发送数据。 - bara
5
虽然文档说“只在出现错误时才必要”,但这似乎是关闭连接的唯一方法。对于我自己,我使用类似以下的代码来关闭连接:“socket.close = function(data) { var Self = this; if (data) this.write(data, function(){ Self.destroy(); }); else this.destroy(); };” - Fr0sT
@Fr0sT,你的评论帮了我很多,谢谢 :-* - vahid kargar

41

这是默认的TCP连接终止序列,

enter image description here

通过调用client.end(),Node.js将向服务器发送FIN数据包,并且服务器将响应一个FIN数据包以接受套接字终止。

根据Node.js文档,socket.end的作用是:

半关闭套接字。即,它发送一个FIN数据包。服务器仍然可能发送一些数据。

当收到FIN数据包时,客户端与服务器之间的连接将自动关闭,并触发socket.on('close', .. )事件,并发送ACK。

因此,连接由服务器和客户端共同协商终止,因此服务器能够发送在关闭连接之前可能需要的数据。

但是,如果可能的话,最好避免调用socket.destroy,因为它会强制销毁客户端连接而不接收FIN数据包。

参考资料:


8

我在GNU/Linux下安装了nodejs 11.15.0版本。在这个配置下,断开类似telnet的客户端的唯一方式是调用:

socket.destroy()

socket 上的其他方法已经不存在了(例如:close()disconnect()),同时发出 closeend 事件也不起作用。


那对我起作用了。一个简单的 end() 将需要另一端做出反应,但在我的情况下它没有... - Alexis Wilke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接