Я собираюсь реализовать клиент-серверное приложение в Java. Клиент и сервер общаются друг с другом через TCP. Существует только один центральный сервер, который обрабатывает все сообщения клиента.
Я не использую RMI для связи, они взаимодействуют с tcp-сокетами, и клиент может общаться с другим клиентом через сервер. Это означает, что сервер пересылает сообщения от клиента A к клиенту B.
Теперь я сижу здесь и пытаюсь понять, как разработать серверное приложение.
Таким образом, сервер постоянно прослушивает входящие соединения. Все в порядке. Для каждого нового клиента, который подключается к серверу (dial-up), сервер создает новый сокет, и я бы использовал потоки, чтобы они одновременно работали.
Каждый пользователь использует клиента, и каждый клиент должен проходить аутентификацию с использованием имени пользователя и пароля.
Я ищу шаблон проектирования для реализации на Сервере, который хранит / обрабатывает соединение Socket с клиентом.
Моей первой идеей было создание большого объекта Singleton под названием ClientManager, который содержит карту. Таким образом, сервер может вызвать что-то вроде ClientManger.getSocketBy (имя пользователя), чтобы получить сокет нужного пользователя (клиента).
Это может решить проблему "пересылки" сообщений от Клиента А к Клиенту Б.
Для примера:
Пользователь A (Клиент A) хотел бы отправить сообщение Пользователю B (Клиент B). Таким образом, сервер получает сообщение от пользователя A (клиент A) и вызывает ClientManager.getSocketBy (пользователь B), чтобы получить коммуникационный сокет для пользователя B, а затем отправляет сообщение через этот сокет.
Но этот «дизайн» на стороне сервера кажется мне простым, поскольку он может быть хорошим дизайном для такой вещи, и я упускаю что-то вроде Events, Observer и т. Д.
Другой возможностью может быть создание события в потоке, которое обрабатывает подключение к сокету пользователя B, вместо непосредственного вызова метода Socket.send ().
Но должен быть лучший способ ...
Есть ли общий способ реализовать что-то вроде этого шаблона проектирования, который вы можете порекомендовать? Мне интересно, как сервер обмена мгновенными сообщениями может реализовать это?
Кстати: я не использую мгновенный мессенджер, и масштабируемость - это не самое главное, поскольку не существует 1000 клиентов, одновременно взаимодействующих с сервером. Чистый дизайн программного обеспечения для меня важнее.
Я реализую собственный протокол (на основе xml) для связи. Есть ли способ / шаблон проектирования, как обернуть протокол в объект, или я ничего не могу сделать (с точки зрения разработчиков программного обеспечения), исключая синтаксический анализ строки / xml?