[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를 얻으려면 ipconfig
cmd에서 command를 사용 하면 192.68.xx.yy Voila와 같은 IPv4를 얻을 수 있습니다. 서버가 호스팅되는 컴퓨터의 IP입니다. localhost 대신 사용하십시오
http://192.168.72.66/my_api/login.php
참고-이 컴퓨터 외부의 어떤 노드에서도이 개인 IP에 연결할 수 없습니다. (필요한 경우 Ngnix를 사용할 수 있습니다)
답변
vernemq.라는 Mqtt 브로커와 동일한 문제가 있었지만 다음을 추가하여 해결했습니다.
$ sudo vmq-admin listener show
vernemq에 허용 된 IP 및 포트 목록을 표시합니다.
$ sudo vmq-admin listener start port=1885 -a 0.0.0.0 --mountpoint /appname --nr_of_acceptors=10 --max_connections=20000
모든 IP와 새 포트를 추가합니다. 이제 U는 아무 문제없이 연결할 수 있어야합니다.
답변
내 경험이 누군가에게 도움이 되길 바랍니다. 동일한 예외 스택 추적으로 문제에 직면하여 문제가 무엇인지 이해할 수 없었습니다. 연결하려는 데이터베이스 서버가 실행 중이고 포트가 열려 연결을 수락했습니다.
인터넷 연결에 문제가있었습니다. 사용중인 인터넷 연결이 해당 서버에 연결되지 않았습니다. 연결 세부 정보를 변경하면 문제가 해결되었습니다.