您是不是必须在 Node.js 中关闭 UDP (dgram) 客户端,还是可以重用它?
Posted
技术标签:
【中文标题】您是不是必须在 Node.js 中关闭 UDP (dgram) 客户端,还是可以重用它?【英文标题】:Do you have to close a UDP (dgram) client in Node.js or can you reuse it?您是否必须在 Node.js 中关闭 UDP (dgram) 客户端,还是可以重用它? 【发布时间】:2012-06-18 10:43:24 【问题描述】:The docs(以及我看过的许多库)似乎表明您每次发送时都会关闭客户端:
var dgram = require('dgram');
var message = new Buffer("Some bytes");
var client = dgram.createSocket("udp4");
client.send(message, 0, message.length, 41234, "localhost", function(err, bytes)
client.close();
);
老实说,我对 UDP 的内部工作原理了解不多,但是每次要发送 UDP 数据包时,什么会阻止您仅重用 client
?你有到close()
了吗?
我已经在localhost
上对其进行了测试(即重用客户端),它可以很好地发送多个数据包(至少到同一个目的地),但这还不足以让我确信它会在广阔的世界中一切安好。
The source of send() 调用 _startReceiving()
函数,该函数“绑定到随机端口”,然后“开始接收” - 但我不清楚这里应该接收什么,因为我们实际上是在发送。无论如何,这足以让我认为留住客户可能存在问题......我只是不确定它们是什么。
【问题讨论】:
【参考方案1】:您可以为多个请求重用一个 udp 套接字。例如,在多个测试中也可以看到这种行为: https://github.com/joyent/node/blob/master/test/simple/test-dgram-pingpong.js
udp 套接字绑定到一个随机端口,因为它必须使用端口指定源地址。
【讨论】:
在测试代码上很好的发现!那么什么时候需要“关闭”呢?即使您发送到不同的主机/端口,您能否保持打开状态?您能否只为您的整个应用程序打开一个“客户端”? 到目前为止,我还没有显式关闭客户端/套接字,并且能够很好地重用它,所以我认为这个答案是正确的 您好,您在使用节点集群时关闭 udp 连接时是否遇到过 100% cpu 的问题? github.com/joyent/node/issues/7590【参考方案2】:有3种情况需要关闭UDP套接字:
-
您将创建另一个绑定到
same
本地端口的套接字,从而避免port in use
问题。
您的对等方正在使用您的本地端口进行响应,而您不再需要这些响应。
您的对等方正在使用您的本地端口作为标识符,而您不再希望与其关联。
【讨论】:
以上是关于您是不是必须在 Node.js 中关闭 UDP (dgram) 客户端,还是可以重用它?的主要内容,如果未能解决你的问题,请参考以下文章