Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java服务器向C客户端发送文本文件_Java_C_Client Server - Fatal编程技术网

从Java服务器向C客户端发送文本文件

从Java服务器向C客户端发送文本文件,java,c,client-server,Java,C,Client Server,我试图从Java服务器向C客户机发送一个文本文件。在我运行代码后,文本文件被成功接收,但当我打开它时,我发现文本文件中插入了一些随机数据 这是用于发送文件的服务器代码 public void sendFile(Socket socket, String file) throws IOException { DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); FileInputStream

我试图从Java服务器向C客户机发送一个文本文件。在我运行代码后,文本文件被成功接收,但当我打开它时,我发现文本文件中插入了一些随机数据

这是用于发送文件的服务器代码

public void sendFile(Socket socket, String file) throws IOException 
{
    DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
    FileInputStream fis = new FileInputStream(file);
    byte[] buffer = new byte[256];

    while (fis.read(buffer) > 0) {
        dos.write(buffer);
    }

    fis.close();
    dos.close();    
}
int recv_file(int sock, char* file_name)
{
     char send_str [MAX_SEND_BUF]; 
     int fp; 
     int sent_bytes, rcvd_bytes, rcvd_file_size;
     int recv_count; 
     unsigned int recv_str[MAX_RECV_BUF];
     size_t send_strlen; 
     send_strlen = strlen(send_str); 
     if ( (fp = open(file_name, O_WRONLY|O_CREAT, 0644)) < 0 )
     {
           perror("error creating file");
           return -1;
     }
     recv_count = 0;
     rcvd_file_size = 0;
     while ( (rcvd_bytes = recv(sock, recv_str, MAX_RECV_BUF/*256*/, 0)) > 0 )
     {
           recv_count++;
           rcvd_file_size += rcvd_bytes;
           if (write(fp, recv_str, rcvd_bytes) < 0 )
           {
                  perror("error writing to file");
                  return -1;
           }
           printf("%dThe data received is %u\n", ++count, recv_str);
     }
     close(fp);
     printf("Client Received: %d bytes in %d recv(s)\n", rcvd_file_size,    recv_count);
     return rcvd_file_size;
}
这是接收文件的客户端代码

public void sendFile(Socket socket, String file) throws IOException 
{
    DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
    FileInputStream fis = new FileInputStream(file);
    byte[] buffer = new byte[256];

    while (fis.read(buffer) > 0) {
        dos.write(buffer);
    }

    fis.close();
    dos.close();    
}
int recv_file(int sock, char* file_name)
{
     char send_str [MAX_SEND_BUF]; 
     int fp; 
     int sent_bytes, rcvd_bytes, rcvd_file_size;
     int recv_count; 
     unsigned int recv_str[MAX_RECV_BUF];
     size_t send_strlen; 
     send_strlen = strlen(send_str); 
     if ( (fp = open(file_name, O_WRONLY|O_CREAT, 0644)) < 0 )
     {
           perror("error creating file");
           return -1;
     }
     recv_count = 0;
     rcvd_file_size = 0;
     while ( (rcvd_bytes = recv(sock, recv_str, MAX_RECV_BUF/*256*/, 0)) > 0 )
     {
           recv_count++;
           rcvd_file_size += rcvd_bytes;
           if (write(fp, recv_str, rcvd_bytes) < 0 )
           {
                  perror("error writing to file");
                  return -1;
           }
           printf("%dThe data received is %u\n", ++count, recv_str);
     }
     close(fp);
     printf("Client Received: %d bytes in %d recv(s)\n", rcvd_file_size,    recv_count);
     return rcvd_file_size;
}
int recv_文件(int sock,char*文件名)
{
char send_str[MAX_send_BUF];
int-fp;
int发送字节、rcvd字节、rcvd文件大小;
int recv_计数;
无符号整数recv_str[MAX_recv_BUF];
发送的大小;
send_strlen=strlen(send_str);
如果((fp=open(文件名,O_WRONLY,O|u CREAT,0644))<0)
{
perror(“创建文件时出错”);
返回-1;
}
记录计数=0;
rcvd_文件_大小=0;
而((rcvd_bytes=recv(sock,recv_str,MAX_recv_BUF/*256*/,0))>0)
{
recv_count++;
rcvd_文件_大小+=rcvd_字节;
if(写入(fp、recv_str、rcvd_字节)<0)
{
perror(“写入文件时出错”);
返回-1;
}
printf(“%d接收到的数据是%u\n”++计数,recv_str);
}
关闭(fp);
printf(“客户端接收到%d个字节,单位为%d个recv)\n”,rcvd\u文件大小,recv\u计数);
返回rcvd文件大小;
}
这是客户端接收到的文本文件。


这种胡言乱语被添加到文本文件中,我如何解决这个问题?

您不应该使用
DataOutputStream
,因为它在这里没有任何好处。只需使用套接字中的普通
OutputStream

然后,必须确保只写入文件中的数据量

所以不是

while (fis.read(buffer) > 0) {
    dos.write(buffer);
}
使用

确保只写入文件中的字节数

public void sendFile(Socket socket, String file) throws IOException 
{
    DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
    FileInputStream fis = new FileInputStream(file);
    byte[] buffer = new byte[256];

    while (fis.read(buffer) > 0) {
        dos.write(buffer);
    }

    fis.close();
    dos.close();    
}
int recv_file(int sock, char* file_name)
{
     char send_str [MAX_SEND_BUF]; 
     int fp; 
     int sent_bytes, rcvd_bytes, rcvd_file_size;
     int recv_count; 
     unsigned int recv_str[MAX_RECV_BUF];
     size_t send_strlen; 
     send_strlen = strlen(send_str); 
     if ( (fp = open(file_name, O_WRONLY|O_CREAT, 0644)) < 0 )
     {
           perror("error creating file");
           return -1;
     }
     recv_count = 0;
     rcvd_file_size = 0;
     while ( (rcvd_bytes = recv(sock, recv_str, MAX_RECV_BUF/*256*/, 0)) > 0 )
     {
           recv_count++;
           rcvd_file_size += rcvd_bytes;
           if (write(fp, recv_str, rcvd_bytes) < 0 )
           {
                  perror("error writing to file");
                  return -1;
           }
           printf("%dThe data received is %u\n", ++count, recv_str);
     }
     close(fp);
     printf("Client Received: %d bytes in %d recv(s)\n", rcvd_file_size,    recv_count);
     return rcvd_file_size;
}
while (fis.read(buffer) > 0) {
    dos.write(buffer);
}
您的复制循环不正确。您正在文件末尾写入垃圾邮件,如果不是在之前。应该是:

int count;
while ((count = fis.read(buffer)) > 0) {
    dos.write(buffer, 0, count);
}

在Java中,似乎写的比读的多。在Java中检查您读取了多少数据,并且只将该部分写入DOS。您不想要/需要
DataOutputStream
!使用套接字的普通输出流@JimmyB他使用的是
DataOutputStream
还是套接字的输出流没有任何区别。
DataOutputStream
在这里肯定是多余的,因为没有调用它的特定方法,但它不会“编码您编写的数据”。这里唯一的问题是复制循环。@EJB你说得对。我在考虑
ObjectOutputStream
。我会更正我的答案。@JimmyB Well
ObjectOutputStream.write()
也不编码,但它确实添加了一个流头。@EJP是的,它会在写入的每个对象之前添加类型信息,这与OP的语句“数据已插入文本文件”相关,并导致我错误地想到ObjectOutputStream.Yes,代码在文件末尾添加了垃圾,计数器变量解决了这个问题。