我对通过UDP进行通信但不需要任何端口转发的多人游戏感兴趣。所以我试图用自己的实现来实现这一点。 我不需要点对点网络。我只是希望单个客户端可以向服务器发送消息,然后服务器可以向所有其他客户端发送内容。
服务器在Node.js中实现,如下所示:
var socket = require( "dgram" ).createSocket( "udp4" );
socket.on( "message", function ( message, requestInfo ) {
var response = new Buffer("Welcome " + requestInfo.address + ":" + requestInfo.port);
socket.send(response,0,response.length,requestInfo.port,requestInfo.address,
function( error, byteLength ) {
console.log( "Welcomed " + requestInfo.address + ":" + requestInfo.port );
}
);
}
);
socket.on( "error", function ( error ) {
socket.close();
}
);
socket.on( "listening", function () {
var address = socket.address();
console.log("Listening on " + address.address + ":" + address.port);
}
);
socket.bind(3000);
所以服务器正在侦听端口3000.我在连接服务器和互联网的rooter上转发了这个端口。 (当使用UDP打孔技术时,它有点像集合点服务器)
其中一个客户端也在Node.js中实现,如下所示:
var socket = require( "dgram" ).createSocket( "udp4" );
socket.on( "message", function ( message, requestInfo ) {
console.log(requestInfo.address + ":" + requestInfo.port + ": " + message);
}
);
socket.on( "error", function ( error ) {
socket.close();
}
);
socket.on( "listening", function () {
var address = socket.address();
console.log( "Listening on " + address.address + ":" + address.port );
var response = new Buffer("Hi Dude! Here is " + address.address + ":" + address.port);
var host = "WWW.XXX.YYY.ZZZ";
var port = 3000;
socket.send(response,0,response.length,port,host,
function( error, byteLength ) {
console.log( "Introduced to " + host + ":" + port);
}
);
}
);
socket.bind(3001);
当启动此Node.js脚本时,"欢迎"消息被发送到服务器。然后服务器回答此消息。 所有这一切都很好。它也适用于3G连接。
由于我想在Unity3D中使用它,我需要在C#中实现客户端。所以我在MSDN上使用了这个例子:MSDN UDP Documentation
现在这是我无法理解的。当我使用Node.js客户端时,服务器从Node.js(3001)中定义的端口接收消息。当我使用C#Client时,端口似乎是随机的。这导致了一个问题,我从来不知道我必须用C#客户端监听哪个端口。
所以我只看到来自服务器的消息与Node.js客户端,但不是C#客户端。
我还读到私有网络和公共网络中的端口号不一样。使用Node.js客户端,它们似乎就是这样。
所以我对整个UDP通信事情有所了解,或者我只是实现了错误?
答案 0 :(得分:0)
UdpClient有一个带端口的构造函数重载。您可以使用此重载来指定端口号。
UdpClient udpClient = new UdpClient(3001);
将构造函数留空或将其设置为0会使UdpClient选择一个随机可用的端口号。