Да, разумно использовать несколько портов при передаче файлов.Это потребовало бы достаточно продвинутого протокола, чтобы использовать тот же порт и при этом сохранять ответ приложения (поскольку вы все еще должны иметь возможность отправлять команды во время передачи файлов).
Но я не рекомендую использовать три фиксированныхпорты.Используйте один порт для всех команд и произвольное количество портов для передачи файлов.
Передача файлов будет выглядеть следующим образом:
- (CmdPort) Клиент -> Сервер Эй, я хочу передать файл XXX с размером ГГГГ
- (CmdPort) Сервер -> Клиент Roger, подключиться к порту 8217 и передать файл
- (8217) Клиент -> Сервер Подключается, передает весь файл, отключается
- (8217) Сервер Проверяет, что переданный размер соответствует размеру, указанному в шаге # 1
Это позволяет передавать несколько файлов одновременно.Позвольте серверу создать новый сокет прослушивания, используя порт 0. Он говорит ОС выбрать свободный порт.Затем используйте Socket.LocalEndpoint
, чтобы узнать порт перед отправкой его обратно на шаге 2.
Указанный подход также позволяет вам воспользоваться преимуществом Socket.SendFile
, которое, вероятно, является наиболее эффективным и быстрым способом отправки файлов с использованием.NET.
(FTP использует тот же подход, что и bittorrent. Возможно, вы использовали файловый менеджер при загрузке файлов из Интернета. Они используют более экстремальный подход и разбивают загрузку файлов понесколько сокетов для обхода ограничения пропускной способности веб-сервера.)
обновление в ответ на комментарий:
мое приложение также отправляет папки, папкиможет иметь 2000 файлов, размер многих файлов может быть меньше килобайта, было бы огромной ошибкой подключаться к каждому файлу .. или, возможно, мне следует подключиться один раз для каждой задачи (папка / файл)
Вы не указали эту информацию в исходном вопросе, что заставило меня предположить, что вы передаете только один файл за раз.
Пакетная передача будет работатьТаким же образом, просто измените так, чтобы шаг # 1 отправлял список имени файла + размер, а затем отправлял все файлы один за другим на шаге № 3.