2012-03-14 5 views
2
I 요청이 지정된 시간에 서버를 기절하고이 기간 동안 STUN 서버에서 요청을 수신하는 전송 STUN 클라이언트 구현

:프로그램 실행은 datagramSocket.receive 방법에 얼어 경우 대기 모드에서 디바이스

try { 

    byte[] respData = new byte[1024]; 
    DatagramPacket bRespPacket = new DatagramPacket(respData, respData.length); 
    datagramSocket.setSoTimeout(timeout); 
    datagramSocket.receive(bRespPacket); 
    processReceivedData(bRespPacket.getData()); 

    } catch (Exception e){} 

장치가가는 경우를 대기 모드 (화면이 꺼지면)는 프로그램이 datagramSocket.receive()에서 멈추고 화면이 잠길 때까지 SocketTimeoutException이 발생하지 않습니다. 화면 잠금이 해제되면 SocketTimeoutException이 성공적으로 throw되고 프로그램 실행이 계속됩니다. 그런 행동의 이유는 무엇입니까?

UPD : 장치 유휴 프로그램 실행이 datagramSocket.receive 메서드에서 멈추고 들어오는 데이터를받지 못하면. WifiLock을 사용해 보았지만 결과는 없었습니다.

UPD 2 : 나는 가동 잠금을 사용하는 경우 모든 잘 작동하지만 난이 화면이 꺼질 경우 구성 요소를 종료하고 안전한 에너지 안드로이드 수있는 좋은 방법

답변

1

없는 것 같아요. 아마 코드 실행이 멈추는 것 같아요. Android가 Wi-Fi를 종료 할 때 소켓이 방해 될 수 있습니다.

빠른 해결 방법으로 Wifi 잠금 장치를 사용하여 Android가 그러한 동작을하지 못하게 할 수 있습니다. 문제가 해결되면 Wi-Fi 잠금을 사용하지 않고 다른 방식으로 구현하는 것을 고려해야합니다. 즉, 장치 연결을 확인하고 변경된 경우 소켓을 다시 만드십시오.

http://developer.android.com/reference/android/net/wifi/WifiManager.WifiLock.html

편집 :

그것은 자신에 의해 그것을 시도하고 작은 예를했다. 결과는 화면이 꺼져 있고 몇 분 기다리는 경우에도 UDP 패키지를받는 데 아무런 문제가 없었습니다. 수신시 소리가 나고 화면이 꺼지면 전화가 대기 모드에 있음을 증명하는 약간의 소리가납니다.

나는 단순히 socket.receive를 기다리고있는 활동에서 곧바로 새로운 스레드에서 소켓을 쐈다. 특별한 점은 없습니다 :

DatagramSocket socket = new DatagramSocket(port); 

byte[] buf = new byte[256]; 

while(true) { 
DatagramPacket packet = new DatagramPacket(buf, buf.length); 

socket.receive(packet); 

    // doing something with the data... 
setOutputText(new String(buf)); 

} 

나는 Galaxy Nexus에서 테스트했습니다. 문제에 대한 자세한 정보를 제공 할 수 있습니까?

+0

경우에 따라 네트워크 상태 변경을 청취해야하며 사용자가 변경하는 것처럼 보이지 않습니다. –

+0

응답 해 주셔서 감사합니다. 그러나 화면 잠금이 해제되었을 때 실행이 멈추고 계속 진행되는 이유를 여전히 이해할 수 없습니다. – antiw

+0

WifiLock을 사용해 보았지만 결과가 없습니다. – antiw