无法连接Java套接字服务器和客户端

时间:2014-10-10 19:36:46

标签: java sockets networking

我正在学习使用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()不适合这个 - 虽然它让我感到困惑,为什么这可以在同一栋房子里使用两台机器。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

您说两台计算机上的防火墙都已关闭,但您还必须确保

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

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

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