环境:jdk1.8.0_241
Android API 30
Android Studio 4.2
部分代码:
/**
* 进行与设备的Tcp通信
*/
public String linkDev(String data, Context context) {
// 建立tcp服务
Socket socket = new Socket();
String str = null;
if (true) {
try {
String hostname = new Dao(context).queryIp();
SocketAddress socketAddress = new InetSocketAddress(hostname, 9696);
socket.connect(socketAddress, 500);
// 获取socket输出流对象
OutputStream outputStream = socket.getOutputStream();
// 写数据
outputStream.write(data.getBytes());
// 与服务器端交互
InputStream inputStream = socket.getInputStream();
byte[] buf = new byte[10240];
int length = inputStream.read(buf);
// 关闭资源
socket.close();
str = new String(buf, 0, length);
Log.v("gs1", "length为:" + length);
LogLong.d("gs2", "length为:" + length);
} catch (SocketTimeoutException e) {
Toast.makeText(context, "网络连接超时,请检查网络环境", Toast.LENGTH_SHORT);
Log.v("debug", "错误信息:socket连接超时");
return null;
} catch (Exception e) {
Log.v("debug", "错误信息gs:" + e.toString());
}
}
Log.v("返回数据1", str);
LogLong.d("返回数据2", str);
return str;
}
bug描述:APP需要实现和服务器(使用Json)进行通信,最初服务器端返回的数据比较小(1024b左右),通信正常。
服务器更新,返回数据达到了 7144b 的大小,APP端在进行接收时只能接受开头一部分数据(1240~2700b,
多次测试接收数据长度不同)。
解决方法:问题的成因是在读取字节流的时候数据还未完全接收完,在读取字节流
int length = inputStream.read(buf);
的前面加个等待的操作Thread.sleep(400)就可以了;
