Вопрос по java, sockets – Как отправить список файлов через сокет в Java [duplicate]

8

This question already has an answer here:

Java multiple file transfer over socket 2 answers

Я использовал кодВот отправить отдельный файл через сокет. Однако мне нужно иметь возможность отправлять несколько файлов (в основном все файлы в каталоге) через сокет, и клиент должен распознавать, как происходит разделение между файлами. Честно говоря, я в полной растерянности, что делать. Любые советы будут полезны.

NOTE 1: Мне нужен способ отправки файлов в одном непрерывном потоке, который клиент может разделить на отдельные файлы. Он не может полагаться на отдельные запросы от клиента.

NOTE 2: Чтобы ответить на вопрос, я почти уверен, что получу в комментариях, нет, этоNOT домашнее задание.

EDIT было предложено, чтобы я мог отправить размер файла до самого файла. Как я могу это сделать, так как отправка файла через сокет всегда выполняется либо в заранее определенном массиве байтов, либо в отдельном байте, а не в длинном, возвращаемомFile.length()

Ваш Ответ

5   ответов
1

ой каждого файла, чтобы вы могли определить расстояние между файлами.

Конечно, если процесс получения Java, вы можете просто отправить Объекты.

0

тый поток на сервер.

например:http://www.exampledepot.com/egs/java.util.zip/CreateZip.html

с ...

OutputStream output = connection.getOutputStream();
ZipOutputStream out = new ZipOutputStream(output);
спасибо, но архивирование не особенно полезно. Мне нужен поток, который способен манипулировать одним файлом, в то время как следующий поток все еще передается ewok
18

Sender Side:

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

Receiver Side:

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

Я не проверял это, но я надеюсь, что это будет работать!

Не уверен, что мне было неясно или что-то, но клиент и сервер, похоже, поменялись здесь из-за моих намерений. несмотря на это, это было довольно просто исправить. Спасибо! ewok
@ewok упс, я пишу код после просмотра заголовка. Однако большой разницы нет, и я рад, что смог помочь :)
Идеальное решение. огромное спасибо
2

чтобы клиент знал, когда закончился текущий файл, и ожидал следующий (размер). Это позволит вам использовать один непрерывный поток для всех файлов.

Вы можете конвертироватьFile.length() к байту массива соответствующего размера и использовать его (Long.SIZE говорит вам количество бит, с небольшой математикой вы можете получить количество байтов) - проверитьthis SO thread о том, как выполнить преобразование массива длинных байтов
@ Аттила или просто используйDataInputStream а такжеDataOutputStream :)
Можете ли вы дать мне быстрый пример этого? Я довольно новичок в программировании сокетов, и я не уверен, каким образом я буду отправлять размер файла, поскольку вам нужно либо отправить заранее определенный массив байтов, либо один байт, а не длинный, которыйFile.length() вернусь ewok
0

самый быстрый способ - это автоматически заархивировать и разархивировать файлы в вашем каталоге в один файл, см. Пакет java.util.zip

Похожие вопросы