0

我想将图像文件从 android 传输到 C 服务器。当我尝试发送文件大小时发送文件名-> 文件大小-> 图像文件,它与图像文件连接。我不确定为什么。我看不出发送文件名和文件大小之间的区别。当我发送文件名时,它不会与文件大小连接。

从java端(android)

DataOutputStream imgBodyOut = new DataOutputStream(client.getOutputStream());
                //sending name of the file
                buffer=fileName.getBytes();
                imgBodyOut.write(buffer);
                imgBodyOut.flush();
                //sending size of the file
                buffer=((Long.toString(filesize))+'\n').getBytes();
                imgBodyOut.write(buffer);
                imgBodyOut.flush();
                //sending body
                DataInputStream imgBodyIn = new DataInputStream(new FileInputStream(imgFile));
                int len;
                while(filesize >0&& (len=imgBodyIn.read(buffer))>0){
                    imgBodyOut.write(buffer,0,len);
                    imgBodyOut.flush();
                    filesize-=len;
                }
                imgBodyOut.flush();
                imgBodyIn.close(); 
                imgBodyOut.close();

C(server side) //接收文件名

read(connfd,filename_str,sizeof(filename_str));
printf("File name : %s.JPG\n",filename_str);
//receiving file size
read(connfd,filesize_str,sizeof(filesize_str));
printf("File size : %sbytes\n",filesize_str);


//Test filesize
        int i=0;
        while(i<1024){
            printf("%c",filesize_str[i]);
            i++;
        }

结果在 C

File name : P1011474.JPG
File size : 714438bytes
714438����8EExifII*
                   �����(1 �2i�&amp;��2�OLYMPUS DIGITAL CAMERA         OLYMPUS CORPORATIONX100,D540Z,C310ZHHv775u-770000:00:00 00:00:00PrintIM0250�

�
����������� '
                                   '�'''^'�'�''!������"�'�d�0220��������
���� �
�|�H��}�0100��������������    �
�
�

由于连接,我无法发送图像。感谢您的阅读。

4

2 回答 2

2

TCP是面向流的;它不维护写入边界,因此可以接收文件名以及文件大小和一些数据,或者您可能需要调用read两次才能接收整个文件名。

您需要建立某种协议来考虑这一点:每个可变长度字段必须以它的长度开头,或者必须由一个保证不属于内容的字符分隔。比如先发文件名长度,再发文件长度,再发文件内容。发送长度时,发送固定数量的字符,以便接收方知道长度有多长。或者发送文件名,然后是 NUL 字符,然后是文件长度,另一个 NUL 字符,然后是文件数据。

于 2013-07-22T17:21:45.257 回答
1

文件大小字符串的大小不会是固定的,如果你发送一个 1 字节的文件,你将只发送一个字节。但是在 C 服务器端,您正在为 filesize_str 读取一些固定缓冲区,并且在收到文件大小 str 之后。您有效地获得了一些应该属于图片数据的数据。

要修复此问题,您应该将接收到的数据重新处理为文件名和文件大小的可变长度。(或者至少对于文件名,这可能很长。)

于 2013-07-22T17:07:52.557 回答