2015-01-12 8 views
2

슬립 모드로 전환되는 동안에도 서버에 대한 TCP 연결을 유지하려고합니다. 나는 도처에서 수색을하고 모든 것을 시도했다. 이 문제는 일부 전화기에서는 발생하지만 임의의 종류의 전화기에서는 발생하지 않습니다.슬립 모드에서 tcp 연결을 유지하는 안드로이드

기본적으로 한 클라이언트가 서버에 요청을 보내면 서버는 다른 클라이언트에게 요청을 보냅니다. 수신 클라이언트는 요청을 전혀받지 못합니다. 나는 이것을 읽은 적이 없으면 디버거와 다음 줄의 코드로 테스트했다. 장치가 메시지를 즉시 수신하는 것이 중요합니다. 나는 viber가 이것을 어떻게 달성하고 있는지 궁금해하고 있습니다. 나는 Google 클라우드 메시징에 대해 생각했지만 설명서를 따르면서도 많은 것을 다시 구현해야 할 것입니다. 메시지가 Google 클라우드 메시징을 사용하더라도 반드시 목적지에 즉시 도달하지는 않습니다.

class BackgroundReadThread extends Thread { 

    @Override 
    public void run() 
    { 
     while(connectedToServer) 
     { 
      try 
      { 
       int bytesRead=0; 
       if(myWifiLock!=null && !myWifiLock.isHeld()) 
        myWifiLock.acquire(); 
       byte val=(byte)myInputStream.read(); 
       myWakeLock.acquire();//this line never gets called when in sleep 
       if(val==-1) 
       { 
        unexpectedDisconnectionFromServer(); 
        if(myWifiLock!=null && myWifiLock.isHeld()) 
         myWifiLock.release(); 
        myWakeLock.release(); 
        return; 
       } 
       bytesRead=myInputStream.read(myBuffer, 0, bufferSize); 
       if(bytesRead<1) 
       { 
        unexpectedDisconnectionFromServer(); 
        if(myWifiLock!=null && myWifiLock.isHeld()) 
         myWifiLock.release(); 
        myWakeLock.release(); 
        return; 
       } 
       byte[] dataArray=Arrays.copyOfRange(myBuffer,0,bytesRead); 
       ByteBuffer data=ByteBuffer.allocate(bytesRead+1).put(val).put(dataArray); 
       myParent.invokeReceiveAction(data, bytesRead+1); 
      } 
      catch (IOException e) 
      { 
       myWakeLock.acquire(); 
       unexpectedDisconnectionFromServer(); 
       e.printStackTrace(); 
      } 
      finally 
      { 
       if(myWifiLock!=null && myWifiLock.isHeld()) 
        myWifiLock.release(); 
       if(myWakeLock!=null && myWakeLock.isHeld()) 
        myWakeLock.release(); 
      } 
     } 
    } 
} 

편집 : 여기

내 코드이 코드는 내가 아무 생각이 왜 그러나 문제는 가끔 발생하고 그것은 단지에서 발생

+0

'읽기가 끝난 후 다음 코드 행이 절대 호출되지 않습니다. '즉, 코드가 네트워크 IO 읽기 호출에서 차단 중임을 의미합니다. 소켓 타임 아웃이 있습니까? 그렇다면 시간 제한은 무엇이며 적어도 한번은 시간 초과가 있습니까? – nmxprime

+0

서비스가 Forground로 설정되어 있습니까? – nmxprime

+0

@nmxprime 6 분 타임 아웃이 있지만 서버 측의 활성 유지 간격은 5입니다. 서버가 올라간 동안에는 장치가 절전 모드가 아니기 때문에 읽기 타임 아웃이 실행되지 않아야합니다. 그것은 내가 6 분 이상 경과 한 후에 장치를 깨울 때만 트리거합니다. 화면이 깨어지기 전까지는 10 분이 지나지 않아도 메시지가 나타나지 않아도 트리거가 발생하지 않습니다. 서비스는 백그라운드에서 실행됩니다. – Maro

답변

1

서비스에서 실행되고 있음을 언급하는 것을 잊었다 응용 프로그램의 디버그 버전. 필자는 애플리케이션의 릴리스 버전을 테스트했으며, 테스트를 거친 전화기에서 한번도 실패하지 않았습니다. 그래서 내가 왜 그런지 모르겠지만 문제는 디버그 버전입니다. 희망이 비슷한 문제가 누군가를 도울 수 있기를 바랍니다.

관련 문제