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

标签 java sockets networking client p2p

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

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

enter image description here

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

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

谢谢!马克

最佳答案

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

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

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

解决方案:

连接锁定在非转发 NAT 后面的两个客户端的解决方法是添加使用具有服务器能力的第三个客户端作为它们之间的中间人的能力。

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

关于Java:服务器/客户端 -> 客户端/客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13530106/

相关文章:

java - 基本压缩算法中计算的一个额外字符

c - 多次 Recv 调用 Socket C 编程

linux - 获取打开的连接数

networking - 在 ip(IPv4) 数据报中传输位

java - Java 中的套接字编程

networking - Vagrant:如何在 Vagrantfile 中配置多个网卡?

java - 返回一个使用最终原语的匿名类。它是如何工作的?

java - 解析 JSON 时出现错误

java - 将子实体持久化操作级联到其父实体

c - 无法通过同一网络连接到不同机器上的套接字