您是不是必须在 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) 客户端,还是可以重用它?的主要内容,如果未能解决你的问题,请参考以下文章

在浏览器中关闭 WebSocket 连接时是不是必须手动删除事件侦听器?

在android中关闭麦克风

如果蓝牙在 Android 应用程序中关闭,则通知

是否必须在PLSQL块中关闭游标

使用资产时如何在 Xcode 5 中关闭图标光泽效果?

我是不是需要在 Java 中关闭 IO 流? [复制]