Java 将文件从客户端传输到服务器

Java 将文件从客户端传输到服务器,java,file,client-server,Java,File,Client Server,我试图将一个文本.txt文件从客户端简单地传输到服务器,无论我认为我知道多少,理解我在做什么,以及到底发生了什么,我总是出错。我真的需要一些帮助 这是一个代码,两个将.txt文件从一个文件传输到另一个文件的函数: 客户端: private void sendFileToServer(String file_name) throws IOException { File file=new File(file_name); int file_size=(int)file.lengt

我试图将一个文本
.txt
文件从客户端简单地传输到服务器,无论我认为我知道多少,理解我在做什么,以及到底发生了什么,我总是出错。我真的需要一些帮助

这是一个代码,两个将
.txt
文件从一个文件传输到另一个文件的函数:
客户端:

private void sendFileToServer(String file_name) throws IOException {

    File file=new File(file_name);
    int file_size=(int)file.length();
    byte[] bytes=new byte[file_size];
    FileInputStream os=null;
    try {
        os = new FileInputStream(file);
    } catch (FileNotFoundException e) {
        System.out.println("The file "+file+" wasn't found");
        return;
    }
    BufferedInputStream bos=new BufferedInputStream(os);

    bos.read(bytes);
    output.write(bytes,0,bytes.length);
    /* 'output' is a PrintStream object, that holds the output stream
     * for the client's socket, meaning:
     * output=new PrintStream(client_socket.getOutputStream()); */
    output.flush();
    bos.close();
}
这会将所有内容缓冲到
BufferedInputStream
,将其复制到
字节中
,然后将其发送到另一端-服务器。
服务器端:

public static String receiveFileFromClient(Client client) throws IOException {

    int buffer_size=client.getSocket().getReceiveBufferSize();
    byte[] bytes=new byte[buffer_size];
    FileOutputStream fos=new FileOutputStream("transfered_file.txt");
    BufferedOutputStream bos=new BufferedOutputStream(fos);

    DataInputStream in=client.getInputStream();

    int count;
    System.out.println("this will be printed out");
    while ((count=in.read(bytes))>0) { // execution is blocked here!
        bos.write(bytes, 0, count);
    }
    System.out.println("this will not be printed");
    bos.flush();
    bos.close();

    return "transfered_file.txt";

}
我在这里的意图是保持从客户端读取字节(while循环),直到另一端(客户端)没有更多的字节可发送,这就是in的位置。read(bytes)应返回0,循环应中断,但这永远不会发生,它只是被阻塞,即使客户机输入流中的所有字节都已成功传输
为什么循环没有中断?
从Javadoc:

如果由于流位于文件末尾而没有可用字节,则 返回值-1

最后一个字节不被认为是“文件末尾”吗?我确保函数
sendFileToServer
正确地将整个文件写入
output
实例(PrintStream对象)并返回。

任何帮助都将不胜感激。

如果您不关闭流,read()方法将阻止进一步输入。因此,如果不关闭流,或者删除循环,只读取从客户端接收的字节数,则read()方法将阻塞,直到它读取[bytes]或套接字关闭为止。因此,read()没有什么指示它应该停止读取的内容,因为它不“理解”文件,它只是一些数据

解决方案

您可以确定客户端将发送的字节数(在客户端),然后将该字节数发送到服务器。现在,服务器可以处理这个数字,并知道在文件完成之前要读取多少字节。因此,当传输完成时,您可以中断循环(甚至不使用循环)


您还可以处理服务器接收的数据,并让客户端在文件完成后发送一些“标志”,以便服务器知道何时完成。但这更困难,因为您必须找到文件字节数据中不包含的内容

我无法关闭流-我需要它来在客户端和服务器之间进行进一步的通信和数据传输。我无法删除while循环-服务器不知道从客户端接受多少字节,它无法预测文件大小…流上有可用的()函数,或者在第一个字节中发送什么大小?是的,我想我会这样做。谢谢你的帮助。将字节数发送到服务器是个好主意。谢谢