передача различных файлов один за другим - сокеты Java - PullRequest
0 голосов
/ 17 сентября 2010

Я пишу сокет-сервер, чтобы при запросе клиента сервер отправлял несколько файлов один за другим.Предположим, у меня есть file1, file2 и file3 для передачи.Как я могу узнать на стороне клиента, завершился ли file1, а file2 запущен?Для сообщений я использую символ DELIMITER (\ r \ n).Должен ли я использовать thise для файлов тоже?Я не думаю, что будет хорошей идеей продолжать присматривать за разделителем внутри байтов файла.

И мне нужно использовать то же TCP-соединение, что и для передачи этих файлов.

Ответы [ 3 ]

2 голосов
/ 17 сентября 2010

Есть два основных способа сделать это:

  • Используйте символ разделителя файлов и внедрите механизм «экранирования» разделителя, если он появляется в содержимом файла.

  • Передайте длину файла перед отправкой.

Первый подход требует, чтобы отправляющая и получающая стороны проверяли каждый байт каждого переданного файла. Второй подход лучше, потому что он избегает этого. Тем не менее, предполагается, что вы можете определить длину файла, прежде чем отправить его ... что не всегда так; например если вы генерируете файлы на лету, пишите их прямо в поток сокетов.

Существует вариант второго подхода, воплощенный в HTTP-схеме «чанк кодирования». (Спасибо @BalusC за напоминание.) Это включает в себя разбиение файла и отправку его в виде последовательности «чанков», которым предшествуют размеры чанков. Это имеет два преимущества по сравнению с подходом «размер + файл»:

  • Отправителю не нужно заранее знать размер файла.
  • Возможно (при подходящем дизайне протокола) отправитель или получатель могут отменить / пропустить отправку одного файла и перейти к следующему. (При простом подходе «размер + файл» протокол не может это поддерживать, поскольку отправитель и получатель не могут надежно ресинхронизироваться.)
1 голос
/ 17 сентября 2010

Вместо разделителя можно получить, чтобы принимающая сторона обнаруживала, когда входная сторона сокета пуста, и отправляла запрос отправителю на выходной стороне сокета. Если это была просто задержка, отправитель отвечает «отправкой файла X», и получатель знает, что нужно ждать. Если передача была завершена, отправитель отвечает «передача завершена (### байт)», поэтому получатель знает, что он готов к следующему файлу.

Добавляет небольшую задержку между файлами, но это простой способ использовать один и тот же сокет для нескольких передач без необходимости использовать разделители, которые необходимо экранировать.

1 голос
/ 17 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...