2010-04-16 5 views
2

인터넷에 액세스하는 Java Desktop Application을 개발 중입니다. 다중 스레드 응용 프로그램이며 각 스레드는 동일한 작업을 수행합니다. 즉, 각 스레드는 동일한 Thread 클래스의 인스턴스입니다.자바 - 인터넷 연결이 자바 데스크톱 응용 프로그램을 통해 연결이 끊긴 것을 감지하는 방법?

이제 모든 스레드가 인터넷 연결이 활성화되어 있어야하므로 인터넷 연결이 활성화되어 있는지 여부를 감지하는 메커니즘이 있어야합니다.

Q1. 인터넷 연결이 활성 상태인지 여부를 감지하는 방법은 무엇입니까?

질문 2.이 인터넷 상태 확인 메커니즘 코드를 구현할 위치는 어디입니까? 인터넷 상태를 정기적으로 확인하기 위해 별도의 스레드를 시작하고 한 상태에서 다른 상태로 상태가 변경 될 때 모든 스레드에 알릴 필요가 있습니까? 아니면 각 스레드가 인터넷 상태 자체를 확인하도록해야합니까?

3.이 문제는 인터넷에 액세스하는 모든 응용 프로그램이이 문제를 처리해야하므로 매우 일반적인 문제 여야합니다. 그렇다면 다른 개발자가이 문제를 어떻게 다루는가?

4.이 문제를 해결하는 데모 응용 프로그램에 대한 참고 자료를 제공하면 크게 도움이 될 것입니다.

답변

1

A1 : 내가 아는 연결을 확인하는 유일한 플랫폼 독립적 인 방법은 신뢰할 수있는 호스트 (예 : google.com)

A2에 연결을 시도하는 것입니다 : 그것은 스레드가 정보를 얻고 싶은 빈도에 따라 달라집니다 연결에 대해서. 많은 스레드가 있고 매초마다 연결을 확인해야 할 경우 별도의 스레드를 선호합니다.

A3 : 문제를 해결하는 플랫폼 별 방법이 있습니다. 자바를 사용하기 때문에 의존하지 말아야한다고 생각합니다.

+0

예, 인터넷 상태를 확인하는 데 paltform 독립적 인 방법 만 필요합니다. –

0

운영 체제에 직접 문의 할 수없는 경우 알려진 호스트에 대한 소켓 연결을 만들 수 있습니다. 인터넷 연결이 컴퓨터 자체에서 중단되면 소켓 연결이 끊어지고 프로그램에 알림이 전송됩니다.

"도중에"연결이 끊어지는 것을 감지해야하는 경우 소켓에서 데이터를 정기적으로 수신하고이 데이터가 "정시에 도착하는지"여부를 추적해야합니다. 그렇지 않은 경우 연결이 응답하지 않습니다.

+0

"OS 묻기"방법조차도 문제가 있습니다. 인터넷과 인트라넷에 연결을 어떻게 구별해야합니까? – Dmitry

1

확인 신뢰할 수있는 호스트의 번호로 연결 그들이 도달 할 수없는 모든을하는 경우 당신은 더 많은 기회가 인터넷 연결이 호스트가 다운 것보다 아래로되고있다.

0

다른 사람들은 신뢰할 수있는 호스트를 폴링 할 수 있다고 언급 했으므로 다른 옵션은 java.net.NetworkInterface 클래스와 그 메소드 isUp()을 사용하는 것입니다. 간단한 데모 :

Enumeration<NetworkInterface> ifcs = NetworkInterface.getNetworkInterfaces(); 
while(ifcs.hasMoreElements()){ 
    NetworkInterface ifc = ifcs.nextElement(); 
    System.out.println(ifc.getDisplayName()+ " "+ifc.isUp()); 
} 

인터페이스가 연결 해제되면 isUp은 false를 반환해야합니다. 이렇게하면 모든 인터페이스가 제공되므로 isLoopback()을 검사하여 항상 루프백 인터페이스를 무시할 수 있도록해야합니다. 이 방법은 호스트 연결을 폴링하는 것보다 더 안정적이어야합니다. 특히 연결 속도가 느리고 더 "정중 한"방법 일 경우 특히 그렇습니다.적어도이 테스트를 초기 테스트로 사용할 수 있으며 인터페이스가 작동 중임을보고하는 경우 호스트에 연결을 시도 할 수 있습니다.

+1

"인터페이스가 작동 중입니다"는 "인터넷 연결이 활성화되었습니다"와 같지 않습니다. 따라서 사전 점검으로 만 사용할 수 있습니다. – Dmitry