Javascript 不同端口上有多个UDP套接字?

Javascript 不同端口上有多个UDP套接字?,javascript,node.js,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) }

我有以下代码:

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);
}
var dgram=require(“dgram”);
var start=27015;
对于(变量i=开始;i<(开始+100);i++)
{
var server=dgram.createSocket(“udp4”);
server.on(“消息”,函数(消息,发送者){
console.log(server.address().port)
});
服务器绑定(i);
}
为什么它总是输出最后一个端口(27114)

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


谢谢。

您已经成为可变提升和词汇范围的受害者

您的代码与此等效:

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)
    });

}
var dgram=require(“dgram”);
var start=27015;
var i;
var服务器;
对于(i=开始;i<(开始+100);i++)
{
server=dgram.createSocket(“udp4”);
server.on(“消息”,函数(消息,发送者){
console.log(server.address().port)
});
}
这意味着
server
始终是回调内部对服务器的最后一个赋值(从技术上讲,它将是执行回调时
server
指向的任何值——除非在绑定期间调用它,否则它始终是最后一个值)


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

使用闭包捕获回调的
服务器:

server.on("message", (function (server) {
    return function (msg, sender) {
        console.log(server.address().port);
    };
})(server));
我不确定
方法上的
是如何工作的,但在正常的JavaScript事件处理中,
这个
指的是事件应用到的对象。因此,您可能可以忘记闭包,只需使用
this.address().port
引用事件发生的特定
服务器

另一种设置方法是:

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

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

伊恩在正确的轨道上-你需要结束。但是,他的方式将导致服务器取消引用

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);
 }
for(var i=start;i<(start+100);i++){
(功能(端口){
var server=dgram.createSocket(“udp4”);
server.on(“消息”,函数(消息,发送者){
console.log(server.address().port)
});
服务器绑定(端口);
})(i) );
}

这将导致每个
服务器
实例在闭包中被隔离,但不会被解除引用。它们将保持存在,不会因作用域问题而被覆盖。

你是说它只绑定到端口27114吗?@Freedom\u Ben,没有服务器成功绑定到所有100个端口。@SébastienRenauld你是什么意思?嗯,两种不同的方法。我已经提升了
端口
,而您提升了
服务器
本身。两者都会起作用。删除我的,因为我们的方法在工作方式上完全相同。@SébastienRenauld好吧,让我们来谈谈。(我想你可以看到对你删除的答案的评论)。我认为唯一的问题是事件处理程序是异步执行的,当它执行时,
server
(回调内部)引用了从for循环创建的最后一个。因此,我认为这与
端口
没有任何关系。虽然循环中的端口应始终与
server.address().port
相同,但它可能是安全的。但对我来说,你应该得到活动目标的参考(以防他们想要的不仅仅是港口)。@WasimAbu Nassar没问题,很高兴它起到了作用:)