Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:服务器/客户端->;客户/客户_Java_Sockets_Networking_Client_P2p - Fatal编程技术网

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

Java:服务器/客户端->;客户/客户,java,sockets,networking,client,p2p,Java,Sockets,Networking,Client,P2p,我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我最初的想法如下: 我在服务器上创建了一个中央服务器套接字,所有应用程序都可以连接到该套接字。此ServerSocket跟踪已连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。 每个客户端都创建一个新的ServerSocket,所有客户端都可以连接到它 换句话说:每个客户端都有一个ServerSocket,所有其他客户端都连接到它。信息应通过图像中的蓝线传递 我只遇到了一个小问题

我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我最初的想法如下:

我在服务器上创建了一个中央服务器套接字,所有应用程序都可以连接到该套接字。此ServerSocket跟踪已连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。 每个客户端都创建一个新的ServerSocket,所有客户端都可以连接到它

换句话说:每个客户端都有一个ServerSocket,所有其他客户端都连接到它。信息应通过图像中的蓝线传递

我只遇到了一个小问题:如果我通过所有不同的IP地址来测试,它可以正常工作,但是当两个客户端具有相同的(外部)IP地址时,它就不再工作了。有人知道一个聪明的解决方案吗


谢谢!Marc

当主机位于NAT路由器后面,并且想要打开一个应该可以从NAT另一端访问的服务器端口时,NAT路由器必须配置为将该端口上的所有输入连接转发到此主机

显然,NAT路由器不能配置为对两个侦听同一端口的不同主机执行此操作。它不知道应该由哪个主机来处理每个输入连接。当NAT后面有两台服务器时,它们必须使用不同的端口,并且NAT路由器必须配置为将每个端口转发到每个服务器

这是对等网络的一个已知问题。其结果是,只有当至少一个NAT配置为端口转发,从而可以充当另一个NAT的服务器时,两个NAT后面的客户端之间才可能直接连接

解决方案:

连接被锁定在非转发NAT后面的两个客户端的一个解决方法是增加使用第三个客户端的能力,该客户端可以作为它们之间的中间人


当两个客户端位于同一NAT后面时,它们可以通过中央服务器交换LAN IP,并使用这些IP相互连接。

如果您试图通过internet实现这一点,请参阅。我不知道是否有任何可用的“随时可用”库,但这篇文章应该让您开始学习。

我的答案不是一个,所以我添加了两个可能的解决方法。即使没有端口转发,也有可能,例如skype。当我第一次读到他们是如何做到这一点的时候,我简直不敢相信它真的有效。如果我没记错的话,您需要一台服务器来建立连接和交换IP地址。通常,任何一方的NAT都会让流量通过从属于该NAT的客户端实例化的连接。最难的部分是使两个NAT都相信各自的客户端启动了连接。我相信这里已经描述过了:为了让自己了解NAT的端口映射: