【问题标题】:Cannot connect Java socket server and client无法连接 Java 套接字服务器和客户端
【发布时间】:2014-10-10 19:36:45
【问题描述】:

我正在学习使用 Java 进行套接字编程。使用 Java 8,拥有这个简单的服务器:

import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class Main {
    public static void main(String[] args) throws Exception {
        System.out.println("MY IP address is " + InetAddress.getLocalHost().getHostAddress());
        ServerSocket server     = new ServerSocket(4031);
        Socket socket           = server.accept();
        System.out.println("Yay somebody connected! " + socket);
        socket.close();
        server.close();
    }
}

它所做的只是显示主机的地址,然后等待套接字连接。

还有这个客户:

import java.net.Socket;

public class Main {
    public static void main(String[] args) throws Exception {
        System.out.println("Trying to connect...");
        Socket s = new Socket("123.456.7.890", 4031);
        System.out.println("Cool");
        s.close();
    }
}

当我在我家(在两台不同的计算机上)运行服务器和客户端时,这是可行的:我只需获取服务器显示的 IP 地址,将其提供给客户端,然后建立连接。

现在我家里有同样的服务器,而我在办公室运行我的客户端。在同样的过程中,我将服务器打印的 IP 地址提供给我的客户端。但是,连接永远不会建立:服务器或客户端都不会生成套接字。

  • 适用于 Java 7 和 8。
  • 尝试了几个不同的端口。
  • 不抛出异常。两个程序都挂在那里等待。
  • 我在两台机器上都使用 Mac OSX Mavericks 10.9.5。
  • 两台机器上的防火墙均已关闭。
  • 他们确实连接到互联网。事实上,我使用 Chrome 远程桌面来控制服务器并检查其状态。
  • 当两台机器都在同一个房子里时,这可以正常工作。但当一个人在家里,另一个人在其他地方时,情况就不同了。
  • 是的,这也适用于 localhost。

以上几点似乎表明问题出在我用来连接服务器的 IP 地址上。也许InetAddress.getLocalHost().getHostAddress() 不适合这个 - 虽然它让我感到困惑,为什么这可以在同一个房子里的两台机器上工作。

我做错了什么?

【问题讨论】:

  • 在您的问题中发布堆栈跟踪。总是。此代码不会永远阻塞。我怀疑您遇到了连接超时。它发生在一分钟左右后。也许你不够耐心。
  • @Voldemort,您是否进一步分析了问题?

标签: java sockets networking


【解决方案1】:

你说你的防火墙在两台机器上都关闭了,但你也必须确保

  1. 您连接到您的公共 IP。您的服务器报告的 IP 可能是您通过 DHCP 从路由器收到的 LAN IP

  2. 您还必须确保您的路由器配置为将连接到您的公共 IP 的端口 4031 转发到您的服务器的 IP(而不是到您本地网络上的其他机器)。

最后,您的 ISP 禁止在家中设置服务器的风险很小。在这种情况下,它们可能非常邪恶,以至于它们会阻止传入的连接。

【讨论】:

  • 奇怪的是,当我使用公网IP时,即使服务器和客户端都在同一台机器上,它也不起作用。我想问题出在路由器上 - 我不确定如何配置它,但我现在看看。
  • 您无法从您的网络中连接到您的公共 IP,这并不奇怪。
  • 这里有一个很好的配置端口转发的资源:@​​987654321@
  • @Voldemort 你确定你有 ISP 分配给你的“公共 IP”吗?如果没有,'office-home' 连接将无法工作,除非你可以建立从家到办公室的 ssh 隧道(如果是这样,你可以使用'ssh port forwarding')。请记住,大多数情况下,办公室网络管理员不会掉以轻心,除非在工作中明确允许这样做(即,您已向网络管理员询问过此事)。
  • 我不知道需要端口转发,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-05
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
  • 2012-07-24
  • 1970-01-01
  • 2014-06-04
相关资源
最近更新 更多