客户端只能在同一台计算机上连接到服务器
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或其他东西。
你有两个问题:
- 在服务器上,您正在创建
this.serverSocket.bind(new InetSocketAddress("localhost",port));
。这将在localhost
解析为的IP地址上创建一个服务器套接字。这可能是个问题。在大多数主机上,localhost
将解析为127.0.0.1
一个环回地址,而你的服务器套接字只会监听它。为了能够监听该机器上的所有NIC,请使用new InetSocketAddress(port)
see the java doc作为此构造函数。或者发现并使用服务器的特定主机名。 - 就像@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
创建一个仅限本地的端口以在同一台计算机上的进程之间进行通信?