2

所以我有一个学校的作业,其中客户端必须向服务器发送无限的文件。我的想法是这样的。

  1. 客户端将无限量的文件发送到服务器。
  2. 服务器会将客户端上传的文件重定向到我的 wamp 服务器文件夹

我有工作代码,但此代码只能将 1 个文件从客户端发送到服务器。我还希望上传文件的文件名增加,因为在我的代码中它只使用 1 个文件名,所以如果更多客户上传他们的文件,他们将覆盖旧文件名。

例如:file01.rar 接下来上传file02.rar 等等。

这是我的服务器代码:

public void run() {
    filePath = "C:/wamp/www/file.rar";
    byte[] aByte = new byte[1];
    int bytesRead;
    InputStream is = null;
    try {
        is = clientSocket.getInputStream();
    } catch (IOException ie) {
        ie.printStackTrace();
    }
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    if (is != null) {
        FileOutputStream fos = null;
        BufferedOutputStream bos = null;
        try {
            fos = new FileOutputStream(filePath);
            bos = new BufferedOutputStream(fos);
            bytesRead = is.read(aByte, 0, aByte.length);
            do {
                baos.write(aByte);
                bytesRead = is.read(aByte);
            } while (bytesRead != -1);
            bos.write(baos.toByteArray());
            bos.flush();
            bos.close();
        } catch (IOException ie) {
            ie.printStackTrace();
        }
    }
}

这是我的客户代码:

BufferedOutputStream bos = null;
            try {
                bos = new BufferedOutputStream(s.getOutputStream());
            } catch (IOException ie) {
                ie.printStackTrace();
            }

            if (bos != null) {
                File uploadFile = new File(clientFacultyUploadTextField.getText());
                byte[] myFileSize = new byte[(int)uploadFile.length()];
                FileInputStream fis = null;
                try {
                    fis = new FileInputStream(uploadFile);
                } catch (FileNotFoundException fife) {
                    fife.printStackTrace();
                }
                BufferedInputStream bis = new BufferedInputStream(fis);
                try {
                    bis.read(myFileSize, 0, myFileSize.length);
                    bos.write(myFileSize, 0, myFileSize.length);
                    bos.flush();
                    bos.close();
                    clientFacultyUploadTextField.setText("Upload complete...");
                } catch (IOException ie) {
                    ie.printStackTrace();
                }
            }
4

1 回答 1

0

当您发送多个文件时,您需要告诉服务器一个文件何时停止,而另一个文件何时开始,以便它可以分别处理它们。

有多种方法可以解决这个问题。以下是一些,从简单但有限到困难但令人印象深刻的顺序:

a) 为每个文件使用一个新连接,并在传输完成后关闭它。这告诉服务器文件已经结束。这样做的好处是您可以轻松扩展它以允许同时上传多个文件。缺点:当传输由于某种原因中断时,服务器可能不会将其检测为错误并保存部分文件,就好像它已完成一样。

b) 使用相同的连接,但告诉服务器每个文件的长度。您可以通过以文件长度(以字节为单位)开始每个文件传输来做到这一点。这样服务器就可以读取这个字节数,然后启动一个新文件。当然,这仅在事先知道文件大小时才有效。当您在上传过程中流式传输仍在创建的文件时,无法使用它。

c) 使用成帧协议。将文件分成多个块,并在每个块前面加上一个标头,该标头告诉服务器该块的长度以及它是最后一个块还是后面会出现更多块。这种方法有一些开销,但它是一个非常可扩展的架构,它允许您通过向标头添加更多信息来轻松添加新功能。例如,您可以通过将传输的 ID 添加到标头来允许在一个连接上多路传输多个传输,通过添加序列号和控制代码来中止和恢复上传,告诉服务器删除或重命名的特殊命令帧它已经拥有的文件,以及更多。要获得一些灵感,请查看 HTTP 和 FTP 的工作原理。

于 2013-02-03T17:09:29.277 回答