java.net.ConnectException:连接被拒绝

Sam*_*nia 169 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)
Run Code Online (Sandbox Code Playgroud)

我尝试更改套接字号以防它正在使用但无济于事,是否有人知道是什么导致此错误以及如何解决它.

服务器代码:

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

            }

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

客户代码:

//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);
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Col*_*ice 295

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

  • 您正在尝试连接到错误的IP /端口.
  • 您尚未启动服务器.
  • 您的服务器没有侦听连接.
  • 在Windows服务器上,侦听backlog队列已满.

  • 忽略了"你还没有启动服务器"我感到愚蠢,但这对我来说确实是个问题! (48认同)

Jon*_*eet 35

我会检查:

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

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


hom*_*ome 7

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

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

Socket clientSocket = new Socket(serverName, 5000);

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


Dao*_*Lam 6

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

  • @ user3308043是的,这很明显,但是对于某些新程序员(如三年前的我自己)来说并不太明显,所以我只想与那些像我一样笨拙的人分享它。 (3认同)
  • 当然,您必须在客户端之前运行服务器。首先运行客户端并尝试连接到服务器意味着您在启动服务器时没有任何连接。 (2认同)

eRa*_*ToX 6

我想添加到上述答案的一点是我的经验-

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

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

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


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

http://192.168.72.66/my_api/login.php


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