我试图实现一个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);
                }
            }
        }
    }
}

我会检查:

您试图连接到的主机名和端口 服务器端已经开始正确地监听 没有防火墙阻止连接

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


这个异常意味着在你试图连接的IP/端口上没有服务监听:

您正在尝试连接到错误的IP/主机或端口。 您的服务器还没有启动。 您的服务器没有监听连接。 在Windows服务器上,监听backlog队列已满。


您必须将客户端套接字连接到远程ServerSocket。而不是

套接字客户端套接字 = 新套接字(“本地主机”, 5000);

do

Socket clientSocket = new Socket(serverName, 5000);

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


我也有同样的问题,但是在运行客户端之前运行服务器可以解决这个问题。


可能有一个客户端前一个实例仍然在端口5000上运行和监听。


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

问题出在网络连接上。我正在使用的互联网连接不允许连接到相应的服务器。当我更改连接详细信息时,问题得到了解决。


我在使用名为vernemq的Mqtt代理时遇到了同样的问题。但通过添加以下内容解决了这个问题。

$ sudo vmq-admin监听显示

显示vernemq允许的ip和端口的列表

$ sudo vmq-admin监听的起始端口=1885 -a 0.0.0.0——mountpoint /appname——nr_of_acceptors=10——max_connections=20000

添加任何IP和您的新端口。现在你应该可以毫无问题地连接了。

希望它能解决你的问题。


我得到了这个错误,因为我在一个for循环中关闭了ServerSocket,试图接受它内部的客户端数量(我没有完成接受所有clints)

所以要小心关闭你的Socket


在我的例子中,我给了套接字服务器的名称(在我的例子中是“raspberrypi”),而不是一个IPv4地址使它,或者指定,IPv6被破坏(名称解析为IPv6)


我有同样的问题,问题是我没有关闭套接字对象。使用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();

    }
}

在我的情况下,我不得不在tcp://localhost:2375上的暴露守护进程附近放一个检查标记,在docker设置中没有TLS(在任务栏的右侧,右键单击docker,选择设置)


我想补充的一点是我的经验-

“我在我的服务器上托管在localhost上,并试图通过android模拟器通过指定适当的URL(如http://localhost/my_api/login.php)连接到它。我得到了连接拒绝错误"

注意点-当我在PC上打开浏览器并使用相同的URL (http://localhost/my_api/login.php)时,我得到了正确的响应

所以在我的情况下,问题是术语localhost,我替换为我的服务器的IP(因为您的服务器托管在您的机器上),这使得它可以从我的模拟器在同一台PC上访问。


要获取本地机器的IP,可以在cmd上使用ipconfig命令 你会得到类似192.68.xx.yy的IPv4 瞧……这是服务器所在机器的IP。 然后使用它而不是localhost

http://192.168.72.66/my_api/login.php


注意-您将无法从这台计算机以外的任何节点到达这个私有IP。(如果你需要,你可以使用Ngnix)


我改变了我的DNS网络,它解决了这个问题


您可能没有初始化服务器或客户端试图连接到错误的ip/端口。


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

 localhost
 //to you local ip
 192.168.xxxx

应该运行一个名为MySQL80的服务来连接数据库

对于windows,你可以通过搜索服务来访问它,而不是寻找MySQL80服务,并确保它正在运行


当SQuirreLSQL试图通过ssh隧道连接到postgresql数据库时,我看到了同样的错误消息““java.net.ConnectException: Connection refused”。

开隧道的例子:

Postgresql的Squirrel错误示例:

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

查看修复此错误的更多选项:https://stackoverflow.com/a/6876306/5857023


在我的例子中,服务器是用c#写的,客户端是用Java写的,我通过在服务器中指定主机名为'localhost',在客户端中指定'[::1]'来解决这个问题。我不知道这是为什么,但在客户端指定'localhost'没有工作。 据说这两个词在很多方面都是同义词,但显然不是100%匹配。希望它能帮助人们避免头痛。


对于那些遇到同样问题并使用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());
}

它开始正常工作了。