【问题标题】:Sending large files over socket通过套接字发送大文件
【发布时间】:2012-07-12 05:38:30
【问题描述】:

我在套接字文件发送器上工作,它工作得很好,但我不能用它发送大文件。总是出现堆错误。然后我改变了客户端的代码,所以它会分块发送文件。现在我可以发送大文件,但出现了新问题。现在我收到了空的小文件和较大的文件,例如无法播放视频。下面是客户端发送文件的代码:

public void send(File file) throws UnknownHostException, IOException {

    // Create socket
    hostIP = "localhost";
    socket = new Socket(hostIP, 22333);

    //Send file

    FileInputStream fis = new FileInputStream(file);
    BufferedInputStream bis = new BufferedInputStream(fis);

    DataInputStream dis = new DataInputStream(bis);


    OutputStream os = socket.getOutputStream();

    //Sending size of file.
    DataOutputStream dos = new DataOutputStream(os);
    dos.writeUTF(file.getName() + ":" + userName);

    byte[] arr = new byte[1024];
    try {
        int len = 0;
        while ((len = dis.read(arr)) != -1) {
            dos.write(arr, 0, len);

        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }



    dos.flush();

    socket.close();
}

这是服务器代码:

void start() throws IOException {

        // Starts server on port.
        serverSocket = new ServerSocket(port);

        int bytesRead;

        while (true) {
            connection = serverSocket.accept();

            in = connection.getInputStream();

            clientData = new DataInputStream(in);

            String[] data = clientData.readUTF().split(":");
            String fileName = data[0];
            String userName = data[1];

            output = new FileOutputStream("C:/" + fileName);
            long size = clientData.readLong();
            byte[] buffer = new byte[1024];

            // Build new file
            while (size > 0 && (bytesRead = clientData.read(buffer, 0, (int) Math.min(buffer.length, size))) != -1) {
                output.write(buffer, 0, bytesRead);
                size -= bytesRead;
            }
            output.close();
        }
    }

【问题讨论】:

  • 作为建议: 在通过套接字发送和接收时,使用BufferedStream 作为FileStreamDataStream 之间的中间流,只是为了更快的过渡。
  • 请停止转发此问题。这是第三次迭代。你已经有很多答案了。如果您不理解它们,请在答案所在的地方说出来。
  • 是的,确实我听不懂,但我已经从其他人那里得到了帮助,但它产生了新问题,所以我再次发布它,因为现在问题不同了

标签: java


【解决方案1】:

您未能将文件的长度写入客户端中的流:

long size = clientData.readLong();

所以服务器中的调用正在读取实际文件的前 8 个字节,谁知道这个数量是多少。您不必从流中读取长度,因为您只编写了一个文件。读取文件名和用户名后(不是很安全吗?),您可以读取流直到 EOF。如果您想通过同一个打开的套接字发送多个文件,那么您需要在读取文件之前知道长度。

您的阅读缓冲区也很小。您应该至少为 8192 而不是 1024。并且您需要将所有 .close() 放在 finally 块中,以确保您的服务器和客户端在出现异常时正确关闭。

【讨论】:

  • 用户名是该文件来自的电脑的名称。你能编辑我的代码吗?我在这个问题上工作了两个多月,每次我让它发送大文件时都会破坏它们,当我解决这个问题时,它会停止发送大文件。我真的没有选择
  • 我的时薪是 100 美元/小时。
猜你喜欢
  • 1970-01-01
  • 2017-03-14
  • 2011-02-24
  • 2012-01-30
  • 2013-12-15
  • 2015-08-28
  • 2021-07-06
相关资源
最近更新 更多