安卓socket:DataInputStream read接收死锁,求大神指点
我的接收代码:
public int RecvData(){
int iret=0;
try {
//读包头
System.out.println("接收包头!");
int ilen = m_InputStream.read(m_RecvBuf,0,12); //设置断点 //会死锁在这里
if(ilen
return -2;//网络异常
}
byte[] szTag = new byte[4];
System.arraycopy(m_RecvBuf, 0, szTag, 0, 4);
String strTemp = "TFTF";
String strTag = new String(szTag);
if(!strTag.equals("TFTF")){
return -3;//非法的包
}
byte[] szDataLen = new byte[2];
System.arraycopy(m_RecvBuf, 10, szDataLen, 0, 2);
short iDatalen = m_DataChange.ByteToShort(szDataLen, false);
if(iDatalen > 4083)
{
return -5;
}
else if(iDatalen == 0)
{
return 12;
}
//读数据包
System.out.println("接收包数据!");
ilen = m_InputStream.read(m_RecvBuf, 12, iDatalen);
if(ilen
return -4;
}
System.out.println("接收包数据完成!");
iret = 12 + ilen;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return -1;
}
return iret;
}
安卓这是客户端, 服务器是C++写的。网络环境是局域网WIFI。 安卓接收和发送用的是DataInputStream和DataOutputStream
数据包长度什么的都正常的,我一个数据包一个数据包的发送,头几个数据包是可以正确接收的(有时多,有是少)。
接收完某个数据包后,我服务器会接收到一个TCP 的reset标识符。我在服务器端尝试了两种处理:关闭socket 和 继续发送数据包。在安卓客户端那边read都得不到返回值。 客户端代码就死锁在那了。(后果很严重啊~~)
不明白的地方,好好的接收着包(都完整接收的,System.out.println("接收包数据完成!"); 执行到了),为什么会发我个重置标识符。我在服务器关闭socket也触发不了read了。s
我安卓客服端有心跳包线程,2分钟向服务器发生一次。当接收死锁在read后,m_OutStream.write 失败后会触发m_InputStream的read异常。
有安卓大神知道的原因的吗,或者我有什么方案能往里面调试下。(下安卓源码?)
------解决方案--------------------
int len = 0;
while ((len = m_InputStream.read(m_RecvBuf)) != -1) {
//执行操作
}
------解决方案--------------------
有异常的日志么?你把包头设置成16字节试下,一般计算机处理字节都是8的倍数