Ну, я не думаю, что есть прямой ответ на ваш вопрос; Тем не менее, вот несколько замечаний:
Если клиент отправляет команду "SENDFILE", я хочу, чтобы сервер мог ...
Это подход; Тем не менее, вы можете посмотреть на инвертирование управления немного больше. Иметь информацию о файле извлечения, которая возвращает информацию о размере / версии. Затем получите файл для чтения, который принимает смещение и длину. Теперь клиент может «опросить» свой путь через файл, а не пытаться получить данные так быстро, как сервер может их отправить.
Здесь класс, который читает из сетевого потока асинхронно и записывает в файловый поток синхронно: Это верно?
Да, с первого взгляда.
Проблема, с которой я сталкиваюсь, заключается в том, чтобы делать обратное - читать из файлового потока в сетевой поток. Должен ли я читать из файлового потока асинхронно и записывать синхронно в сетевой поток?
Опять же, я бы использовал цикл опроса клиента для одновременного извлечения фрагментов файла. Затем его также можно перезапустить, если розетка будет отсоединена.
также потому, что в вышеприведенном примере вызывается первый раз Start () и функция заканчивается ...
Да, это вообще проблема с сокетами. Вам нужно будет отслеживать информацию о состоянии каждого сокета, чтобы вы знали, что делать с полученными байтами. Пишу ли я в файл, жду ли я команды и т. Д. Честно говоря, если бы я писал это (чего бы я ни делал с сокетами), я бы упаковал все в префикс длины google protobuffer , содержащий подробности о каждом запросе. Это позволяет разгрузить управление состоянием на клиенте, а не отслеживать его на сервере.
Может ли кто-нибудь указать мне правильное направление? из того, что я вижу, не так много в сети.
Я думаю, что общая причина, по которой вы мало что находите в этом поиске в сети, заключается в том, что большинство (90% или около того) даже не пытаются это сделать. Делать это с помощью сокетов сложно, утомительно и чрезвычайно подвержено ошибкам. Я бы даже не стал использовать сырые сокеты для общения. Выберите любой существующий клиент / серверный транспорт и используйте его. Моя рекомендация, вероятно, будет опираться на WCF, если вам потребуются примеры.
Ура и удачи!