java.net.ConnectException : 연결 거부


186

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
서버가 수신하는 인터페이스 로컬 호스트에서만 청취하는 경우 원격으로 연결할 수 없습니다.
— Thorbjørn Ravn Andersen

localhost, face palm을 사용하는 동안 원격으로 연결하려고했습니다. 이것은 TCP를 사용한 나의 첫 번째 시험입니다. << 원격으로 작동하게하려면 어떻게해야합니까?
— 사만다 카타니아

클라이언트와 서버가 같은 상자에 있으면 작동합니까?
— 홈

답변:


323

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

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

52
를 간과 한 것에 대해 멍청한 느낌이 You have not started your server들지만 실제로는 문제였습니다!
— Alexis Leclerc

요점을 분명히하기 위해 "자바 코어는 괜찮습니다". 문제는 우리가 문제를 간과하는 것뿐입니다 .. (서버 상태, ipaddress, 포트, 인터넷 연결 – 동일한 라우터에 있어야 로컬 IP 등이 필요합니다)
— Vinay Bhargav

1
콜린, '서버가 연결을 기다리고 있지 않다'는 것은 정확히 무엇을 의미합니까? 사람들은 무언가를 의미하는 것처럼 이것을 주변에 파고 있습니다.
— Lorne의 후작

나는 이것을 얼마 전에 썼지 만 서버를 시작하지 않았다는 또 다른 방법이라고 생각합니다.
— Collin 가격

내 경우에는 4 개의 Gennymotion 시뮬레이터가 실행 중이며 Galaxy 탭에 앱을로드하려고했지만이 오류가 발생했습니다. 친구 웹에서 많은 것을 읽은 후 모든 시뮬레이터와 일식을 닫고 작업 관리자에서 ADP를 종료 한 다음 Eclipse를 다시 시작하면 모든 것이 제대로 작동하기 시작했습니다. 여러 시뮬레이터를 실행하고 장치를 연결하려고하면 ADB가 내 경험에 방해가됩니다.
— 그게

40

나는 확인할 것이다 :

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

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


때때로이 예외가 발생합니다. 이것은 특정 기간 동안 발생합니다. 이 예외는 즉시 발생합니다. 그리고 모든 것이 잘됩니다. 서버에 방화벽이 있습니다. 그러나 포트 8080에서 들어오는 연결을 허용하는 인바운드 규칙을 추가했습니다. 규칙이 때때로 무시됩니까?
— Ashwin

@ Ashwin : 실제로 말할 수는 없습니다. 실제로 데이터가 얼마나 멀리 떨어져 있는지 정확히 파악해야합니다. 방화벽 로그 등을보십시오.
— Jon Skeet

@JonSkeet이 오류가 발생하면 방화벽을 구성하는 방법은 무엇입니까?
— Nikhil Pareek

1
@Nikhil : 답변을 드릴 자격이 없지만 자격을 갖춘 사람 이 귀하를 도울 수있는 더 많은 정보가 필요하다고 생각 합니다. (한가지로, 우리는 당신이 어떤 방화벽을 가지고 있는지 모릅니다 ...)
— Jon Skeet

7

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

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

하다

Socket clientSocket = new Socket(serverName, 5000);

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


테스트 목적으로 동일한 머신에서 두 머신을 모두 실행한다고 가정했는데, localhost를 사용하는 것이 좋습니다.
— SE

@Aaron : 클라이언트와 서버가 동일한 컴퓨터에서 실행되면 작동한다고 말했다 (다른 의견에서 답변을 찾을 수 있음).
— 홈

'위의 행은 소켓을 localhost에 바인딩합니다.'그렇지 않습니다. INADDR_ANY에 바인딩합니다. 모든 NIC를 통한 연결을 허용합니다. OP 가하고있는 것은 이미 정확합니다. 답변이 완전히 틀 렸습니다. 다운 보팅.
— Lorne의 후작

@ EJP : 당신은 맞습니다 ServerSocket. 나는 대답을 수정했습니다. 그럼에도 불구하고 clientSocket여전히 연결을 시도합니다 localhost.
— 홈

@home 바인드 주소에 대한 문구 를 제거 해야 합니다.
— Lorne의 후작

7

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


4
물론 클라이언트보다 먼저 서버를 실행해야합니다. 클라이언트를 먼저 실행하고 서버에 연결하려고하면 서버를 시작할 때 아무것도 연결하지 않습니다.
— user3308043

5
@ user3308043 그렇습니다. 그러나 3 년 전과 같은 일부 새로운 프로그래머에게는 너무 분명하지 않았기 때문에 저처럼 우둔한 동료들과 공유하고 싶었습니다.
— Dao Lam

감사합니다. 테스트 연결에 성공했지만 테이블 데이터를 표시 할 수 없었습니다.
— Damien Christophe

6

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

" 로컬 호스트의 서버에서 호스팅 하고 같은 적절한 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를 사용할 수 있습니다)


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

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


1
이것은 내 하루를 절약했지만 vernemq는 apt-get과 함께 설치되지 않기 때문에 일부 사람들은 다음 링크를 필요로합니다. vernemq.com/docs/installation/debian_and_ubuntu.html
— Damir Olejar

2

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

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


1

제 경우에는 소켓에 서버 이름 (제 경우에는 "raspberrypi")을 주었고 대신 IPv4 주소로 만들거나 IPv6이 손상되도록 지정했습니다 (이름은 IPv6으로 확인 됨)


1

필자의 경우 설정 근처 Expose daemon on tcp://localhost:2375 without TLS에 확인 표시 docker를해야했습니다 (작업 표시 줄의 오른쪽에서을 마우스 오른쪽 버튼으로 클릭 docker하고을 선택하십시오 setting)


1

닫았 기 때문에이 오류가 발생했습니다 ServerSocketfor 루프 내부를 내부에 많은 클라이언트를 허용하려고 시도 했습니다 (모든 클린트 수락을 완료하지 못했습니다)

소켓을 닫을 위치에주의하십시오


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
클라이언트 소켓을 닫지 않아도 연결이 거부되지 않습니다. 연결이 거부 된 경우 클라이언트 소켓을 닫을 수 없습니다 .
— Lorne의 후작

0

DNS 네트워크를 변경했는데 문제가 해결되었습니다.


-2

나는 같은 문제를 겪었고 catalina.out파일의 권한 이 올바르지 않은 것으로 판명되었습니다 . 바람둥이 사용자가 쓸 수 없었습니다. 권한을 수정하면 문제가 해결되었습니다. tomcat8-initd.log파일 의 로그에서 권한 문제라는 것을 알게되었습니다 .

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


1
'허가 거부'는 '연결 거부'와 동일하지 않습니다.
— Lorne의 후작

tomcat8-initd.log서버 출력 로그에 해당 질문에 언급 된 오류가있는 동안 권한 거부 오류가 파일에있었습니다.
— kbsbng

-3

포트 5000에서 실행중인 클라이언트의 이전 인스턴스가 여전히있을 수 있습니다.


6
고객은 듣지 않습니다. 그들은 말했다.
— Raedwald

이전 인스턴스는 클라이언트가 BindException아닌 서버에서 발생합니다 ConnectException.
— Lorne의 후작
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.