2015-01-12 68 views
2

即使在手機進入睡眠模式時,我仍然試圖保持與活着的服務器的tcp連接。我到處搜索並嘗試了一切。這個問題出現在一些手機上,而不是其他類型的隨機。Android,在睡眠模式下持有tcp連接

所以基本上一個客戶端發送一個請求到服務器,然後服務器發送請求到另一個客戶端。接收的客戶端根本沒有收到請求。我已經用調試器測試了這一點,讀取後的下一行代碼永遠不會被調用。設備立即收到消息很重要。我想知道viber如何實現這一目標。我想到了谷歌雲消息傳遞,但根據文檔,我將不得不重新實施很多,即使使用谷歌雲消息,消息也不一定會馬上到達目的地。

這裏是我的代碼:

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

我不知道爲什麼,但問題只是偶爾發生,它只是發生在調試應用程序的版本。我測試了該應用程序的發行版本,並且在任何一次測試過的手機上都不會失敗。所以我想問題是與調試版本,雖然我不知道爲什麼。希望這可以幫助有類似問題的人。

相關問題