Java.net.ConnectException: 连接被拒绝

243

我正在尝试实现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);
                }
            }
        }
    }
}

我关闭了客户端和服务器上的防火墙,但问题仍然存在。 - Samantha Catania
2
服务器正在监听哪个接口。如果您只在本地主机上进行监听,则无法进行远程连接。 - Thorbjørn Ravn Andersen
我试图在使用本地主机时进行远程连接,真是自讨苦吃。这是我第一次尝试使用TCP >.< 如何使其在远程工作? - Samantha Catania
请记住,您可能还有一些“裸机”硬件防火墙在中间...如果客户端和服务器在同一台计算机上,它是否有效? - home
Server Fault有一个关于“连接被拒绝”(Connection Refused)的规范问题,链接为http://serverfault.com/questions/725262/what-causes-the-connection-refused-message。 - Raedwald
显示剩余3条评论
20个回答

1
在我的情况下,我必须在 docker 设置中(任务栏右侧右键单击 docker,选择 设置)附近的 Expose daemon on tcp://localhost:2375 without TLS 上打勾。

1
对于那些遇到同样问题并使用 Spring 框架的人,我建议检查一个 HTTP 连接提供程序配置,比如 RestTemplate、WebClient 等。
在我的情况下,已配置的 RestTemplate 存在问题(这只是一个例子):
public RestTemplate localRestTemplate() {
   Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("localhost", <some port>));
   SimpleClientHttpRequestFactory clientHttpReq = new SimpleClientHttpRequestFactory();
   clientHttpReq.setProxy(proxy);
   return new RestTemplate(clientHttpReq);
}

我刚刚简化了配置:

public RestTemplate restTemplate() {
   return new RestTemplate(new SimpleClientHttpRequestFactory());
}

然后它开始正常工作。


1

我在使用SQuirreLSQL连接PostgreSQL数据库时,通过SSH隧道连接时遇到了相同的错误信息“java.net.ConnectException: Connection refused”。

打开隧道的示例: enter image description here

PostgreSQL中Squirrel出现错误的示例:

enter image description here

它试图连接到错误的端口。输入正确的端口后,进程执行成功。

查看更多修复此错误的选项:https://dev59.com/0Gw15IYBdhLWcg3wCXKJ#6876306


0

将本地主机更改为您的IP地址

 localhost
 //to you local ip
 192.168.xxxx

0
在我的情况下,服务器使用c#编写,客户端使用Java编写。我通过在服务器中将主机名指定为“localhost”,在客户端中将其指定为“[::1]”来解决了这个问题。我不知道为什么会这样,但是在客户端中指定“localhost”并没有起作用。 据说这些在很多方面都是同义词,但显然并不完全匹配。希望能帮助某些人避免头痛的问题。

0
如果你使用IntelliJ并遇到相同的错误,请检查是否有启用的方法断点。这对我起作用了 :)

0

我曾经遇到过同样的问题,问题在于我没有关闭套接字对象。使用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();

    }
}

1
不关闭客户端套接字不会导致连接拒绝。如果连接被拒绝,就不会有一个需要关闭的客户端套接字。 - user207421

-1

您可能没有初始化服务器或客户端正在尝试连接错误的IP /端口。


-2

可能是因为之前的客户端实例仍在运行并监听5000端口。


10
客户不是在倾听,而是在说话。 - Raedwald
之前的实例会在服务器上引起BindException,而不是在客户端引起ConnectException - user207421

-2

有一个名为MySQL80服务应该在运行以连接到数据库

对于Windows系统,您可以通过搜索服务来访问它,然后查找MySQL80服务并确保其正在运行


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接