客户端只能在同一台计算机上连接到服务器

时间:2018-09-16 13:00:36

标签: java server localhost socketserver

我正在尝试创建一个多人Java游戏,并决定使用Java套接字服务器。当它们都在我的计算机上运行时,“客户端”能够完美地连接并与服务器通信,但是当我将客户端文件发送到另一台计算机(连接到同一网络)时,它就无法连接到服务器,我不知道为什么。我运行了cmd并使用了netstat -a代码,并能够确认服务器正在侦听127.0.0.1:3251,所以我认为问题出在客户端。

这是创建服务器的方式:

    try {
        this.serverSocket = new ServerSocket();
        this.serverSocket.bind(new InetSocketAddress("localhost",port)); //port is 3251
        window.show("SERVER: " + "Created On Port: " + port);
    } catch (IOException e) {
        window.show("SERVER: " + e.getMessage());
        window.show("SERVER: " + "Unable To Create Server :(");
    }

这是客户端连接的方式:

    try {
        socket = new Socket("localhost", 3251);
    } catch (IOException e) {
        e.printStackTrace();
    }

服务器接受连接后,它将创建一个新线程:

        Socket socket = this.serverSocket.accept();
        ServerThread serverThread = new ServerThread(socket);
        serverThread.start();

2 个答案:

答案 0 :(得分:2)

    try {
    socket = new Socket("localhost", 3251);
} catch (IOException e) {
    e.printStackTrace();
}

“ localhost”表示您的客户端计算机正在同一台计算机上寻找服务器。这应该是服务器IP,即192.168.0.2或其他名称。

答案 1 :(得分:2)

您有两个问题:

  1. 您正在服务器上创建this.serverSocket.bind(new InetSocketAddress("localhost",port));。这将创建一个服务器 localhost解析到的IP地址上的套接字。这可能是个问题。在大多数主机上 localhost将解析为127.0.0.1个环回地址,您的 服务器套接字只会监听。能够听所有 该计算机上的NIC将new InetSocketAddress(port) see the java doc用于此构造。或发现并使用服务器的特定主机名。
  2. 就像@Nick Eu指出的那样,您尝试在客户端上连接localhost上的服务器。您需要一种配置客户端的方法,以便它知道服务器在哪里并使用它。

要进一步阐明这一点: socket是用于通信的IP:端口。假设主机有两个网卡,其IP为192.168.2.1和10.0.0.2。现在,如果您将服务器套接字(例如8000)绑定到192.168.2.1 IP。只有使用此组合192.168.2.1:8000才能访问此端口,类似地,如果将其绑定到10.0.0.2 IP,则只能通过该IP对其进行访问。而且,如果您绑定本地主机(又名Loopback address),则该主机上的客户端只能访问它。如果要运行仅限于该主机上的客户端的服务器,这将很有用。