Java:服务器/客户端->客户端/客户端

3
我想在一些计算机之间建立点对点连接,以便用户可以在没有外部服务器的情况下聊天和交换文件。我的第一个想法如下所述:
我在服务器上创建一个中央ServerSocket,所有应用程序都可以连接到该服务器上。该ServerSocket跟踪连接的socket(客户端),并向所有其他客户端提供新连接的客户端的IP地址和端口。 每个客户端都创建一个新的ServerSocket,所有客户端都可以连接到该ServerSocket。
换句话说:每个客户端都有一个ServerSocket,所有其他客户端都连接到它上面。消息应通过图像中的蓝色线路进行传输。
只有一个小问题困扰着我:如果我使用不同的IP地址进行测试,则可以正常工作,但当两个客户端具有相同的(外部)IP地址时,它就无法正常工作了。有人知道解决这个问题的聪明方法吗?
谢谢!Marc
2个回答

3
当主机位于NAT路由器后面并且想要打开一个服务器端口,以便可以从NAT的另一侧访问该端口时,必须配置NAT路由器将此端口上的所有传入连接转发到此主机。
显然,NAT路由器无法为两个侦听同一端口的不同主机进行配置。它无法知道哪个主机应该处理每个传入连接。当NAT后面有两个服务器时,它们必须使用不同的端口,并且必须配置NAT路由器将每个端口转发到每个服务器。
这是点对点网络的已知问题。其结果是仅当他们中至少有一个NAT被配置为端口转发并因此可以作为另一个NAT的服务器时,两个都在NAT后面的客户端之间才可能建立直接连接。
解决方案:
在两个被锁定在不可转发NAT后面的客户端之间建立连接的一种解决方法是添加使用具有服务器功能的第三个客户端作为中间人的能力。
当两个客户端位于同一NAT后面时,它们可以通过中央服务器交换其局域网IP,并使用这些IP相互连接。

我的答案实际上不是一个,所以我添加了两个可能的解决方法。 - Philipp
1
即使没有端口转发,也是可能的,比如Skype就可以做到。当我第一次读到他们是如何做到的时候,我几乎不敢相信它实际上能够工作。如果我记得正确的话,你需要一个服务器来建立连接和交换IP地址。通常,两端的NAT会允许从属于此NAT的客户端初始化的连接通过。现在的难点是让两个NAT都相信各自的客户端启动了连接。我相信这里有描述:http://www1.cs.columbia.edu/~library/TR-repository/reports/reports-2004/cucs-039-04.pdf - Axel
要自行驱动NAT的端口映射,请参考:http://en.wikipedia.org/wiki/Universal_Plug_and_Play#NAT_traversal - Aubin

0
如果您想在互联网上使其工作,您应该查看STUN。我不知道是否有任何可用的“即插即用”库,但本文应该能帮助您入门。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接