首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java:服务器/客户端->客户端/客户端

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

Stack Overflow用户
提问于 2012-11-23 21:27:42
回答 2查看 977关注 0票数 3

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

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

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

我只有一个小问题:如果我通过所有不同的IP地址测试它,它工作得很好,但当两个客户端有相同的(外部)IP地址时,它就不再工作了。有没有人知道一个聪明的解决方案?

谢谢!Marc

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-23 21:58:59

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

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

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

解决方案:

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

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

票数 3
EN

Stack Overflow用户

发布于 2012-11-23 21:59:11

如果你想在互联网上做到这一点,你应该看看STUN。我不知道是否有“即用即用”的库可用,但这篇文章应该可以帮助您入门。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13530106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档