如何通过tcp / ip将文件从C发送到Java并从Java接收相同的文件到C而没有数据丢失和其他错误?

时间:2015-08-20 08:50:51

标签: java c file sockets tcp-ip

如何将文本文件从C发送到Java并从Java到C接收相同的文件,而不会丢失数据?代码如下以供参考。

#include <time.h>
#include <errno.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>    
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <sys/select.h>
#include <sys/socket.h>

int send_text(int socket) { 
    FILE *text;
    char a[50];
    int size, read_size, stat, packet_index;
    char send_buffer[8008], read_buffer[8008];
    int wrt=0,sock_fd,tsize=0;
    packet_index = 1;
    int i=0; 
    text = fopen("/home/sosdt009/Desktop/character3.txt", "r"); 
    if (text == NULL) {
        printf("Error Opening text File:");
        exit(-1);
    }  
    printf("Getting text Size:\n");
    gets(a);
    fseek(text, 0, SEEK_END);
    size = ftell(text);
    fseek(text, 0, SEEK_SET);
    printf("Total text size: %d \n", size);    
    gets(a);

    //Send text Size

    printf("Sending text Size:\n",size);
    gets(a);
    send(socket, (void *)&size, sizeof(size), 0);

    /*do {     
      stat = recv(socket, read_buffer, 1024, 0);
      }*/while(stat < 0)
    printf("Socket data:%s \n", read_buffer); 
    gets(a);   
    while(size>tsize) {
        //Read from the file into our send buffer
        read_size = fread(send_buffer,1,sizeof(send_buffer),text);
        printf("The size of send buffer:%c \n",send_buffer);
        gets(a);
        printf("The read size value is :%d \n", read_size);
        gets(a);

        //Send data through our socket 

        do
        {            
            stat = send(socket, send_buffer, read_size, 0);
            printf("The send size value is: %d \n", size);
            gets(a);
            printf("The read size value is: %d \n", read_size);
            gets(a);

        } while (stat < 0); 
        printf("Packet %d, sent %d bytes.\n", packet_index, read_size);
        gets(a);

        //packet_index++;
        //Zero out our send buffer

        tsize = tsize+read_size;
        printf("The tsize value is:%d \n",tsize);
        gets(a);
        memset(send_buffer,0, sizeof(send_buffer));

        if(read_size<=NULL)
        {
            printf("The connection is transferred to received text: \n");
            gets(a);
        }
    }
    fclose(text);
    //close(socket);
    printf("Text successfully send:\n");
    gets(a);
    return 0;   
}

int receive_text(int socket)
{ 
    int buffersize = 77,recv_size=0,read_size = 1, write_size,size; 
    char *pBuf,a[50],b[77]; 
    int errnom,i;
    FILE *textnew; 
    size_t rec;
    textnew = fopen("/home/sosdt009/Desktop/receivednew.txt", "a");    
    if (textnew == NULL)   
    {      
        printf("Error has occurred, text file could not be opened \n");
        return -1;
    }

    //Loop while we have not received the entire file yet

    while(read_size > 0)
    {

        ioctl(socket, FIONREAD, &buffersize);
        printf("The Buffersize is    :%d\n",buffersize);
        gets(a);
        printf("The size of socket is:%d\n",socket);
        gets(a);

        //We check to see if there is data to be read from the socket 

        if (buffersize > 0)
        {
            printf("Buffersize value is  :%d\n", buffersize);
            gets(a);
            pBuf = malloc(buffersize);
            if (!pBuf)
            {
                printf(errnom, "Memory Error Cannot Allocate!\n");
                gets(a);
                exit(-1);
            }

            //read_size = read(socket,pBuf,buffersize);
            //read_size = fread(pBuf,buffersize,1,textnew);

            read_size = recv(socket,pBuf,sizeof(pBuf),1);
            //memset(pBuf,'\0',sizeof(pBuf));
            printf("Read size value is :%d \n",read_size);
            gets(a);
            printf("Buffersize value is:%d \n",sizeof(pBuf));
            gets(a);

            /*if (read_size < 0)
              {
              printf("%d\n",strerror(errno));
              printf("Data not written to the file:\n");
              gets(a);
              goto free;
              }*/

            //Write the currently read data into our text file

            //write_size = write(textnew,read_size,pBuf);                        //using write function
            write_size = fwrite(pBuf,1,read_size,textnew); 
            free(pBuf);
            printf("Write size value is   :%d \n",write_size);
            gets(a);
            printf("Buffer size value is  :%d \n",sizeof(pBuf));
            gets(a);            

            //Increment the total number of bytes read

            recv_size += read_size;
            printf("Received size value is:%d \n",recv_size);
            gets(a);
            printf("Read size value is    :%d \n",read_size);       
            gets(a);    
        }
    }
free:
    fclose(textnew);
    close(socket);   
    printf("Text Successfully Received:\n");
    gets(a);
    return 0;
}

int main(int argc,char *argv[])
{
    int socket_desc;
    struct sockaddr_in server;
    char *parray,errnomu;

    //Create socket

    socket_desc = socket(AF_INET,SOCK_STREAM,0);
    if(socket_desc == -1) 
    {
        printf("Could not create socket \n");
    }
    memset(&server,0,sizeof(server));
    server.sin_addr.s_addr = inet_addr("10.170.0.38");
    server.sin_family = AF_INET;
    server.sin_port = htons(6999); 

    //Connect to remote server

    if (connect(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0) 
    {

        printf(strerror(errnomu));                     
        printf("Connect Error \n");
        return -1;         
    }

    puts("Connected");
    send_text(socket_desc);
    receive_text(socket_desc);
    close(socket_desc);
    return 0;

}

1 个答案:

答案 0 :(得分:0)

你正在吃这顿饭。你不需要所有的fseeks和ftells以及do / whiles和嵌套循环。 do / while特别疯狂。在出错时继续做某事?

我建议您不要使用stdio来读取文件。它在这里没有增加任何价值,只会让代码变得比它需要的更复杂。

在C中复制文件描述符的标准方法如下:

while ((count = read(infd, buffer, sizeof buffer)) > 0)
{
    write(outfd, buffer, count);
}
if (count == -1)
{
    perror("read");
}
// close them both

如果这是C编码的公平样本,则无法与朋友分享您对Java代码的信心。

标准Java拷贝循环如下:

while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}
// close them both