Android,检测套接字写入失败

时间:2015-01-15 08:01:51

标签: java android sockets ioexception

基本上,服务器端每8分钟发送一次保持活动消息,如果写入失败则断开客户端连接并关闭套接字连接。如果我的Android设备处于唤醒状态且服务器关闭了连接,则android设备上的读取操作会抛出异常,因为它应该与服务器断开连接。如果设备处于睡眠状态,即使使用部分唤醒锁定和wifilock也无法读取数据,我已经放弃了,但我的实际问题是当我的设备从睡眠状态恢复时(如果我转过身来)例如,我执行的操作是向服务器发送消息,以便我可以刷新数据,但如果我的服务器已经关闭套接字,我的写操作应该抛出IOException,但由于某种原因它不会。即使阻塞读取我也没有抛出任何异常或返回-1。

这是我的写操作:

public boolean sendData(byte[] data)
{
    boolean sent=false;
    if(connectedToServer)
    {
        try 
        {
            myOutputStream.write(data, 0, data.length);
            sent= true;
        }
        catch (IOException e) 
        {
            e.printStackTrace();
            unexpectedDisconnectionFromServer();
        }
    }
    return sent;
}

这是我的阅读操作:

public void startReadingInBackground()
{
    while(connectedToServer)
    {
        try
        {
            int bytesRead=0;
            if(myWifiLock!=null && !myWifiLock.isHeld())
                myWifiLock.acquire();
            byte val=(byte)myInputStream.read();
            myWakeLock.acquire();
            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)
        {
            if(!myWakeLock.isHeld())
                myWakeLock.acquire();
            unexpectedDisconnectionFromServer();
            e.printStackTrace();
        }
        finally
        {
            if(myWifiLock!=null && myWifiLock.isHeld())
                myWifiLock.release();
            if(myWakeLock!=null && myWakeLock.isHeld())
                myWakeLock.release();
        }
    }
}

我得到了如下输出流:

Socket mySocket = new Socket(SERVER_IP, SERVER_PORT_TCP );
myOutputStream=mySocket.getOutputStream();

1 个答案:

答案 0 :(得分:0)

你的写最终抛出IOException, 你的错误在于假设在断开连接后第一次写入必然会发生。由于各种原因,包括缓冲和重试,它不会赢。 TCP必须确定连接在拒绝新写入之前确实已经死了,并且在断开连接后第一次写入时肯定不会这样做。