java.net.ConnectException:连接被拒绝

我试图实现一个TCP连接,从服务器端一切正常,但是当我运行客户端程序(从客户端计算机),我得到以下错误:

java.net.ConnectException: Connection refused at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432) at java.net.Socket.connect(Socket.java:529) at java.net.Socket.connect(Socket.java:478) at java.net.Socket.<init>(Socket.java:375) at java.net.Socket.<init>(Socket.java:189) at TCPClient.main(TCPClient.java:13) 

我试图改变套接字号码,以防使用,但无济于事,有没有人知道是什么原因导致这个错误及如何解决它。

服务器代码:

 //TCPServer.java import java.io.*; import java.net.*; class TCPServer { public static void main(String argv[]) throws Exception { String fromclient; String toclient; ServerSocket Server = new ServerSocket(5000); System.out.println("TCPServer Waiting for client on port 5000"); while (true) { Socket connected = Server.accept(); System.out.println(" THE CLIENT" + " " + connected.getInetAddress() + ":" + connected.getPort() + " IS CONNECTED "); BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in)); BufferedReader inFromClient = new BufferedReader( new InputStreamReader(connected.getInputStream())); PrintWriter outToClient = new PrintWriter( connected.getOutputStream(), true); while (true) { System.out.println("SEND(Type Q or q to Quit):"); toclient = inFromUser.readLine(); if (toclient.equals("q") || toclient.equals("Q")) { outToClient.println(toclient); connected.close(); break; } else { outToClient.println(toclient); } fromclient = inFromClient.readLine(); if (fromclient.equals("q") || fromclient.equals("Q")) { connected.close(); break; } else { System.out.println("RECIEVED:" + fromclient); } } } } } 

客户代码:

 //TCPClient.java import java.io.*; import java.net.*; class TCPClient { public static void main(String argv[]) throws Exception { String FromServer; String ToServer; Socket clientSocket = new Socket("localhost", 5000); BufferedReader inFromUser = new BufferedReader(new InputStreamReader( System.in)); PrintWriter outToServer = new PrintWriter( clientSocket.getOutputStream(), true); BufferedReader inFromServer = new BufferedReader(new InputStreamReader( clientSocket.getInputStream())); while (true) { FromServer = inFromServer.readLine(); if (FromServer.equals("q") || FromServer.equals("Q")) { clientSocket.close(); break; } else { System.out.println("RECIEVED:" + FromServer); System.out.println("SEND(Type Q or q to Quit):"); ToServer = inFromUser.readLine(); if (ToServer.equals("Q") || ToServer.equals("q")) { outToServer.println(ToServer); clientSocket.close(); break; } else { outToServer.println(ToServer); } } } } } 

这个exception通常发生在您尝试连接的IP /端口没有监听服务时。 但是,一些事情可能会导致错误:

  • 您正试图连接到错误的IP /端口。
  • 你还没有启动你的服务器。
  • 您的服务器不在监听连接。
  • 您的服务器有太多未决的连接等待被接受。
  • 防火墙在到达服务器之前阻止了连接。

我会检查:

  • 您尝试连接的主机名和端口
  • 服务器端已经设法开始正确的收听
  • 没有防火墙阻止连接

最简单的出发点可能是尝试使用telnet或Putty从客户机手动连接。 如果成功,那么问题出现在您的客户端代码中。 如果没有,你需要弄清楚为什么没有。 Wireshark可以帮助你在这方面。

您必须将您的客户端套接字连接到远程ServerSocket。 代替

Socket clientSocket = new Socket("localhost", 5000);

Socket clientSocket = new Socket(serverName, 5000);

客户端必须连接到serverName ,该名称应与实例化ServerSocket的名称或IP相匹配(该名称必须可从客户端计算机访问)。 顺便说一句:这不是重要的名字,而是IP地址。

我试了你的代码,我没有在我的机器上的任何问题。 它必须阻止你的连接,否则你是以错误的顺序启动它们。 当你启动客户端时,你是否确定你的服务器没有closures? 我的过程是这样的。 把两个类文件放在一个目录下,然后打开两个命令提示符到那个目录来分别执行它们。 如果你使用IDE,它可能会自动closures服务器,这就是为什么我build议这样做

我曾经遇到过与被称为vernemq的Mqtt经纪人相同的问题,但通过添加以下内容来解决这个问题。

  1. $ sudo vmq-admin listener show

显示列表允许ips和端口为vernemq

  1. $ sudo vmq-admin listener start port=1885 -a 0.0.0.0 --mountpoint /appname --nr_of_acceptors=10 --max_connections=20000

添加任何IP和您的新端口。 现在你应该可以连接没有任何问题。

希望它能解决你的问题。 在这里输入图像描述

我有同样的问题,但在运行客户端之前运行服务器修复它。

希望我的经验对某人有用。 我遇到了同样的exception堆栈跟踪的问题,我不明白是什么问题。 我试图连接的数据库服务器正在运行,并且端口已打开,正在接受连接。

问题是与互联网连接。 我使用的互联网连接不允许连接到相应的服务器。 当我改变连接的细节,问题得到解决。

我得到这个错误,因为I closed ServerSocket inside a for loop ,试图接受里面的客户端数量(我没有完成接受所有clint)

所以要小心在哪里closures你的套接字

在我的情况下,我给套接字的服务器的名称(在我的情况下“raspberrypi”),而是一个IPv4地址,使它,或指定,IPv6是坏了(名称parsing为IPv6)

端口号码在两端总是不一样的

我有同样的问题,问题是,我没有closures套接字object.After使用socket.close(); 问题解决了。 这段代码适用于我。

ClientDemo.java

 public class ClientDemo { public static void main(String[] args) throws UnknownHostException, IOException { Socket socket = new Socket("127.0.0.1", 55286); OutputStreamWriter os = new OutputStreamWriter(socket.getOutputStream()); os.write("Santosh Karna"); os.flush(); socket.close(); } } 

和ServerDemo.java

 public class ServerDemo { public static void main(String[] args) throws IOException { System.out.println("server is started"); ServerSocket serverSocket= new ServerSocket(55286); System.out.println("server is waiting"); Socket socket=serverSocket.accept(); System.out.println("Client connected"); BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream())); String str=reader.readLine(); System.out.println("Client data: "+str); socket.close(); serverSocket.close(); } } 

在我的情况下,我不得不在docker设置中在docker Expose daemon on tcp://localhost:2375 without TLS附近放置一个Expose daemon on tcp://localhost:2375 without TLS的复选标记(在任务栏的右侧,右键单击docker ,selectsetting

可能是以前的客户端实例仍在运行并在端口5000上侦听。

尝试从互联网断开 (你可以closureswifi)。