Java通过TCP发送给C

时间:2013-07-22 17:00:47

标签: java c tcp

我想将图像文件从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��������������    �
�
�

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

2 个答案:

答案 0 :(得分:2)

TCP是面向流的;它不保持写边界,因此文件名可以与文件大小和一些数据一起接收,或者您可能必须调用read两次才能接收整个文件名。

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

答案 1 :(得分:1)

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

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