我正在尝试保持与服务器的TCP连接处于活动状态,即使在手机进入睡眠模式时也是如此。我到处找遍了,什么都试过了。这个问题发生在一些手机上,而不是其他一些随机的。
所以基本上,一个客户机向服务器发送一个请求,然后服务器向另一个客户机发送该请求。发生的情况是,接收客户机根本没有收到请求。我已经用调试器测试过了,在read之后的下一行代码永远不会被调用。设备必须立即接收消息。我想知道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();
            }
        }
    }
}

编辑:忘记提及此代码正在服务中运行

最佳答案

我不知道为什么,但这个问题只是有时发生,而且只发生在应用程序的调试版本上。我已经测试了这个应用程序的发布版本,在我测试过的任何一款手机上都没有失败过。所以我想问题出在调试版本上,尽管我不知道为什么。希望这能帮助有类似问题的人。

10-04 23:05