我使用代码here通过套接字发送单个文件。但是,我需要能够通过套接字发送多个文件(基本上是目录中的所有文件),并让客户端识别文件之间的分离方式。坦率地说,我完全不知所措。任何提示都会有所帮助。
注意1:我需要一种方法来在一个连续的流中发送文件,客户端可以将这些文件分隔成单个文件。它不能依赖客户的个别请求。
注意2:要回答一个问题,我很确定我会在评论中加入,不,这是 NOT 作业。
编辑有人建议我可以在文件本身之前发送文件的大小。我怎么能这样做,因为通过套接字发送文件总是以预定的字节数组或单个字节完成,而不是File.length()
答案 0 :(得分:18)
这是一个完整的实现:
发件人方:
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();
我没有测试它,但我希望它会起作用!
答案 1 :(得分:2)
您可以在每个文件之前首先发送文件的大小,这样客户端将知道当前文件何时结束并期望下一个(大小)。这将允许您为所有文件使用一个连续的流。
答案 2 :(得分:1)
一种非常简单的方法是在发送每个文件之前发送文件长度,以便确定文件之间的分隔。
当然,如果接收过程是Java,您只需发送对象。
答案 3 :(得分:0)
您可以在客户端压缩文件并将此压缩流发送到服务器。
例如:http://www.exampledepot.com/egs/java.util.zip/CreateZip.html
与......
OutputStream output = connection.getOutputStream();
ZipOutputStream out = new ZipOutputStream(output);
答案 4 :(得分:0)
也许最快的方法是自动将目录中的文件压缩并解压缩到一个文件中,参见java.util.zip包