Java套接字通过Internet超时

我创建了一个小型聊天程序,当客户端和服务器在同一台计算机(也可能是网络)上运行时,它可以完美运行。 但是,只要我尝试通过互联网连接到另一台计算机,套接字连接就会超时。 这是因为防火墙/路由器等吗?

我如何通过互联网连接ServerSocket和Socket?

但是,只要我尝试通过互联网连接到另一台计算机,套接字连接就会超时。 这是因为防火墙/路由器等吗?

是的,很有可能。 您遇到了NAT问题:基本上,相同的外部可见IP地址映射到许多内部可见的端点,而外部端点不知道给您的套接字请求的内部端点。

最简单的方法是让你的客户连接到他们都可以看到的第三方,然后让第三方调解通信。 例如,这就是大多数即时消息传递协议的工作方式。

如果您无法控制这样的第三方实体,则直接连接两个客户端的替代方法是让两个客户端打开一个商定的端口,然后将该端口上的通信映射到它们自己的内部端点。 这提供了外部可见端点(例如您的家庭路由器)需要将通信传递到其预期目的地的缺失链接。

如果您的服务器位于NAT路由器盒后面(并且大多数家用计算机都在,特别是如果您使用WiFi),那么除非您将路由器设置为端口转发到该服务器,否则无法从外部访问它。

什么是您的服务器计算机的IP? 如果它是192.168.xx或10.xxx,那么它是一个不可路由的地址,无法从外部到达。

假设在同一台计算机上运行,​​则意味着您告诉客户端服务器位于127.0.0.1 / localhost,它应该不是您的代码中的问题,而是因为防火墙或路由器。 如果您的服务器位于执行伪装的路由器后面(例如,服务器没有公共但私有IP地址,例如192.168.xy),则必须配置路由器以将连接从Internet传递到运行该服务器的计算机服务器。

它不起作用的另一个原因可能是您将服务器绑定到接口的方式。 如果在那里指定127.0.0.1,则服务器将仅侦听来自同一系统的请求。 如果您没有指定地址,它将侦听所有接口。

编辑您的评论表明您确实有其他人说的NAT问题。 相应地配置路由器可能是最简单的解决方案。

首先,测试它是否真的在LAN上运行; 听起来你只是假设它。

如果它在您的本地网络上工作,也许它失败了,因为服务器缺少公共IP,并且正在NAT路由器后面运行。