如何通过Java中的套接字发送文件列表

我在这里使用代码通过套接字发送单个文件。 但是,我需要能够通过套接字发送多个文件(基本上是目录中的所有文件),并让客户端识别文件之间的分离方式。 坦率地说,我完全不知道该做什么。 任何提示都会有所帮助。

注1:我需要一种方法来在一个连续的流中发送文件,客户端可以将这些文件分离成单个文件。 它不能依赖客户的个别请求。

注2:要回答一个问题,我很确定我会在评论中写到,不,这不是作业。

编辑有人建议我可以在文件本身之前发送文件的大小。 我怎么能这样做,因为通过套接字发送文件总是以预定的字节数组或单个字节完成,而不是由File.length()返回的long。

这是一个完整的实现:

发件人方:

 String directory = ...; String hostDomain = ...; int port = ...; File[] files = new File(directory).listFiles(); Socket socket = new Socket(InetAddress.getByName(hostDomain), port); BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream()); DataOutputStream dos = new DataOutputStream(bos); dos.writeInt(files.length); for(File file : files) { long length = file.length(); dos.writeLong(length); String name = file.getName(); dos.writeUTF(name); FileInputStream fis = new FileInputStream(file); BufferedInputStream bis = new BufferedInputStream(fis); int theByte = 0; while((theByte = bis.read()) != -1) bos.write(theByte); bis.close(); } dos.close(); 

接收方:

 String dirPath = ...; ServerSocket serverSocket = ...; Socket socket = serverSocket.accept(); BufferedInputStream bis = new BufferedInputStream(socket.getInputStream()); DataInputStream dis = new DataInputStream(bis); int filesCount = dis.readInt(); File[] files = new File[filesCount]; for(int i = 0; i < filesCount; i++) { long fileLength = dis.readLong(); String fileName = dis.readUTF(); files[i] = new File(dirPath + "/" + fileName); FileOutputStream fos = new FileOutputStream(files[i]); BufferedOutputStream bos = new BufferedOutputStream(fos); for(int j = 0; j < fileLength; j++) bos.write(bis.read()); bos.close(); } dis.close(); 

我没有测试它,但我希望它能工作!

您可以在每个文件之前首先发送文件的大小,这样客户端将知道当前文件何时结束并期望下一个(大小)。 这将允许您为所有文件使用一个连续的流。

一种非常简单的方法是在发送每个文件之前发送文件长度,以便确定文件之间的分隔。

当然,如果接收过程是Java,您只需发送对象即可。

您可以在客户端压缩文件并将此压缩流发送到服务器。

例如: http : //www.exampledepot.com/egs/java.util.zip/CreateZip.html

与……

 OutputStream output = connection.getOutputStream(); ZipOutputStream out = new ZipOutputStream(output); 

也许最快的方法是自动将目录中的文件压缩并解压缩到一个文件中,参见java.util.zip包