Шаблон проектирования: клиент - сервер - PullRequest
1 голос
/ 02 декабря 2011

Я собираюсь реализовать клиент-серверное приложение в 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?

Ответы [ 2 ]

2 голосов
/ 02 декабря 2011

У меня есть два вопроса, я думаю.

Первый касается того, какой «шаблон проектирования» использовать для маршрутизации. Вы указали, что делаете, но не указали, с какой проблемой вы столкнулись (или ожидаете), кроме того, что сказали, что это слишком просто. Шаблоны - это распространенные способы решения общих проблем, но слишком простая программа - это не та модель, для которой я видел шаблон:)

Второй вопрос - об отделении реализации вашего протокола от клиентов, которые его используют. Теперь , что - это хороший вопрос, и вы обязательно должны это сделать. Вы захотите создать объект Message, который предоставляет поля (например, To, From, Content и т. Д.). Ваш сервер должен передавать необработанные данные XML в синтаксический анализатор некоторого типа, который действует как Фабрика для объектов сообщений.

Message msg = protocol.CreateMsg(byte[] xmlBuffer)

Вы можете поддерживать дополнительные протоколы, назначив разные протоколы каждому порту TCP / IP или начав с протокола по умолчанию, а затем заставив клиента и сервер согласовать другой протокол.

EDIT1:

Я бы не стал сопоставлять сокет с пользователем, если честно. Я бы абстрагировал способ, которым вы общаетесь с Пользователем, в объект, возможно, Соединение или Канал. Затем вы подклассифицируете Connection с помощью TcpConnection или CorbaConnection или чего-либо еще. В идеале вы делаете что-то вроде:

string destUserId = msg.To;
User destUser = UserManager.Find(destUserId);
Connection conn = destUser.Connection;
if (conn != null)
   conn.Send(msg);

Обратите внимание, что нет упоминания о соединении или деталях реализации протокола.

1 голос
/ 02 декабря 2011

вы пробовали использовать шаблон Service Locator.Но Java уже реализует то, что вы делаете в своем ядре, зачем «изобретать велосипед».Вы можете использовать CORBA или одну из платформ на основе TCP / UDP, например ICE , если вы не предпочитаете RMI, и которая действительно поможет вам построить это ваше распределенное приложение.

...