从客户端向服务器发送无限制文件

时间:2013-02-03 16:46:11

标签: java

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

  1. 客户端将无限制的文件发送到服务器。
  2. 服务器会将客户端上传的文件重定向到我的wamp服务器文件夹
  3. 我有工作代码,但此代码只能从客户端向服务器发送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();
                    }
                }
    

1 个答案:

答案 0 :(得分:0)

当您发送多个文件时,您需要在一个文件停止并且另一个文件开始时告诉服务器,以便它可以单独处理它们。

有多种方法可以解决这个问题。这里有一些,从简单但有限但有限但令人印象深刻的命令:

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

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

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