不同端口上的许多UDP套接字?

时间:2013-05-15 20:09:28

标签: javascript node.js

我有以下代码:

var dgram = require("dgram");

var start = 27015;

for(var i = start; i < (start + 100); i++)
{
    var server = dgram.createSocket("udp4");

    server.on("message", function(msg, sender) {
        console.log(server.address().port)
    });

    server.bind(i);
}

为什么它始终输出最后端口(27114)?

怎么了?我认为这有助于识别接收服务器的端口。

谢谢。

3 个答案:

答案 0 :(得分:3)

使用闭包来捕获回调的server

server.on("message", (function (server) {
    return function (msg, sender) {
        console.log(server.address().port);
    };
})(server));

我不确定on方法的工作原理,但在正常的JavaScript事件处理中,this指的是事件适用的对象。因此,您可能会忘记关闭,只需使用this.address().port来引用事件发生的特定server

设置它的另一种方法是:

server.on("message", getOnHandler(server));

function getOnHandler(s) {
    return function (msg, sender) {
        console.log(s.address().port);
    };
}

答案 1 :(得分:3)

伊恩走在正确的轨道上 - 你需要一个关闭。但是,他的方式会导致服务器取消引用。

for(var i = start; i < (start + 100); i++) {
  (function(port) {
    var server = dgram.createSocket("udp4");

    server.on("message", function(msg, sender) {
     console.log(server.address().port)
    });
    server.bind(port);
  })(i);
 }

这将导致每个server实例在闭包内被隔离但不会被解除引用。它们将保持现有状态,而不会被范围问题覆盖。

答案 2 :(得分:1)

你已经成为变量提升和词汇范围的牺牲品。

您的代码与此相同:

var dgram = require("dgram");
var start = 27015;
var i;
var server;

for(i = start; i < (start + 100); i++)
{
    server = dgram.createSocket("udp4");

    server.on("message", function(msg, sender) {
        console.log(server.address().port)
    });

}

这意味着server始终是回调中服务器的最后一个赋值(从技术上讲,它将是执行回调时指向的任何值server - 除非虽然它在绑定期间被调用,但它总是最后一个。)

您可以使用Ian建议的闭包,但我怀疑this也将设置为回调内的服务器。 (或者至少是某种方式来访问它。你必须检查文档。)