Я пытаюсь сохранить соединение tcp с сервером в живых, даже когда телефон переходит в спящий режим. Я везде искал и все пробовал. Эта проблема возникает на некоторых телефонах, а не на других, которые являются случайными.Android, поддерживающий соединение tcp в спящем режиме
Так что в основном один клиент отправляет запрос на сервер, а затем сервер отправляет запрос другому клиенту. Случается, что получающий клиент вообще не получает запрос. Я тестировал это с помощью отладчика и следующей строки кода после того, как чтение никогда не вызывается. Для устройства важно сразу получить сообщение. Мне интересно, как это достигается. Я думал о облачных сообщениях 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();
}
}
}
}
EDIT: забыл упомянуть, что этот код работает в службе
«Следующая строка кода после чтения никогда не называется», что означает, что код блокируется при вызове чтения IO сети. У вас есть тайм-аут сокета? Если да, то каков тайм-аут, и он тайм-аут по крайней мере один раз? – nmxprime
Является ли сервис установленным как Forground? – nmxprime
@nmxprime У меня есть тайм-аут 6 минут, но интервал сохранения на сервере составляет 5, так что до тех пор, пока сервер не работает, тайм-аут чтения никогда не запускается, и это не так, потому что устройство попадает в спящий режим. это только срабатывает, когда я разбужу устройство после того, как прошло более 6 минут, даже если, например, 10 минут прошли без приема, он не будет запускаться, если я не разбужу экран. Служба работает в фоновом режиме. – Maro