【问题标题】:Java socket file transfer - not complete fileJava 套接字文件传输 - 不完整的文件
【发布时间】:2015-10-26 00:40:57
【问题描述】:

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

我会为你提供一些代码 sn-ps,也许有人会看到任何错误。

发件人:

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);
    }
}

欢迎任何帮助,谢谢。

【问题讨论】:

标签: java file sockets


【解决方案1】:

如果is.read() 返回零,while ((count = is.read(buffer)) > 0) 将中断循环。

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

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

此外,关闭您的BufferedOutputStream bos 后,您还应该关闭您的FileOutputStream fos

【讨论】:

  • 所以,您一直收到不完整的文件?你想用你的新代码修改你的问题吗?
  • 现在发生的情况是,如果在循环的一次迭代中读取了 0 个字节,那么在该迭代中将写入 0 个字节。这可能不是错误,但这也不是一个好主意。无论如何,我已经修改了关于需要关闭FileOutputStream 的答案。
  • 一般来说,最好先让事情在没有缓冲的情况下工作,然后然后,如果需要,引入BufferedOutputStream
  • 只有在缓冲区长度为零或第三个参数提供零计数时才能返回零。在存在这样的错误的情况下,您几乎不想旋转循环。
猜你喜欢
  • 2015-05-16
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多