基本上,服务器端每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();
答案 0 :(得分:0)
你的写将最终抛出IOException,
。你的错误在于假设在断开连接后第一次写入必然会发生。由于各种原因,包括缓冲和重试,它不会赢。 TCP必须确定连接在拒绝新写入之前确实已经死了,并且在断开连接后第一次写入时肯定不会这样做。