将大文件发送到服务器

时间:2014-04-28 13:15:07

标签: java sockets client

我试图将文件发送到我的服务器。我得到它使用小于100mb的文件。否则我跑出了堆。所以我重新制作了它,但却无法让它发挥作用。除了读取我在bis.read(缓冲区)中遇到的最后数据之外,我还得上班,因为它不知道文件何时结束。所以我尝试发送每个段的长度,以便bufferedInputStream知道何时停止读取。

知道什么是错的吗?

发件人代码:

        FileInputStream fis = new FileInputStream(file);
        byte[] buffer = new byte[2048];
        Integer bytesRead = 0;
        BufferedOutputStream bos = new BufferedOutputStream(clientSocket.getOutputStream());
        BufferedInputStream bis = new BufferedInputStream(fis);

        while ((bytesRead = bis.read(buffer)) > 0) {
            objectOutStream.writeObject(bytesRead);
            bos.write(buffer, 0, bytesRead);

        }
        System.out.println("Sucess sending file");

接收方(服务器):

       fileName = request.getFileName();
       int size = (int) request.getSize();

        BufferedInputStream bis = new BufferedInputStream(clientSocket.getInputStream());

        FileOutputStream fos = new FileOutputStream(fileName);
        int totalBytesReceived = 0;
        int blockSize = 0;
        while (totalBytesReceived < size) {
            Object o = ois.readObject();

            if (!(o instanceof Integer)) {
                System.out.println("Something is wrong");
            }
            blockSize = (Integer) o;

            buffer = new byte[blockSize];

            bis.read(buffer);
            totalBytesReceived += blockSize;
            fos.write(buffer, 0, blockSize);
        }
        System.out.println("File succes");

2 个答案:

答案 0 :(得分:3)

服务器端的阅读代码应与客户端的阅读代码相同。

// copy from bis to bos, using a buffer.
for(int len; (len = bis.read(buffer)) > 0) {
    bos.write(buffer, 0, len);
}

在客户端你想要

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filename));
BufferedOutputStream bos = new BufferedOutputStream(clientSocket.getOutputStream());

在服务器端你想要的。

BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filename));

完成后你想要

bos.close();
bis.close();

如果你打算使用ObjectOutputStream(我建议你不要),你只需要使用这个流,而不是流的混合。

答案 1 :(得分:0)

您可以简化代码。当您到达流的末尾时,您将从bis.read()获得-1。这样你就不需要知道文件的长度。并flush()close()服务器和客户端上的流。正如另一张海报所说,不要使用ObjectOutputStreamObjectIntputStream。您将获得序列化标头,这些标头似乎会损坏您的数据。

   fileName = request.getFileName();

    BufferedInputStream bis = new BufferedInputStream(clientSocket.getInputStream());

    FileOutputStream fos = new FileOutputStream(fileName);
    int data = bis.read(); //reads an int
    while (data != -1) {
        fos.write(data);
        data = bis.read();

    }
    fos.flush();
    fos.close();

    System.out.println("File succes");