2013-02-03 49 views
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(); 
       } 
      } 
+0

关于SO的第一个问题和这么好的格式化,+1 :) – Abubakkar

回答

0

当您发送多个文件,你需要告诉服务器当一个文件停止和其他文件开始,以便它可以分开处理它们。

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

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

b)使用相同的连接,但告诉服务器每个文件的长度。您可以通过以文件长度以字节为单位开始每个文件传输来完成此操作。这样服务器可以读取这个字节数,然后开始一个新文件。当然,这只在事先知道文件大小时才起作用。在流式传输上传文件时,不能使用它。

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

+0

Im lost,where I should start?我想你的第二个解决方案对我来说是最好的也是最简单的。告诉我,如果我做的是正确的事情。我会得到文件的长度?然后使用条件语句,如if(file == fileSize)?然后使用像布尔完成并将其设置为true?像那样? –

相关问题