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没问题,很高兴它起到了作用:)