source

java.net 를 참조해 주세요.Connect Exception:연결이 거부되었습니다.

goodcode 2022. 7. 31. 22:59
반응형

java.net 를 참조해 주세요.Connect Exception:연결이 거부되었습니다.

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/호스트 또는 포트에 연결하려고 합니다.
  • 서버를 시작하지 않았습니다.
  • 서버가 연결을 수신하고 있지 않습니다.
  • 윈도우즈 서버에서는 수신 백로그 대기열이 가득 찼습니다.

확인해 보겠습니다.

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

가장 간단한 시작점은 아마도 telnet 또는 Putty를 사용하여 클라이언트머신에서 수동으로 연결을 시도하는 것입니다.성공했을 경우는, 클라이언트 코드에 문제가 있습니다.만약 그렇지 않다면, 왜 그렇지 않은지 알아내야 합니다.Wireshark가 이 방면에서 도움이 될 것입니다.

클라이언트 소켓을 리모트 서버 소켓에 연결해야 합니다.대신

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

하다

Socket clientSocket = new Socket(serverName, 5000);

클라이언트는 serverName에 접속해야 합니다.서버명은, 이 박스의 이름 또는 IP 에 일치합니다.ServerSocket인스턴스화되었습니다(클라이언트머신에서 이름이 도달 가능해야 합니다).중요한 건 이름이 아니라 IP 주소가 중요해

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

위의 답변에 덧붙이고 싶은 것은 제 경험입니다.

로컬 호스트의 서버상에서 호스트 해, 다음과 같은 적절한 URL 를 지정하고, Android 에뮬레이터를 개입시켜 접속하려고 했습니다.http://localhost/my_api/login.php접속 거부 오류가 발생하였습니다.

주의사항 - PC에서 브라우저로 이동하여 동일한 URL을 사용했을 때(http://localhost/my_api/login.php) 올바른 답변을 받고 있었습니다.

그래서 내 경우 문제는 이 용어가localhost서버의 IP(서버가 머신상에 호스트 되고 있는 경우)로 대체하고, 같은 PC상의 에뮬레이터로부터 도달할 수 있도록 했습니다.


머신의 하려면 , 「IP」를 합니다.ipconfigcmd ", 192.68.xx.y Voila "와 "를 얻을 수.호스트 하는 머신의 입니다. localhost 대신 합니다.

http://192.168.72.66/my_api/login.php


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

저는 버넘크라는 Mqt 브로커와 같은 문제가 있었는데, 다음 사항을 추가하여 해결했습니다.

  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 및 새 포트를 추가합니다.이제 아무 문제 없이 연결할 수 있을 것입니다.

그게 너의 문제를 해결해주길 바라.여기에 이미지 설명 입력

제 경험이 누군가에게 도움이 되었으면 좋겠어요.같은 예외 스택트레이스에서 문제가 발생했는데 무슨 문제인지 알 수 없었습니다.연결하려는 데이터베이스 서버가 실행 중이고 포트가 열려 있으며 연결을 수락하고 있습니다.

인터넷 접속에 문제가 발생.사용하던 인터넷 연결이 해당 서버에 연결할 수 없습니다.접속 상세 내용을 변경했더니 문제가 해결되었습니다.

이 경우는, 소켓에 서버의 이름(이 경우는 「raspberrypi」)을 붙였습니다만, IPv4 주소가 작성되었습니다(IPv6 로 해결되었습니다).

near near 근처에 체크 를 붙여야 요.Expose daemon on tcp://localhost:2375 without TLSdocker)docker을 선택합니다.setting)

는 i류는 i i i i i i i i i i i i i i i closed i i i i를 닫았기 때문에 발생하였습니다.ServerSocket내부 클라이언트의 수를 받아들이려고 하는 for 루프 내부(모든 clint의 수용을 완료하지 않았습니다)

소켓을 닫을 때 주의하십시오.

같은 문제가 발생했는데 소켓 오브젝트를 닫지 않는 것이 문제였습니다.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();

    }
}

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

서버 또는 클라이언트가 잘못된 IP/포트에 연결하려고 하는 것을 초기화하지 않았을 수 있습니다.

로컬 호스트를 IP 주소로 변경

 localhost
 //to you local ip
 192.168.xxxx

데이터베이스에 연결하기 위해 실행해야 하는 MySQL80이라는 서비스가 있습니다.

Windows의 경우 MySQL80 서비스를 검색하여 실행 중인지 확인하는 것보다 서비스를 검색하여 액세스할 수 있습니다.

같은 에러 메세지 「java.net」를 표시했습니다.Connect Exception:연결이 거부되었습니다." (SQuirre)LSQL이 ssh 터널을 통해 postgresql 데이터베이스에 접속하려고 할 때.

터널 열기 예:

Postgresql이 있는 다람쥐의 오류 예제:

여기에 이미지 설명 입력

잘못된 포트에 연결하려고 했습니다.올바른 포트를 입력한 후 프로세스 실행에 성공했습니다.

이 에러를 수정하기 위한 다른 옵션은, https://stackoverflow.com/a/6876306/5857023 에서 참조해 주세요.

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

언급URL : https://stackoverflow.com/questions/6876266/java-net-connectexception-connection-refused

반응형