我已经使用此处的代码通过套接字发送单个文件。但是,我需要能够通过套接字发送多个文件(基本上是目录中的所有文件),并让客户端识别文件之间的分离方式。坦率地说,我完全不知道该怎么做。任何提示都会有所帮助。
注意 1:我需要一种方法以一个连续的流发送文件,客户端可以将其分离为单个文件。它不能依赖于来自客户端的个别请求。
注意 2:要回答一个问题,我很确定我会在评论中得到解答,不,这不是作业。
编辑有人建议我可以在文件本身之前发送文件的大小。我该怎么做,因为通过套接字发送文件总是在预先确定的字节数组或单个字节中完成,而不是由返回的长字节File.length()
这是一个完整的实现:
发送方:
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();
我没有测试它,但我希望它会起作用!