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