多人网络仅适用于专用网络

时间:2011-08-22 01:39:42

标签: java udp multicast

所以我正在制作一个简单的多人在线小程序游戏,我使用多播UDP套接字而不是典型的客户端 - 服务器连接进行测试。对于这个问题,这并不意味着有效或安全,只是一个实验。唯一的问题是,当我试图让其他人从他们的房子加入游戏时,它不会将它们连接到我,但是当我使用两台独立的计算机时,一台已接通并且一台在wifi上,它无缝地工作。他们可以加入自己的游戏并连接到自己的网络,但不能连接到其他人。我在这里错过了一些大事吗?我会发布相关代码。

InetAddress group;
DatagramPacket packet;
DatagramPacket messagePacket;
MulticastSocket socket;

socket = new MulticastSocket(4446); //random port
group = InetAddress.getByName("228.5.6.7"); //multicast address
socket.joinGroup(group);

//typical code for sending a packet
packet = new DatagramPacket(messageBuf, messageBuf.length, group, 4446);

有什么想法吗?我对网络很陌生,但发现这是一个有趣的挑战,并希望继续学习更多...如果你有任何其他技巧帮助我解决这个问题,我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

你现在可能已经想到了这一点,但是你错过了一个很大的问题。如果您是本地的,它将始终有效,因为您的路由器不介意在专用LAN后面分发数据包。网络外的任何东西都不想工作,因为客户端会尝试向服务器发送数据包,但是服务器在NAT(网络地址转换)后面,并且由于路由器没有看到服务器首先发送数据包,路由器只会丢弃客户端的数据包,永远不会连接。但是,如果服务器发送udp数据包尝试连接,则路由器喜欢切换端口,因此您不知道数据包将从哪个端口出来。这就是路由器上的数据包转发。因此,当客户端发送数据包时,它将转到与预期不同的端口,并且路由器仍然丢弃它。有一些解决方案,如“打孔”。最简单的解决方案是在任何NAT之外使用专用服务器来处理请求。