Java многопоточный сервер с состоянием - сетевой дизайн - PullRequest
4 голосов
/ 01 февраля 2011

Я пытаюсь реализовать серверное приложение с несколькими клиентами и у меня есть несколько вопросов о дизайне сетей / потоков. Проблема, с которой я сейчас сталкиваюсь, заключается в том, как обмениваться сообщениями между уровнем связи и уровнем логики.

Сервер обрабатывает несколько клиентов, где каждый из них может быть активным в нескольких «каналах», где каждый канал имеет несколько ступеней и может иметь несколько клиентов, действующих в нем. Думайте об этом как о программе чата с несколькими комнатами.

Я уже реализовал получение сообщений на стороне сервера. У каждого клиента есть свой собственный поток, который блокирует чтение данных и декодирует их в сообщение. Теперь, как действовать? По моему мнению, каждый канал также должен иметь свой собственный поток, чтобы легко поддерживать свое состояние. Я мог бы использовать BlockingQueue для обмена полученными сообщениями с потоком канала, который блокирует ожидание новых сообщений в этой очереди.

Но тогда как отправлять сообщения клиентам? Логика в канале будет обрабатывать сообщение и генерировать некоторые сообщения для отправки одному / нескольким / всем клиентам. Безопасно ли использовать поток канала для прямой записи в сокет? Или я должен использовать другой BlockingQueue для передачи сообщений в поток обработчика клиента? Но как его разбудить, так как он ожидает чтения из сокета? Или я должен использовать отдельный send-thread для каждого клиента или даже отдельный send-socket?

Кстати: я знаю, что могу использовать существующие библиотеки для сетевого уровня, но я хочу сделать это с нуля на простых сокетах.

Ответы [ 2 ]

1 голос
/ 01 февраля 2011

Поместите метод отправки сообщения в объект связи, который обертывает сокет. Синхронизируйте этот метод, чтобы только один поток мог вызывать его одновременно. Тогда не имеет значения, сколько потоков вызывает этот метод. Каждое сообщение будет отправлено только по одному. Вам также не нужно беспокоить поток, который блокирует чтение. Этот метод отправки будет достаточно быстрым, и вам не придется беспокоиться о блокировке других потоков во время отправки потока.

Пока канал имеет ссылку на объекты связи для каждого подключенного клиента, он может отправлять сообщения и не беспокоиться об этом.

Если это когда-либо вызывало проблемы, вы всегда можете изменить это отправляющее сообщение, чтобы поставить в очередь объект для отправки. Тогда у вас может быть определенный поток отправки для блокировки в очереди и записи содержимого в сокет. Но по моему опыту, в этом нет необходимости.

0 голосов
/ 01 февраля 2011

А как насчет механизма событий? Когда вы будете готовы обработать запрос и появятся данные для клиента, просто отправьте его с событием для потока обработчика сокета клиента. как, потому что передача от клиента закончена, вы можете отправить ответ нормально - если я думаю правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...