Как организовать обработчик сокетов c мультизадачностью?
Читал интернет, но всё же нужно разъяснение. Я студент. Описание в скобках, чисто символическое.
Что я пытаюсь понять и сделать:
Есть класс сервера (Server), который при получении сокета делегирует обработку подключения к (Server.Worker). Worker находиться в цикле и постоянно ждёт новый объект от клиента и затем отвечает по правилу. С получением объектов проблем нет. Помимо обмена объектами, мне нужно реализовать передачу файлов небольших размеров и хотел бы это сделать при помощи того же (Worker.Socket.OutputStream) того же сокета (Worker.Socket), который обрабатывает Worker.
Я не знаю, можно ли создать child-thread (Worker.CurrentThread.Fork) и заставить его передавать байты файла, не мешая ему же отправлять объекты на запросы клиента в parent-thread (Worker.CurrentThread)?
Если это невозможно, тогда, пожалуйста, расскажите, как можно реализовать обработчик так, чтобы он мог отвечать клиенту и одновременно отправлять файл? Для этих целей на клиенте мне нужно открыть 2 сокета (Обмен объектов, Передача файла) и переправить специальный объект, который мог бы описать передачу файлов с последующим делегированием задачи к child-thread (Worker.CurrentThread.Fork) для нового сокета? Если так, тогда как на сервере ассоцировать эти 2 сокета как один клиент?
PS: Хотелось бы отдать предпочтение стандартной библиотеке, но не против рассмотреть другие варианты.
Любые рекомендации по поводу архитектуры будут только плюсом.
Если вы хотите мультиплексировать передачу разных данных в одно соединение, то вам нужно будет разработать свой протокол на базе TCP, формировать свои пакеты помечая что это, данные или куски файла, какие это данные, какие это файлы ну и т.д. Причем не важно, пишите вы из одного потока или из разных. Суть остается той же, вы на клиенте должны иметь возможность разделять данные, которые вам приходят.
Если у вас нету каких-то особых требований, то проще сделать по соединению на каждое действие (прием/загрузка файла, передача данных и тд.).
p.s. Не пугайтесь фраз типа "разработать протокол". Это не так уж и сложно по сути. Вам нужно только определить формат заголовка, то есть обычную структурку, в которой должны быть для простоты указаны длина пакета (без учета заголовка), и тип оного (что содержит). Это минимум.
Так с этим понятно. Теперь я хочу как-нибудь иметь ссылки на все threads-workers как поле-коллекции в классе Server, при том, что reseted-сокеты и их объекты-workers не могли бы находиться в коллекции. Подскажите как это лучше сделать? У меня есть идея, это просто сделать коллекцию у Server и тупо add при добавлении и при исключении reset-socket remove из коллекции. Мне хочеться всё же ассоциировать подключения и как то обращаться к workers для некоторых задач. Если брать ExecutorsService то это просто runner-pool с проверкой их статуса.