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

IT小君   2021-12-25T06:01:34

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

注意 1:我需要一种方法以一个连续的流发送文件,客户端可以将其分离为单个文件。它不能依赖于来自客户端的个别请求。

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

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

评论(5)
IT小君

这是一个完整的实现:

发送方:

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();

我没有测试它,但我希望它会起作用!

2021-12-25T06:01:34   回复
IT小君

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

2021-12-25T06:01:35   回复
IT小君

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

当然,如果接收进程是Java,直接发送Objects即可。

2021-12-25T06:01:35   回复
IT小君

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

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

和 ...

OutputStream output = connection.getOutputStream();
ZipOutputStream out = new ZipOutputStream(output);
2021-12-25T06:01:35   回复
IT小君

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

2021-12-25T06:01:35   回复