2017-09-19 1 views
1

로컬 네트워크의 장치에 열린 포트가 있는지 확인하려고합니다. 많은 의견을 읽은 후에 다음 코드로 실행했습니다 :Java를 사용하여 다른 장치의 포트가 열려 있는지 확인

try 
    { 
    Socket s = new Socket(); 
    s.setReuseAddress(true); 
    SocketAddress sa = new InetSocketAddress(ipAddress, 
              port); 
    s.connect(sa, 
      1000); 

    return s.isConnected(); 
    } 
catch (IOException e) 
    { 
    return false;   
    } 

이 코드는 대부분 시간이 많이 걸립니다. 드물지만 수천 개의 장치를 실행 한 후이 코드는 포트 80이 닫힌 것으로보고하지만 Apache HTTPClient를 사용하여 웹 페이지를 가져 오면 작동합니다.

어떤 아이디어가있을 수 있습니까?

을 유발할 수있는 생각 :

  • 가 1000MS가 불충분 시간 제한?
  • isConnected() 호출이 불필요합니까?
  • setReuseAddress (true)가 잘못 되었습니까?

답변

1

1000ms 제한 시간이 부족합니까?

예.

isConnected() 호출이 불필요합니까?

예. 연결되어 있지 않으면 예외가 발생했습니다.

setReuseAddress (true)가 잘못 되었습니까?

아마 아무 것도 유용하지 않습니다. 그것이 무엇을하는지 모르는 경우에는 무엇을하고 있습니까?

이 코드의 주요 문제점은 소켓이 새고 있다는 것입니다. finally 블록의 소켓을 닫아야합니다.

물론 미래를 예측하는 이런 종류는 본질적으로 그릇된 것입니다. 포트가 수신 대기 중인지 여부를 알고 싶으면 동일한 소켓을 사용하여 포트에 연결하려고 시도하고 실제로 처리하고자하는 모든 트랜잭션에 참여하십시오.

+0

응답 해 주셔서 감사합니다. 더 합리적인 타임 아웃은 무엇입니까? 예외가 throw되지 않고 isConnected()가 false를 반환 할 가능성이 있습니까? setReuseAddress (true)는 다른 곳에서 언급 한 것을 보았 기 때문에 거기에 있습니다. 나는 그것을 꺼낼 것이다. 그리고 소켓 유출에 관심을 가져 주셔서 감사합니다. 그러나이 문제를 다루는 코드가 있습니다.이 토론과 관련이 없으므로 최대한 적은 코드 만 보여주고 싶었습니다. –

+0

네트워크에 따라 제한 시간은 몇 초가되어야합니다. 불가능하지 않습니다. – EJP

관련 문제