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.