我设置了两台PC,一台是本地网络中的客户端,另一台是公共网络上的服务器。
测试步骤是 -- 1) 端口 33333 上的客户端侦听 udp 2) 端口 22222 上的服务器侦听 UDP 1) 客户端将 udp 发送到服务器 2) 服务器收到数据并发回
当我在我的测试网络上测试代码时,它是正常的。
如果把服务器放在真正的互联网上,服务器可以从客户端获取消息,客户端无法从服务器获得响应。怎么了?
下面是用nodejs测试代码。
服务器var dgram=require('gram');
var socket = dgram.createSocket('udp4');
socket.on('message', function (message, remote) {
console.log('client ip:' + remote.address + ', port:' + remote.port +', message:' + message);
//send response to client
var message = new Buffer("hello, client!");
socket.send(message, 0, message.length, remote.port, remote.address);
});
//listening port
socket.bind(22222);
客户端var dgram=要求('dgram');
var socket = dgram.createSocket('udp4');
socket.on('message', function (message, remote) {
//display message from server
console.log('server ip:' + remote.address + ', port:' + remote.port +', message:' + message);
});
//listening port
socket.bind(33333);
//send message to server
function send(server){
var message = new Buffer("hello, server!");
socket.send(message, 0, message.length, 22222, server, function(){
//send again after 1 seconds
setTimeout(function(){
send(server);
}, 1000);
});
};
//suppose that server address is public.server.com
send("public.server.com");
无法从外部访问NAT计算机,这对于点对点或朋友对朋友软件来说尤其痛苦。基本上是因为你的电脑没有公共IP地址,但你的NAT设备有。所以,NAT是可见的,而你的电脑是不可见的。
服务器从NAT设备获取数据包,并向其发送响应。是的,NAT接收到响应,它必须把它转发给你的PC,这就是诀窍。为此,您必须在NAT中配置端口转发。
NAT有一个如下表:
+----------+---------------------+---------------+
| NAT PORT | INTERNAL IP ADDRESS | INTERNAL PORT |
+----------+---------------------+---------------+
| 33333 | 198.162.0.3 (pc ip) | 33333 |
它可以被理解为:当NAT在其端口#33333接收到一个包时,它必须被重定向到内部IP 198.162.0.3(你的PC IP地址)和端口# 33333。
如果您的PC使用固定IP,您可以在NAT中手动执行此映射。但是,如果您使用DHCP服务器,您的PC的IP可能会在每次重新启动后更改,因此您需要在项目中通过软件进行此映射。大多数NAT支持通用插头
是的,你可以自己做,但这并不容易。事实上,发现过程要求你在局域网中的特定端口广播udp消息。我强烈建议您使用第三方组件来完成这项工作。
我希望这对你有所帮助。