Android使用Socket進行Tcp連接,接收數據不完整


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM