• android localsocket 传输大量数据的问题


    localsocket 传输大量的数据 例如一张图片,localsocket本身的缓冲区大小是有限定的

    两个办法:  扩充缓冲区的大小 

    或者是   接收端分多次接收 然后每一次的都拼装起来

    以后将给出第二种方式的源码

    2017.11.28今天给出核心的源码如下:

     1 void ClientTest::handleData() {
     2     int recvLen = 0;
     3     char* temp = (char*)malloc(462338*sizeof(char));
     4     FrameData_t* recvData = (FrameData_t*)malloc(224 * 172 * sizeof(FrameData_t));
     5     char* buffer = (char*)malloc(462338*sizeof(char));
     6 
     7     int expectedLen = 462338;
     8     int acceptLen   = 462338;
     9     int totalRead   = 0;
    10     while (mQuit == false) {
    11         recvLen = read(fd, buffer, acceptLen);
    12         if (recvLen <= 0) {
    13             continue;
    14         } else if (recvLen <= 40) {
    15             if (buffer[0] == 'c' && buffer[1] == 'd') {
    16                 ALOGD("read para success recvLen:%d", recvLen);
    17                 memcpy(lensPara, buffer + 2, 36);
    18             }
    19             continue;
    20         } else {
    21             if (totalRead == 0) {
    22                 if (buffer[0] == 'a' && buffer[1] == 'b') {
    23                     memcpy(temp, buffer + 2, recvLen - 2);
    24                     totalRead += recvLen;
    25                     acceptLen -= recvLen;
    26                 }
    27             } else {
    28                 memcpy(&temp[totalRead - 2], buffer, recvLen);
    29                 totalRead += recvLen;
    30                 acceptLen -= recvLen;
    31             }
    32         }
    33 
    34         if (totalRead != expectedLen) {
    35             continue;
    36         } else {
    37             ALOGD("read once success");
    38             memset(recvData, 0, 224 * 172 * sizeof(FrameData_t));
    39             memcpy(recvData, temp, 224 * 172 * sizeof(FrameData_t));
    40             backdata.callback(recvData);
    41             totalRead = 0;
    42             acceptLen   = 462338;
    43         }
    44     }
    45 
    46     free(temp);
    47     free(recvData);
    48     free(buffer);
    49 }

    简单说一下原理:当有大量的数据传输时,recv函数一次接收的数据量是不定的,

    例如:期待的一次成功的接收结果是5000字节      recv一次只能接收2000字节   那么就分3次 2000+2000+1000

    那么我第一次recv函数按照5000字节来收    返回值收到的是2000        第二次 recv函数按照3000来收     返回值是2000    第三次recv函数按照1000 来收    返回值是1000  

    然后将3次接收的数据拼接在一起  就是一次收取的数据了。

  • 相关阅读:
    Visual Studio各版本区别
    调试ASP.NET网站IIS环境问题解决方法汇总
    关于Webpage Not Found问题解决~~~
    SpringCloud+vue搭建的商城项目
    springcloud实现限流
    ReentrantLock
    栈和堆的特点
    你用对锁了吗?浅谈 Java “锁” 事
    ReentrantReadWriteLock读写锁的使用
    OAuth2
  • 原文地址:https://www.cnblogs.com/lifeng-blog/p/7834185.html
Copyright © 2020-2023  润新知