java.net.ConnectException:连接被拒绝


185

我正在尝试实现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
服务器正在侦听什么接口。如果仅在本地主机上侦听,则无法远程连接。
托尔比约恩Ravn的安徒生

我试图在使用本地主机时进行远程连接,但不能尝试。这是我第一次使用TCP>。<。如何使其能够远程工作?
萨曼莎·卡塔尼亚

请记住,您之间也可能有一些“裸机”硬件防火墙...如果客户端和服务器在同一盒子上,它是否可以工作?
家庭

Answers:


321

此异常意味着您尝试连接的IP /端口上没有侦听服务:

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

51
我忽略了You have not started your server,感觉很傻,但这确实是我的问题!
亚历克西斯·勒克莱尔

明确地说-“ Java核心就可以了”。唯一的问题是我们忽略了问题。.(服务器状态,ip地址,端口,互联网连接-本地IP等必须在同一路由器上)
Vinay Bhargav 2015年

1
Collin,“服务器不在等待接受连接”是什么意思?人们仿佛在意这件事。
罗恩侯爵,2015年

我之前写过这篇文章,但我想我的意思是说您还没有启动服务器的另一种方式。
Collin价格

就我而言,我有四个正在运行的Gennymotion模拟器,并且试图将应用程序加载到“ Galaxy”选项卡上,但出现此错误。在从好友的WEB阅读了很多内容之后,我关闭了所有模拟器并使其黯然失色,在任务管理器中终止了ADP,然后重新启动了Eclipse,一切开始正常运行。我认为,当您有多个模拟器在运行,然后尝试连接设备时,根据我的经验,ADB会发疯。那是我的两分钱... :)
Vincy

39

我会检查:

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

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


有时候我会得到这个例外。这会发生一段特定的时间。它立即引发此异常。然后一切都变好了。我的服务器中有防火墙。但是我添加了入站规则以允许端口8080上的传入连接。有时会忽略该规则吗?
阿什温

@Ashwin:真的,这是很难说的-您需要确切计算出数据的传输距离。看看你的防火墙日志等等
乔恩斯基特

@JonSkeet如果遇到此错误,如何配置防火墙?
Nikhil Pareek

1
@Nikhil:我没有资格回答这个问题,但我怀疑任何人谁合格的将需要更多的信息,能够帮助您。(一方面,我们不知道您拥有什么防火墙...)
Jon Skeet

6

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

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

Socket clientSocket = new Socket(serverName, 5000);

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


我假设她出于测试目的将它们都在同一台计算机上运行,​​这就是为什么可以使用localhost的原因
SE

@Aaron:她说,如果客户端和服务器在同一台机器上运行,那么它可以工作(您可以在另一条评论中找到答案)。
回家

“上面的行将套接字绑定到本地主机”,不是,它将其绑定到INADDR_ANY。这样,它就可以通过任何NIC接受连接。OP正在做的事情已经是正确的。答案是完全错误的。投票失败。
罗恩侯爵,

@EJP:您说得对ServerSocket,我修改了答案。不过,clientSocket仍然尝试连接localhost
回家

@home您需要删除有关绑定地址的短语。
罗恩侯爵,

6

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


3
当然,您必须在客户端之前运行服务器。首先运行客户端并尝试连接到服务器意味着您在启动服务器时没有任何连接。
user3308043

4
@ user3308043是的,这很明显,但对于某些新程序员(例如三年前的我自己)来说,并不太明显,所以我只想与那些像我一样笨拙的人分享它。
道林

谢谢,这对我也有帮助,测试连接成功,但是无法显示任何表数据。
达米安·克里斯托夫

5

我想补充以上答案的一点是我的经验 -

“我托管在本地主机上的服务器上,并尝试通过指定类似的URL 通过android仿真器连接到它http://localhost/my_api/login.php。并且我收到连接被拒绝错误

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

因此,在我的情况下,问题是我localhost用服务器IP(因为您的服务器托管在您的计算机上)替换了该术语,从而使它可以从同一台PC上的仿真器访问。


要获得本地计算机的IP,可以ipconfig在cmd上使用命令,您将获得IPv4之类的东西192.68.xx.yy Voila ..这就是托管服务器的计算机IP。然后使用它而不是localhost

http://192.168.72.66/my_api/login.php


注意-您将无法从此计算机外部的任何节点访问此私有IP。(如果需要,可以使用Ngnix)


4

我与名为vernemq。的Mqtt代理存在相同的问题,但通过添加以下内容解决了该问题。

  1. $ sudo vmq-admin listener show

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

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

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

希望它能解决您的问题。 在此处输入图片说明


1
这节省了我的时间,但是由于vernemq并未随apt-get一起安装,因此某些人将需要此链接: vernemq.com/docs/installation/debian_and_ubuntu.html
Damir Olejar

2

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

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


1

在我的情况下,我给套接字指定了服务器的名称(在我的情况下为“ raspberrypi”),取而代之的是一个IPv4地址,或者指定了IPv6损坏(名称解析为IPv6)。


1

就我而言,我必须Expose daemon on tcp://localhost:2375 without TLSdocker设置旁边打一个勾号(在任务栏的右侧,右键单击docker,选择setting


1

我收到此错误是因为我关闭了 ServerSocket在一个for循环中循环,尝试接受其中的客户端数量(我没有完成接受所有clint的动作)

所以要小心在哪里关闭插座


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
不关闭客户端套接字不会导致连接被拒绝。有不会一个客户端套接字接近,如果连接被拒绝。
罗恩侯爵'18年


-2

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

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


1
“拒绝权限”与“拒绝连接”不同。
罗恩侯爵,

tomcat8-initd.log服务器输出日志中恰好有问题中提到的错误,而文件中存在“权限被拒绝”错误。
kbsbng

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.