[java] java.net.ConnectException : 연결 거부

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



답변

이 예외는 연결하려는 IP / 포트에서 서비스 수신 대기가 없음을 의미합니다.

  • 잘못된 IP / 호스트 또는 포트에 연결하려고합니다.
  • 서버를 시작하지 않았습니다.
  • 서버가 연결을 수신하지 않습니다.
  • Windows 서버에서 청취 백 로그 큐가 가득 찼습니다.

답변

나는 확인할 것이다 :

  • 연결하려는 호스트 이름 및 포트
  • 서버 측이 올바르게 청취를 시작했습니다.
  • 연결을 차단하는 방화벽이 없습니다

가장 간단한 출발점은 아마도 Telnet 또는 Putty를 사용하여 클라이언트 시스템에서 수동으로 연결을 시도하는 것입니다. 성공하면 클라이언트 코드에 문제가있는 것입니다. 그렇지 않은 경우 그렇지 않은지 해결해야합니다 . Wireshark 가이 전선에서 당신을 도울 수 있습니다.


답변

클라이언트 소켓을 원격 ServerSocket에 연결해야합니다. 대신에

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

하다

Socket clientSocket = new Socket(serverName, 5000);

클라이언트는 serverName에 연결해야하며 , 이는 ServerSocket인스턴스화 한 상자의 이름 또는 IP와 일치 해야합니다 (클라이언트 시스템에서 이름에 도달 할 수 있어야 함). BTW : 중요한 이름이 아니라 IP 주소에 관한 것입니다 …


답변

같은 문제가 있었지만 클라이언트를 실행하기 전에 서버를 실행하면 문제가 해결되었습니다.


답변

위의 답변에 추가하고 싶은 한 가지는 내 경험입니다 .

로컬 호스트의 서버에서 호스팅 하고 같은 적절한 URL을 지정 Android 에뮬레이터http://localhost/my_api/login.php . 연결 거부 오류가 발생했습니다.

참고 사항- 방금 PC에서 브라우저로 갔을 때 동일한 URL ( http://localhost/my_api/login.php)을 사용했을 때 올바른 응답을 받았습니다

그래서 내 경우의 문제는 용어였습니다. localhost 서버가 컴퓨터에서 호스팅되는 서버 의 IP 로 대체 된 로 동일한 PC의 에뮬레이터에서 도달 할 수있게되었습니다.


로컬 컴퓨터의 IP를 얻으려면 ipconfigcmd에서 command를 사용 하면 192.68.xx.yy Voila와 같은 IPv4를 얻을 수 있습니다. 서버가 호스팅되는 컴퓨터의 IP입니다. localhost 대신 사용하십시오

http://192.168.72.66/my_api/login.php


참고-이 컴퓨터 외부의 어떤 노드에서도이 개인 IP에 연결할 수 없습니다. (필요한 경우 Ngnix를 사용할 수 있습니다)


답변

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와 새 포트를 추가합니다. 이제 U는 아무 문제없이 연결할 수 있어야합니다.

그것이 당신의 문제를 해결하기를 바랍니다.
여기에 이미지 설명을 입력하십시오


답변

내 경험이 누군가에게 도움이 되길 바랍니다. 동일한 예외 스택 추적으로 문제에 직면하여 문제가 무엇인지 이해할 수 없었습니다. 연결하려는 데이터베이스 서버가 실행 중이고 포트가 열려 연결을 수락했습니다.

인터넷 연결에 문제가있었습니다. 사용중인 인터넷 연결이 해당 서버에 연결되지 않았습니다. 연결 세부 정보를 변경하면 문제가 해결되었습니다.