Я пытаюсь реализовать серверное приложение с несколькими клиентами и у меня есть несколько вопросов о дизайне сетей / потоков. Проблема, с которой я сейчас сталкиваюсь, заключается в том, как обмениваться сообщениями между уровнем связи и уровнем логики.
Сервер обрабатывает несколько клиентов, где каждый из них может быть активным в нескольких «каналах», где каждый канал имеет несколько ступеней и может иметь несколько клиентов, действующих в нем. Думайте об этом как о программе чата с несколькими комнатами.
Я уже реализовал получение сообщений на стороне сервера. У каждого клиента есть свой собственный поток, который блокирует чтение данных и декодирует их в сообщение. Теперь, как действовать? По моему мнению, каждый канал также должен иметь свой собственный поток, чтобы легко поддерживать свое состояние. Я мог бы использовать BlockingQueue для обмена полученными сообщениями с потоком канала, который блокирует ожидание новых сообщений в этой очереди.
Но тогда как отправлять сообщения клиентам? Логика в канале будет обрабатывать сообщение и генерировать некоторые сообщения для отправки одному / нескольким / всем клиентам. Безопасно ли использовать поток канала для прямой записи в сокет? Или я должен использовать другой BlockingQueue для передачи сообщений в поток обработчика клиента? Но как его разбудить, так как он ожидает чтения из сокета? Или я должен использовать отдельный send-thread для каждого клиента или даже отдельный send-socket?
Кстати: я знаю, что могу использовать существующие библиотеки для сетевого уровня, но я хочу сделать это с нуля на простых сокетах.