Java套接字文件传输-文件不完整

Java套接字文件传输-文件不完整,java,file,sockets,Java,File,Sockets,从服务器到客户端的文件传输有问题。问题是,即使文件有多大,最后的字节也不会被传输。假设我想下载一个56kb的文件,那么我只收到35kb的文件 我将为您提供一些代码片段,也许有人可以看到任何错误 发件人: public void sendFile(String fileName, Socket socket) { try { try { File transferFile = new File(fileName); byte[

从服务器到客户端的文件传输有问题。问题是,即使文件有多大,最后的字节也不会被传输。假设我想下载一个56kb的文件,那么我只收到35kb的文件

我将为您提供一些代码片段,也许有人可以看到任何错误

发件人:

public void sendFile(String fileName, Socket socket) {
    try {
        try {
            File transferFile = new File(fileName);
            byte[] bytearray = new byte[(int) transferFile.length()];
            FileInputStream fin = new FileInputStream(transferFile);
            BufferedInputStream bin = new BufferedInputStream(fin);
            OutputStream os = socket.getOutputStream();
            int bytesRead = 0;

            while (-1 != (bytesRead = bin.read(bytearray, 0, bytearray.length))) {
                os.write(bytearray, 0, bytesRead);
            }

            bin.close();
            os.flush();
            socket.close();
        } catch (IOException e) {
            System.out.println("error " + e);
        }
    } catch (Exception ex) {
        System.out.println("error " + ex);
    }
}
接收人:

public void downloadFile(Socket socket, String fName) {

    try {
        InputStream is = socket.getInputStream();

        FileOutputStream fos = new FileOutputStream(fName);
        BufferedOutputStream bos = new BufferedOutputStream(fos);

        int count;
        byte[] buffer = new byte[1024];

        while ((count = is.read(buffer)) != -1) {
            bos.write(buffer, 0, count);
        }

        bos.flush();
        bos.close();
    } catch (Exception e) {
        System.out.println("Error " + e);
    }
}
欢迎提供任何帮助,谢谢。

而((count=is.read(buffer))>0)
将在
is.read()返回零时中断循环

但是,如果返回零,则不应假定已到达文件末尾,因为根据文档,零是一个完全有效的返回值

您应该一直阅读,直到返回
-1


此外,在关闭
缓冲输出流bos
后,您还应该关闭
文件输出流fos

那么,您是否一直收到不完整的文件?您想用新代码修改您的问题吗?现在发生的是,如果在循环的一次迭代中读取0字节,那么在该迭代中将写入0字节。这可能不是错误,但也不是一个好主意。无论如何,我已经修改了关于需要关闭
FileOutputStream
的回答。通常,最好先在不使用缓冲的情况下让事情正常工作,然后,如果需要,引入
BufferedOutputStream
。只有在缓冲区长度为零或第三个参数提供了零计数时,才能返回零。在出现这样的错误时,您几乎不想旋转循环。请查看此帖子和该帖子中的链接:&在发件人处使用固定长度的缓冲区。无需将其与文件长度关联。1025AS在您的接收代码中是相当充分的,尽管较大的代码不会有什么坏处。