Android, 在睡眠模式下保持 tcp 连接
Android, holding tcp connection in sleep mode
即使 phone 进入休眠模式,我仍试图保持与服务器的 tcp 连接。我到处搜索并尝试了一切。此问题发生在某些 phone 上,而不是其他随机出现的问题。
所以基本上一个客户端向服务器发送请求,然后服务器将请求发送给另一个客户端。发生的情况是接收客户端根本没有收到请求。我已经用调试器测试了这个,并且在读取永远不会被调用之后的下一行代码。设备立即接收消息很重要。我想知道 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();
}
}
}
}
编辑:忘记提及此代码在服务运行中
我不知道为什么,但这个问题只是偶尔出现,而且只出现在应用程序的调试版本上。我已经测试了该应用程序的发布版本,它在我测试过的任何手机上都从未失败过一次。所以我想问题出在调试版本上,尽管我不知道为什么。希望这对遇到类似问题的人有所帮助。
即使 phone 进入休眠模式,我仍试图保持与服务器的 tcp 连接。我到处搜索并尝试了一切。此问题发生在某些 phone 上,而不是其他随机出现的问题。
所以基本上一个客户端向服务器发送请求,然后服务器将请求发送给另一个客户端。发生的情况是接收客户端根本没有收到请求。我已经用调试器测试了这个,并且在读取永远不会被调用之后的下一行代码。设备立即接收消息很重要。我想知道 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();
}
}
}
}
编辑:忘记提及此代码在服务运行中
我不知道为什么,但这个问题只是偶尔出现,而且只出现在应用程序的调试版本上。我已经测试了该应用程序的发布版本,它在我测试过的任何手机上都从未失败过一次。所以我想问题出在调试版本上,尽管我不知道为什么。希望这对遇到类似问题的人有所帮助。