【问题标题】:Java Socket Timesout when I try connecting to server with external IP当我尝试使用外部 IP 连接到服务器时 Java 套接字超时
【发布时间】:2015-05-10 10:33:37
【问题描述】:

我正在尝试制作一个支持多人的简单乒乓球游戏,但是当我尝试使用我的外部 IP 连接到服务器应用程序时它失败了。

我的尝试

localhost、127.0.0.1 和 192.168.0.10 都可以工作。

当我使用外部工具检查我的端口是否打开时,如果我的服务器正在运行,它总是会立即返回 true。

关闭防火墙或添加例外没有帮助。

ping 我的外部 IP 会返回即时响应。

Java 中的套接字创建代码和异常

服务器套接字创建

serverSocket = new ServerSocket(7777);
for(;;){
    socket = serverSocket.accept();
}

客户端套接字创建

socket = new Socket(IP, 7777);

客户端抛出异常

java.net.ConnectException: Connection timed out: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at Client.<init>(Client.java:93)
    at Client.main(Client.java:153)

【问题讨论】:

  • 你能ping到这个服务器吗?
  • @mr.icetea 是的,我可以
  • 您的网络拓扑是什么样的(您的客户端和服务器之间是否有任何路由器、NAT 网关等 - 听起来您的服务器位于 NAT 网关后面,而您尚未配置网关正确地将 TCP 端口转发到您的服务器)?或者,你的IP地址是什么,你的服务器的IP地址是什么,你的客户端使用哪个IP地址联系服务器?
  • @DavisEllwood 你是在说你 1. 启动服务器 2. 在与服务器相同的机器上启动客户端,但指示客户端连接到您的外部互联网可路由 IP 地址而不是 127.0。 0.1 ?如果是这样,我假设您在家庭网络上,可能使用 DSL,并带有一个对您的本地网络进行 NAT 以访问互联网的盒子。如果是这样,您的设置通常不起作用,因为大多数消费者 NAT 网关不处理尝试连接到外部 IP 的内部设备,该外部 IP 是端口转发回内部网络。
  • @DavisEllwood 不,一点也不。 Ping 与 NAT'ig TCP 连接完全不同。平应该工作。通过外部 IP 地址对内部 TCP 连接进行 NAT 通常不起作用。这是特定于供应商的,您可以通过适当的配置使其与某些设备和大多数高端设备(例如 cisco/juniper)一起使用,但不是您的 ISP 提供的常见廉价家用路由器/调制解调器

标签: java sockets


【解决方案1】:

根据您告诉我们的情况,设置如下所示:

  • 您已将端口 7777 从 外部 IP 转发到 内部 IP B
  • 您的服务器侦听内部 IP B 和 127.0.0.1
  • 您的客户端成功连接到内部 IP B:7777 和 127.0.0.1:7777
  • 如果您将客户端指向 外部 IP:7777
  • ,您的客户端将无法连接

此设置不适用于大多数家庭路由器/NAT 网关,它们不会端口转发发往来自内部网络本身的外部 IP 的 TCP 连接 - 它只会端口转发实际来自外部(互联网)。

【讨论】:

  • 感谢您为我澄清这一点。
【解决方案2】:

您是否尝试过接受连接客户端? 通过 serverSocket 的 accept 方法

boolean isStopped = false;
while(!isStopped){
    Socket clientSocket = serverSocket.accept();

【讨论】:

  • 如果他没有,那也没什么区别。在防火墙允许的情况下,监听端口就足以让连接成功。
【解决方案3】:

连接超时意味着您的客户端没有得到其请求的响应,可能的问题是:

a) IP/域或端口不正确

b) IP/域或端口(即服务)已关闭

c) IP/域的响应时间超过您的默认超时时间

d) 您有防火墙阻止您使用的任何端口上的请求或响应

e) 您的防火墙阻止了对该特定主机的请求

f) 您的互联网访问已关闭

请注意,您的 ISP 可能会设置防火墙和端口或 IP 阻止

【讨论】:

  • (a) 或 (b) 会导致“连接被拒绝”,而 (f) 根本不会导致问题。
猜你喜欢
  • 1970-01-01
  • 2019-06-25
  • 2013-11-30
  • 1970-01-01
  • 2015-11-14
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 2011-08-07
相关资源
最近更新 更多