我想在某些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我的第一个想法如下:
我在服务器上创建一个中央ServerSocket,所有应用程序都可以连接到该服务器。此ServerSocket跟踪连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。 每个客户端都创建一个新的ServerSocket,所有客户端都可以连接到该ServerSocket。
换句话说:每个客户端都有一个ServerSocket,其中所有其他客户端都连接到它。消息应该通过图像中的蓝线。
我运行的只有一个小问题:如果我通过所有不同的IP地址测试它,它工作正常,但当两个客户端具有相同(外部)IP地址时,它不再起作用。有人知道这个聪明的解决方案吗?
谢谢!马克
答案 0 :(得分:3)
当主机位于NAT路由器后面并且想要打开一个应该可以从NAT的另一端访问的服务器端口时,NAT路由器必须配置为将此端口上的所有接入连接转发到此主机。
显然,NAT路由器无法配置为侦听同一端口的两个不同主机执行此操作。它无法知道哪个主机应该处理每个接入连接。当NAT后面有两台服务器时,它们必须使用不同的端口,并且必须配置NAT路由器以将每个端口转发到每个服务器。
这是对等网络的已知问题。其结果是,只有当其中至少一个NAT配置为端口转发时,才能在两个客户端之间直接连接,这两个客户端都在NAT之后,因此可以充当另一个的服务器。
<强>解决方案:强>
连接两个锁定在非转发NAT后面的客户端的解决方法是添加使用第三个客户端的能力,该第三个客户端是服务器能力的中间人。
当两个客户端在同一个NAT后面时,他们可以通过中央服务器交换他们的LAN IP并使用它们相互连接。
答案 1 :(得分:0)
如果您尝试通过互联网进行此操作,则应查看STUN。我不知道是否有任何“可随时使用”的库,但本文应该可以帮助您入门。