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();
}
}
}
}
編輯:忘了提,這個代碼是在服務運行
「讀取後的下一行代碼永遠不會被調用」,這意味着代碼在網絡IO讀取調用時被阻塞。你有套接字超時?如果是這樣,什麼時候超時,並且至少超時一次? – nmxprime
該服務是否設置爲Forground? – nmxprime
@ nmxprime我確實有6分鐘的超時時間,但服務器端的保持活動時間間隔爲5,所以只要服務器啓動,讀取超時不應該觸發,並且它不會因爲設備進入睡眠狀態。它只會在超過6分鐘的時間後喚醒設備時觸發,所以即使如果說10分鐘已經過去而沒有接收,它也不會觸發,除非我喚醒屏幕。該服務在後臺運行。 – Maro