Задать вопрос
Meridian312
@Meridian312

Как организовать обработчик сокетов 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: Хотелось бы отдать предпочтение стандартной библиотеке, но не против рассмотреть другие варианты.

Любые рекомендации по поводу архитектуры будут только плюсом.
  • Вопрос задан
  • 2415 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Если вы хотите мультиплексировать передачу разных данных в одно соединение, то вам нужно будет разработать свой протокол на базе TCP, формировать свои пакеты помечая что это, данные или куски файла, какие это данные, какие это файлы ну и т.д. Причем не важно, пишите вы из одного потока или из разных. Суть остается той же, вы на клиенте должны иметь возможность разделять данные, которые вам приходят.

Если у вас нету каких-то особых требований, то проще сделать по соединению на каждое действие (прием/загрузка файла, передача данных и тд.).

p.s. Не пугайтесь фраз типа "разработать протокол". Это не так уж и сложно по сути. Вам нужно только определить формат заголовка, то есть обычную структурку, в которой должны быть для простоты указаны длина пакета (без учета заголовка), и тип оного (что содержит). Это минимум.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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