题外话:第一篇博客,这次抽空来总结下最近项目中所用到的tcp通信。
本人还是第一次在项目中用到tcp通信,tcp通信都是很靠谱的,这次遇到第一个包读取不完整导致包尾验证失败,重连后接收到的其它包又没问题,这种情况还是偶尔出现,打断点单步调试完全没问题(下面代码中可以看出为何断点调试没问题),被困了3天,最终,一段代码影响全局啊,同时非常感谢同事的帮助,上代码。
//接收数据
public void receiveData() throws IOException {
inputStream = socketTcp.getInputStream();
while (b) {
//验证固定长度的包头
byte[] head = new byte[20];
inputStream.read(head);
String strHead = new String(head, "GB2312");
if (!strHead.substring(1, strHead.length() - 1).equals("*********")) {
Log.e(TAG, "包头错误: " + strHead);
return;
}
byte[] length = new byte[10];//一个参数
inputStream.read(length);
String strLength = new String(length, "GB2312");
int datalen = Integer.parseInt(strLength);
//读包体,重点来了,就是这里经常读不完整
byte[] data = new byte[datalen - 58 - 20];
//非常重要的一段代码---等待输入流中的数据齐全才开始读(就是这里断点调试是可以完整读出所有数据的)
while (inputStream.available() < data.length) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
inputStream.read(data);
String dateStr = new String(data, "GB2312");
String[] result = dateStr.split("一个特殊符号");
Jiexi(result);
//读包尾
byte[] end = new byte[20];
inputStream.read(end);
String endStr = new String(end, "GB2312");
//验证包尾
if (endStr.substring(1, endStr.length() - 1).equals("********")) {
// TODO: 2018/1/30 存储数据
//验证结束符
if (m_nEventType != null && m_nEventType.equals("3")) {
closeSocket();
return;
} else {
continue;
}
} else {
Log.e("包尾错误", "---------------");
return;
}
}
}
萌新在此提前给大家拜年啊!