为什么我的客户端 Socket 没有连接到我的 ServerSocket?
Why does my client Socket not connect to my ServerSocket?
在这个极其基本的 client/server 套接字程序中,为什么我的客户端套接字永远不会连接并抛出 java.net.ConnectException
?我 运行 在一台计算机上安装 MessageServer 程序,在同一网络上的另一台笔记本电脑上安装 ClientServer 程序。我已经使用该计算机上 windows cmd 中的 ipconfig 命令验证了 运行 连接服务器程序的计算机的本地 IP 是 10.0.0.1。
服务器:
package server;
import java.net.*;
import java.io.*;
public class MessageServer {
public static void main(String args[]) {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(4302);
}
catch (Exception e) {
System.out.println("well bad news...");
}
boolean noConnection = true;
while(noConnection == true) {
try {
Socket client = serverSocket.accept();
System.out.println("socket connection accepted:" + client.getRemoteSocketAddress().toString());
noConnection = false;
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("fail");
}
}
}
}
客户:
import java.net.*;
import java.io.*;
public class MessageClient {
public static void main(String args[]) {
Socket clientSocket = null;
String recieve;
try {
clientSocket = new Socket("10.0.0.1", 4302);
} catch (Exception e) {
System.out.println("deal with it...");
e.printStackTrace();
}
}
}
当我运行这两个程序时,我在客户端机器上得到以下结果:
java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at MessageClient.main(MessageClient.java:10)
服务器计算机上没有问题。
编辑:
我尝试禁用我的互联网安全 (Norton 360),但没有帮助。另外,我正在 运行ning(在两台计算机上)Windows 10,Java 8 Update 65,Eclipse IDE Mars 1
编辑 2:
如果有帮助,我尝试 运行 在一台计算机上运行程序的两个部分,这可行。所有迹象都指向 windows 防火墙问题。我会尽快解决这个问题。
你电脑的本地ip是多少并不重要。您的服务器在本地主机上 运行,因此您需要连接到本地主机。
将此更改为
clientSocket = new Socket("10.0.0.1", 4302);
至
clientSocket = new Socket("localhost", 4302);
当您在 VPS 上托管服务器时,您可以将本地主机更改为 VPS 的 IP。
您也可以使用“127.0.0.1”代替 "localhost"。
编辑
根据你现在得到的异常,
当服务器未侦听您尝试连接的端口时会发生异常。
您尚未启动服务器或服务器不接受连接或客户端和服务器上的端口号不同。
编辑 2
由于您是 运行 不同 PC 上的客户端和服务器(假设不同的网络),您将需要端口转发路由器以接受连接。
更多关于端口转发的信息here
此外,您可以使用此网站帮助您进行端口转发。 Port Forwarding
好的,所以我终于解决了这个问题。只是为遇到同样问题的任何人提供这个答案。创建客户端套接字时,您也需要直接指定其连接的机器的本地 ipv4。出于某种原因,本地主机将不允许它连接并表示 LAN 连接拒绝连接。所以 EX 代码:
Socket client = new Socket("10.0.0.8", 5566);
而不是:
Socket client = new Socket("localhost" 5566);
如果您要查找 ipv4,请转到服务器计算机,打开 CMD (windows),然后键入 ipconfig
。然后在 Ethernet adapter Local Area Connection:
下使用 IPv4 地址下列出的地址。
在这个极其基本的 client/server 套接字程序中,为什么我的客户端套接字永远不会连接并抛出 java.net.ConnectException
?我 运行 在一台计算机上安装 MessageServer 程序,在同一网络上的另一台笔记本电脑上安装 ClientServer 程序。我已经使用该计算机上 windows cmd 中的 ipconfig 命令验证了 运行 连接服务器程序的计算机的本地 IP 是 10.0.0.1。
服务器:
package server;
import java.net.*;
import java.io.*;
public class MessageServer {
public static void main(String args[]) {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(4302);
}
catch (Exception e) {
System.out.println("well bad news...");
}
boolean noConnection = true;
while(noConnection == true) {
try {
Socket client = serverSocket.accept();
System.out.println("socket connection accepted:" + client.getRemoteSocketAddress().toString());
noConnection = false;
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("fail");
}
}
}
}
客户:
import java.net.*;
import java.io.*;
public class MessageClient {
public static void main(String args[]) {
Socket clientSocket = null;
String recieve;
try {
clientSocket = new Socket("10.0.0.1", 4302);
} catch (Exception e) {
System.out.println("deal with it...");
e.printStackTrace();
}
}
}
当我运行这两个程序时,我在客户端机器上得到以下结果:
java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at MessageClient.main(MessageClient.java:10)
服务器计算机上没有问题。
编辑: 我尝试禁用我的互联网安全 (Norton 360),但没有帮助。另外,我正在 运行ning(在两台计算机上)Windows 10,Java 8 Update 65,Eclipse IDE Mars 1
编辑 2: 如果有帮助,我尝试 运行 在一台计算机上运行程序的两个部分,这可行。所有迹象都指向 windows 防火墙问题。我会尽快解决这个问题。
你电脑的本地ip是多少并不重要。您的服务器在本地主机上 运行,因此您需要连接到本地主机。
将此更改为
clientSocket = new Socket("10.0.0.1", 4302);
至
clientSocket = new Socket("localhost", 4302);
当您在 VPS 上托管服务器时,您可以将本地主机更改为 VPS 的 IP。
您也可以使用“127.0.0.1”代替 "localhost"。
编辑 根据你现在得到的异常,
当服务器未侦听您尝试连接的端口时会发生异常。
您尚未启动服务器或服务器不接受连接或客户端和服务器上的端口号不同。
编辑 2
由于您是 运行 不同 PC 上的客户端和服务器(假设不同的网络),您将需要端口转发路由器以接受连接。
更多关于端口转发的信息here
此外,您可以使用此网站帮助您进行端口转发。 Port Forwarding
好的,所以我终于解决了这个问题。只是为遇到同样问题的任何人提供这个答案。创建客户端套接字时,您也需要直接指定其连接的机器的本地 ipv4。出于某种原因,本地主机将不允许它连接并表示 LAN 连接拒绝连接。所以 EX 代码:
Socket client = new Socket("10.0.0.8", 5566);
而不是:
Socket client = new Socket("localhost" 5566);
如果您要查找 ipv4,请转到服务器计算机,打开 CMD (windows),然后键入 ipconfig
。然后在 Ethernet adapter Local Area Connection:
下使用 IPv4 地址下列出的地址。