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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了客户端只能在同一台计算机上连接到服务器相关的知识,希望对你有一定的参考价值。

我正在尝试创建一个多人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();
答案
    try {
    socket = new Socket("localhost", 3251);
} catch (IOException e) {
    e.printStackTrace();
}

“localhost”表示您的客户端计算机正在同一台计算机上查找服务器。这应该是服务器IP,即192.168.0.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:用于通信的端口。假设主机有两个NIC,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访问它。如果你绑定localhost(aka Loopback address),它只能被该主机上的客户端访问。如果要运行仅限于该主机上的客户端的服务器,这将非常有用。

以上是关于客户端只能在同一台计算机上连接到服务器的主要内容,如果未能解决你的问题,请参考以下文章

连接到在另一台计算机上作为 Windows 服务运行的 WCF

创建一个仅限本地的端口以在同一台计算机上的进程之间进行通信?

将VM客户端连接到我的计算机C#上的服务器

计算机无法连接到远程计算机上的另一个控制台会话,您正在运行一个控制台会话,怎么办?

如何从另一台计算机连接到JavaDB?

计算机无法连接到远程计算机上的另一个控制台会话,您正在运行一个控制台会话