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次接收的数据拼接在一起  就是一次收取的数据了。

原文地址:https://www.cnblogs.com/lifeng-blog/p/7834185.html