Создание выделенных сокетов для каждой передачи - это одно решение, и оно неплохое, если только количество одновременных подключений не велико (в системе доступно только столько IP-портов, а серверу потребуется вдвое больше). Потоки не настолько упрощают это, как вы думаете, и создают свои собственные проблемы; select
- это более простой способ эффективной передачи данных по нескольким сокетам из одного потока / процесса. Он работает, раскрывая знания базовой операционной системы о том, какие сокеты готовы для чтения и записи в программу.
Сложность для вас с подходом с несколькими сокетами, независимо от выбора потоков, заключается в том, что сервер должен будет сказать получателю об открытии нового соединения с сервером для каждой новой передачи. Теперь вам нужна команда mechansim, чтобы сообщить получателю, что нужно открыть новое соединение для следующего файла.
Другой вариант - открыть только один сокет, но одновременно отправить несколько файлов через сокет. Вы можете сделать это, отправив структуру данных, содержащую следующие части каждого файла, вместо того, чтобы просто передавать файл напрямую. Например, вы можете отправить сообщение, которое выглядит примерно так (для ясности представлено в JSON, но это будет допустимый транспортный формат):
[
{
"name": "file.txt",
"bytes": "some smallish chunk of content",
"eof": false
},
{
"name": "another.txt",
"bytes": "chunk of another.txt content",
"eof": true
}
]
Этот пример, конечно, наивно упрощен, но, надеюсь, этого достаточно, чтобы донести идею: структурируя отправляемые сообщения, вы можете описать, к каким файлам принадлежат отдельные куски байтов, а затем отправить несколько кусков нескольких файлы сразу. Из-за вашего подхода «клиент-> сервер-> клиент» мне кажется, что это лучший путь вперед.