java.net.ConnectException:连接被拒绝

时间:2011-07-29 16:37:51

标签: java networking tcp

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

我尝试更改套接字号以防它正在使用但无济于事,是否有人知道导致此错误的原因&amp;如何解决它。

服务器代码:

//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);
                }
            }
        }
    }
}

17 个答案:

答案 0 :(得分:279)

此异常表示没有服务侦听您尝试连接的IP /端口:

  • 您正在尝试连接错误的IP /主机或端口。
  • 您尚未启动服务器。
  • 您的服务器没有侦听连接。
  • 在Windows服务器上,侦听积压队列已满。

答案 1 :(得分:34)

我会检查:

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

最简单的起点可能是尝试使用telnet或Putty从客户端计算机手动连接。如果成功,则问题出在您的客户端代码中。如果没有,你需要找出为什么它没有。 Wireshark可以在这方面为您提供帮助。

答案 2 :(得分:6)

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

答案 3 :(得分:4)

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

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

Socket clientSocket = new Socket(serverName, 5000);

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

答案 4 :(得分:4)

我遇到了与mqtt经纪人vernemq相同的问题。但是通过添加以下内容解决了这个问题。

  1. $ sudo vmq-admin listener show
  2. 显示列表o允许的vernemq的ips和端口

    1. $ sudo vmq-admin listener start port=1885 -a 0.0.0.0 --mountpoint /appname --nr_of_acceptors=10 --max_connections=20000
    2. 添加任何IP和您的新端口。现在你应该可以毫无问题地连接。

      希望它能解决你的问题。 enter image description here

答案 5 :(得分:2)

希望我的经历对某人有用。我遇到了相同的异常堆栈跟踪问题,我无法理解问题所在。我尝试连接的数据库服务器正在运行,端口已打开,正在接受连接。

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

答案 6 :(得分:1)

在我的情况下,我给套接字服务器的名称(在我的情况下&#34; raspberrypi&#34;),而是IPv4地址使它或指定,IPv6被破坏(名称解析为一个IPv6)

答案 7 :(得分:1)

在我的情况下,我必须在Expose daemon on tcp://localhost:2375 without TLS设置的docker附近放置一个复选标记(在任务栏的右侧,右键单击docker,选择{{1} }})

答案 8 :(得分:1)

我收到此错误是因为我在for循环中关闭ServerSocket,试图接受其中的客户端数量(我没有完成接受所有clints)

所以要小心关闭你的Socket

答案 9 :(得分:0)

两端的端口号始终不同

答案 10 :(得分:0)

我有同样的问题,问题是我没有关闭套接字对象。使用socket.close();问题解决了。 这段代码适合我。

ClientDemo.java

^(\w{5}-\w{5}-\w{5}-\w{5}-\w{5})$

和 ServerDemo.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();
    }
}

答案 11 :(得分:0)

我更改了DNS网络并解决了问题

答案 12 :(得分:0)

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

答案 13 :(得分:0)

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

 localhost
 //to you local ip
 192.168.xxxx

答案 14 :(得分:0)

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

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

答案 15 :(得分:-1)

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

答案 16 :(得分:-1)

我遇到了同样的问题,事实证明是由于catalina.out文件的许可不正确。 Tomcat用户无法写该文件。修复权限后,问题就解决了。我从tomcat8-initd.log文件的日志中知道这是一个权限问题:

/usr/sbin/tomcat8: line 40: /usr/share/tomcat8/logs/catalina.out: Permission denied