环境: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)就可以了;