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