我想将图像文件从android传输到C服务器。 发送文件名 - > filesize - >图像文件 当我尝试发送文件大小时,它与imagefile连接。我不知道为什么。 我没有看到发送文件名和文件大小之间的区别。 当我发送文件名时,它不与文件大小连接。
从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(服务器端) //接收文件名
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�&��2�OLYMPUS DIGITAL CAMERA OLYMPUS CORPORATIONX100,D540Z,C310ZHHv775u-770000:00:00 00:00:00PrintIM0250�
�
����������� '
'�'''^'�'�''!������"�'�d�0220��������
���� �
�|�H��}�0100�������������� �
�
�
由于连接,我无法发送图像。谢谢你的阅读。
答案 0 :(得分:2)
TCP是面向流的;它不保持写边界,因此文件名可以与文件大小和一些数据一起接收,或者您可能必须调用read
两次才能接收整个文件名。
您需要建立某种协议来考虑这一点:每个可变长度字段必须以其长度开头,或者必须由保证不属于内容的字符分隔。例如,首先发送文件名的长度,然后发送文件的长度,然后发送文件内容。发送长度时,发送固定数量的字符,以便接收方可以知道长度是多长。或者发送文件名,然后是NUL字符,然后是文件长度,另一个NUL字符,然后是文件数据。
答案 1 :(得分:1)
文件大小字符串的大小不会被修复,如果你发送一个1字节的文件,你只会发送一个字节。但是在C服务器端,您正在为filesize_str读取一些固定缓冲区,并在收到文件大小str之后。你有效地得到了一些属于图片数据的数据。
要修复此问题,您应该将收到的数据重新设置为文件名和文件大小的可变长度。 (或者至少对于文件名来说,这可能很长。)