2012-01-11 3 views
2

소켓을 생성하고 InputStream을 얻습니다. 여기 내가 어떻게 그것을 시도합니다.소켓을 생성 할 수 없습니다 : java.net.ConnectException : Connection refused : connect

try { 
    final String serverIP = "111.111.111.111"; 
    final int serverPort = Integer.parseInt(server_port); 
    final InetAddress serverAd=InetAddress.getByName(serverIP); 
    final InetAddress localAd =InetAddress.getByName(local_ip); 
    final int localPort = 4040; 

    Socket socket = new Socket(serverAd, serverPort, localAd, localPort); 
} 

발생하지만, 예외가 여기

java.net.ConnectException: Connection refused: connect 
    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:366) 
    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:276) 
    at shootist.Porter.run(Porter.java:41) 

서버 나 RTP 데이터를 전송하고 서버 측의 확인 및 확인된다. 나는 초대장을 보내고 200 장을 받았다. 내 IP 및 포트에 문제가있는 경우, 모든 응답을 내 IP 및 지정된 포트로 전달할 수 없다고 생각합니다. 그러나 서버가 내 IP와 주어진 포트 번호로 응답을 보내면 이런 일은 일어나지 않습니다. 어떻게이 문제를 해결할 수 있습니까? 내가 잘못한 곳에서 뭐야?

+0

서버 및 클라이언트 시스템의 포트 번호에 방화벽 예외를 추가하십시오. 더 좋은 점은 방화벽을 PC에서 꺼내십시오. – Acn

+0

감사합니다. 클라이언트 컴퓨터의 포트 번호에 방화벽 예외를 추가하는 방법을 알려주십시오. –

답변

9

오류는 서버 시스템의 소켓 스택이 연결 요청을 받고 의도적으로 그것을 수락을 거부 의미 "연결이 거부"시도하는 것입니다. 이는 두 가지 이유 중 하나로 인해 발생합니다.

1) 연결하려는 포트에서 수신 대기 소켓이 실행되지 않습니다.

2) 청취 소켓이 있지만 보류중인 연결의 백 로그가 가득 차서 그 순간에 요청을 대기시킬 공간이 없습니다.

둘 사이를 구분하려면 각 시도 사이에 지연을 두어 몇 번 다시 시도하십시오. 일관되게 동일한 오류가 발생하면 # 1이 범인입니다. 포트 번호가 올바른지 확인하십시오. # 2가 범인이라면, 당신의 재접속은 결국 성공할 가능성이 있습니다.

+0

전체적이고 포괄적 인 대답. +1. – 0xCAFEBABE

+0

Remy. 고맙습니다. 포트 번호를 변경하고 시도했습니다. 하지만 같은 오류 :(. 당신이 내게 성공적인 청취 소켓을 만드는 방법을 알려주시겠습니까? (나는 약간 새것을 보냈다.) –

+0

"더 설명 하겠지만 대기중인 연결의 백 로그가 가득 차서 대기열에 여유가 없다. ... "어떤 방식 으로든 내가 INVITE를 보낸 다음 서버 응답을 200으로 보내면 서버가 데이터를 보내기 시작합니다. 서버가 응답을 보내고 해당 서버의 포트를 얻을 때까지 기다려야합니다 (서버의 포트가 response.INVITE는 다른 포트로 보내지고 소켓은 서버가 결정한 다른 포트에서 만들어 질 것입니다.) 앞에서 언급했듯이 소켓으로 다시 연결을 시도했지만 동일한 오류가 발생하여 실패했습니다 –

1

연결이 거부되었다는 것은 해당 포트를 수신하지 않는 서버에 연결하려고했거나 연결을 허용하기에는 너무 늦은 것입니다.

이를 테스트하는 간단한 방법은

telnet 111.111.111.111 4040 
+1

이 오류를 일으킬 수있는 유일한 조건은 아닙니다. 내 대답을 보라. –

+0

@ RemyLebeau-TeamB 백 로그의 좋은 점. 서버가 다시 기록되기 위해서는 서버가 상당히 나쁜 방식이어야합니다. –

+0

반드시 그렇지는 않습니다. 백 로그가 너무 작을 수 있으며 서버의'accept()'비율이 너무 느리게 실행되도록 코딩되었을 수 있습니다. 너는 결코 정말로 알지 못한다. –