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