UDP 通信因实现语言而异
UDP communication varies depending on implementation language
简介
我对通过 UDP 通信但不需要任何端口转发的多人游戏感兴趣。所以我试图通过自己的实现来实现这一点。
我不需要点对点网络。我只希望单个客户端可以向服务器发送消息,然后服务器可以向所有其他客户端发送消息。
服务器实现(Node.js)
服务器在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)
其中一个 客户端 也在 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 脚本时,会向服务器发送一条 "Welcome" 消息。服务器然后回复此消息。
所有这些都工作得很好。它还适用于 3G 连接。
客户端实现 (C#)
由于我想在Unity3D中使用它,我需要用C#实现客户端。所以我使用了 MSDN 中的这个例子:MSDN UDP Documentation
问题
下面是我不明白的地方。当我使用 Node.js 客户端时,服务器从我在 Node.js (3001) 中定义的端口接收消息。当我使用 C# 客户端时,端口似乎是随机的。这导致了我永远不知道我必须用 C# 客户端监听哪个端口的问题。
所以我只看到消息来自带有 Node.js 客户端的服务器,而不是来自 C# 客户端的消息。
我还看到,私有网络和 public 网络中的端口号不一样。对于 Node.js 客户端,他们似乎是。
问题
那么我是不是理解了整个 UDP 通信的错误,还是我只是实施了错误?
UdpClient 有一个采用端口的构造函数重载。您可以使用此重载来指定端口号。
UdpClient udpClient = new UdpClient(3001);
将构造函数留空或将其设置为 0 会使 UdpClient select 成为一个随机可用的端口号。
简介
我对通过 UDP 通信但不需要任何端口转发的多人游戏感兴趣。所以我试图通过自己的实现来实现这一点。 我不需要点对点网络。我只希望单个客户端可以向服务器发送消息,然后服务器可以向所有其他客户端发送消息。
服务器实现(Node.js)
服务器在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)
其中一个 客户端 也在 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 脚本时,会向服务器发送一条 "Welcome" 消息。服务器然后回复此消息。 所有这些都工作得很好。它还适用于 3G 连接。
客户端实现 (C#)
由于我想在Unity3D中使用它,我需要用C#实现客户端。所以我使用了 MSDN 中的这个例子:MSDN UDP Documentation
问题
下面是我不明白的地方。当我使用 Node.js 客户端时,服务器从我在 Node.js (3001) 中定义的端口接收消息。当我使用 C# 客户端时,端口似乎是随机的。这导致了我永远不知道我必须用 C# 客户端监听哪个端口的问题。
所以我只看到消息来自带有 Node.js 客户端的服务器,而不是来自 C# 客户端的消息。
我还看到,私有网络和 public 网络中的端口号不一样。对于 Node.js 客户端,他们似乎是。
问题
那么我是不是理解了整个 UDP 通信的错误,还是我只是实施了错误?
UdpClient 有一个采用端口的构造函数重载。您可以使用此重载来指定端口号。
UdpClient udpClient = new UdpClient(3001);
将构造函数留空或将其设置为 0 会使 UdpClient select 成为一个随机可用的端口号。