Лучший способ переместить файлы переменных размеров через медленную сеть с помощью.NET

Я создаю клиент/сервер дистанционной работы.NET, который будет передавать тысячи файлов переменных размеров (все от нескольких байтов до сотен МБ), и я хотел бы некоторую обратную связь на лучшем методе для достижения этого. Поскольку я вижу его, существует несколько опций:

  • Сериализируйте весь файл в мой объект ремоутинга и передачу во внезапно, независимо от размера. Это, вероятно, было бы самым быстрым, но отказ во время передачи требует, чтобы целый файл ретранслировался без способа возобновиться.
  • Если размер файла больше, чем что-то маленькое (как 4 КБ), повредите его в блоки 4 КБ и удаленный те, повторно собравшись на сервере. В дополнение к сложности этого это медленнее из-за длительных распространений в прямом и обратном направлениях и подтверждений, хотя отказ любой части не тратит впустую много времени.
  • Включая что-то как FTP или сервер SFTP с моим приложением - клиент уведомит сервер, что это начинает использовать дистанционную работу, загрузите файл, затем используйте дистанционную работу для уведомления относительно завершения. Я хотел бы содержать все в своем приложении вместо того, чтобы требовать отдельного сервиса FTP, но я открыт для этой опции, если это необходимо.
  • Используйте некоторое установленное соединение TCP или WPF или некоторый другой метод передачи, это создается для обработки отказов или способно к выполнению некоторой контрольной точки/резюме.
  • Какие-либо другие я отсутствую?

Каковы самый гибкий метод / метод надежной передачи? Я не то, который коснулся о скорости, но больше о надежности - я хочу, чтобы файл переместился, даже если это медленно. Так как клиент и сервер будет многопоточным, я могу передать несколько файлов одновременно, если соединение позволяет его.

Спасибо за Вашу обратную связь - я добавлю щедрость для получения некоторых рекомендаций на способах, которыми люди выполнили бы это.

5
задан skaffman 31 March 2010 в 19:33
поделиться

3 ответа

BITS (background Intelligent Transfer Service) - хорошее решение. В него встроен многолетний опыт

Некоторые отправные точки:

4
ответ дан 14 December 2019 в 19:08
поделиться

Хотя спокойствие действительно отвечает на вопрос, который вы задаете со стороны жизни уровня OSI 4, мне кажется, что вы больше смотрите на уровни приложений в вашем вопросе. TCP определенно обрабатывает все, начиная от задержки, окон передачи и т. Д. В сетевой части жизни. Однако он не определяет напрямую, что произойдет, если пользователь преждевременно завершит сеанс загрузки, а затем решит продолжить его с того места, где он остановился.

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

Что касается определения скорости, для этого могут быть встроены методы, но один из методов, который вы можете использовать, - это просто создать свой собственный тест скорости: отправить 1 МБ клиенту (загрузка) и пусть он отправит ответ после получения. 1100, разделенное на время, необходимое для получения ответа от клиента, - это количество килобайт / с, необходимое клиенту для загрузки с сервера. И наоборот, чтобы протестировать загрузку с клиента.

Что касается передачи, я бы рекомендовал использовать существующие технологии. SFTP поддерживает передачу зашифрованных данных с аутентификацией. Это в основном FTP, но по SSH. Где-то должны быть API-интерфейсы для взаимодействия с этим.

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

1
ответ дан 14 December 2019 в 19:08
поделиться

Это то, для чего создан протокол TCP и настраивается на него в течение десятилетий или тяжелых испытаний. Удаленное взаимодействие выполняется для небольших вызовов RPC, а не для передачи больших файлов. Вы должны просто использовать TCP-сокет для передачи данных, а протоколы нижнего уровня должны беспокоиться о задержке, окнах передачи, MTU и т. Д.

0
ответ дан 14 December 2019 в 19:08
поделиться
Другие вопросы по тегам:

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