java.net.ConnectException:连接被拒绝

java.net.ConnectException:连接被拒绝,java,networking,tcp,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 jav

我正在尝试实现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)
客户端代码:

//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从客户机手动连接。如果成功,那么问题就出在客户端代码中。如果没有,你需要找出为什么没有。在这方面可能会对您有所帮助。

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

  • 您试图连接到错误的IP/主机或端口
  • 您尚未启动服务器
  • 您的服务器未侦听连接
  • 在Windows服务器上,侦听待办事项队列已满

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

Socket-clientSocket=新套接字(“localhost”,5000)

Socket-clientSocket=新套接字(serverName,5000)


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

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

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

希望我的经验对其他人有用。我使用相同的异常堆栈跟踪来面对这个问题,但我无法理解问题是什么。我尝试连接的数据库服务器正在运行,端口已打开并正在接受连接


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

我在名为vernemq的Mqtt代理中遇到了相同的问题。但通过添加以下内容解决了问题

  • $sudo vmq管理侦听器显示
  • 显示vernemq允许的IP和端口列表

  • $sudo vmq admin listener start port=1885-a 0.0.0.0--mountpoint/appname--nr_of_acceptors=10--max_connections=20000
  • 添加任何ip和新端口。现在你应该能够连接没有任何问题

    希望它能解决你的问题。

    我之所以出现此错误,是因为我关闭了一个for循环中的
    ServerSocket
    ,该循环尝试接受其中的客户端数量(我没有完成接受所有clint)


    因此,在关闭套接字的位置要小心

    在我的例子中,我给了套接字服务器的名称(在我的例子中是“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();
    
        }
    }
    

    在我的例子中,我必须在
    Expose daemon附近打一个复选标记tcp://localhost:2375 在
    docker
    设置中没有TLS
    (在任务栏右侧,右键单击
    docker
    ,选择
    setting

    我想在上面的答案中添加一点是我的经验-

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

    请注意-当我在电脑上打开浏览器并使用相同的URL(
    http://localhost/my_api/login.php
    我得到了正确的回答

    因此,在我的例子中,问题是术语
    localhost
    ,我将其替换为我的服务器的IP(因为您的服务器托管在您的计算机上),这使得它可以从我的模拟器在同一台PC上访问


    要获取本地计算机的IP,可以在cmd上使用
    ipconfig
    命令 您将获得类似192.68.xx.yy的IPv4 瞧,这是你的机器的IP,你的服务器就在这里。 然后使用它而不是本地主机

    http://192.168.72.66/my_api/login.php



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

    我也有同样的问题,结果是由于
    catalina.out
    文件的权限不正确。tomcat用户无法写入它。一旦我修复了权限,问题就解决了。我从
    tomcat8 initd.log
    文件中的日志了解到这是一个权限问题:


    /usr/sbin/tomcat8:line 40:/usr/share/tomcat8/logs/catalina.out:权限被拒绝

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

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

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

     localhost
     //to you local ip
     192.168.xxxx
    

    你能把客户代码贴出来吗?如果是远程客户端,请确保没有任何防火墙问题!我关闭了客户端和服务器上的防火墙&仍然存在相同的问题服务器正在监听哪个接口。如果您仅在localhost上侦听,则无法远程连接。我尝试在使用localhost face palm时进行远程连接。这是我第一次尝试使用TCP><如何使其远程工作?请记住,在这两者之间可能还有一些“裸机”硬件防火墙。。。如果是cl,它能工作吗
     localhost
     //to you local ip
     192.168.xxxx