Серверно-клиентская модель Java

#java #model #client-server

#java #Модель #клиент-сервер

Вопрос:

Этот вопрос больше связан с общим дизайном программы. У меня возникла проблема, при которой центр взаимодействует с набором клиентов по отдельности (клиенты напрямую не взаимодействуют друг с другом).

Содержимое обмена данными между центром и клиентом полностью числовое, т. е. туда и обратно пересылается набор чисел. Клиенты запускаются на отдельных компьютерах, а центр может быть размещен на другой машине (или иным образом). Стиль взаимодействия является итеративным и синхронным в том смысле, что центр отправляет сообщение с запросом / вопросом каждому отдельному клиенту, а пользователь клиента предоставляет ответ центру в течение определенного периода времени на каждой итерации, и это взаимодействие повторяется несколько раз до конца.

Центр выполняет некоторые вычисления, учитывая ответы, полученные от клиентов, а клиенты просто предоставляют входные данные для этого вычисления.

Интересно, какой элегантный дизайн для решения этой проблемы с использованием Java? Мы высоко ценим любые комментарии или предложения. Большое спасибо.

Комментарии:

1. Какие факторы мешают вам упростить ее — некоторую базовую связь по протоколу TCP / IP? Вы хотите повторно использовать существующие библиотеки? Пытаетесь установить связь с очень большим количеством клиентов? Вы заинтересованы в раскрытии аспекта адреса сервера? Отказоустойчивость? Что наиболее важно — эффективное использование ресурсов / задержка / пропускная способность?

2. Необходимо ли, чтобы центр начал обмен данными? Сервер обычно имеет службу, которая вызывается клиентами. То, как вы описываете свою архитектуру, превращает ваших клиентов в серверы (они должны прослушивать запросы), а ваш центр — в клиента.

3. @Dilum Ranatunga: на самом деле я хотел бы, чтобы это было как можно проще, учитывая контекст приложения. Количество клиентов совсем небольшое — одновременно к серверу будет подключено до 10 клиентов. Не могли бы вы, пожалуйста, подробнее рассказать о реализации TCP / IP?

4. @Puce: возможно, мне следует уточнить, что центр не вызывает никакой службы, запрограммированной на клиенте. Это больше похоже на то, что центр задает вопрос (полученный с помощью алгоритма), который отправляется клиенту, а клиент отвечает на ответ, предоставленный пользователем, который использует клиент для взаимодействия с центром.

5. То, что вы описываете, все еще является одним видом сервиса: клиент (здесь центр) задает вопрос, который отправляется на сервер (здесь клиент). Сервер (здесь клиент) прослушивает входящие вопросы и предоставляет ответ. Часть «прослушивания» превращает клиента в сервер.

Ответ №1:

Я бы использовал KryoNet, который может эффективно сериализовать ваши наборы данных через вызовы RMI (удаленные вызовы методов). Использую ее сам, и она хорошо работает. Поддерживает UDP и TCP без каких-либо проблем. Начните с примера на сайте и работайте оттуда. Вы можете легко заставить обе стороны соединения работать с RMI.

Комментарии:

1. Привет, Крис, я взглянул на KryoNet. Это выглядит многообещающе, однако упрощенные примеры на его главной странице довольно просты в иллюстрировании его функциональных возможностей. В частности, мне интересно, как сервер на базе KryoNet может обрабатывать (а также идентифицировать) несколько подключенных клиентов. Идентификация здесь является ключевой, поскольку сервер может вести себя по-разному для разных клиентов. Спасибо.

2. Идентификация будет инициирована сервером, содержащим объект login с OID 0, к которому будут подключаться клиенты. Клиенты будут вызывать метод login на сервере с требуемой ролью. В случае успеха, в этой функции входа сервер создаст объект, который позволяет клиенту взаимодействовать с сервером, сохранит это и вернет объект, содержащий информацию об интерактивном объекте (идентификатор объекта сервера, идентификатор объекта клиента). Объекты клиента и сервера будут настраиваться в зависимости от типа клиента.

3. Таким образом, сервер эффективно идентифицирует клиента, используя объект (созданный сервером), с которым клиент взаимодействует? Могу ли я предположить, что такие объекты ведут себя по-разному в зависимости от взаимодействующих клиентов? Но какова цель второго объекта, «содержащего информацию об интерактивном объекте (идентификатор объекта сервера, идентификатор объекта клиента)»? Не могли бы вы привести краткий пример, пожалуйста? Спасибо.

4. Сервер имеет счетчик oid, который он увеличивает, который он сохраняет и использует в качестве своего собственного идентификатора. Счетчик снова увеличивается для генерации oid клиента. Отправляются оба oid, и клиент принимает данный oid в качестве своего объекта, сохраняя при этом oid объекта сервера. Оба идентификатора должны быть соответствующим образом зарегистрированы на обоих концах при отправке с сервера и получении клиентом. В зависимости от информации об удаленном подключении, тип удаленного объекта может быть определен как на клиенте, так и на сервере. Вы должны использовать функцию ‘getRemoteClass(Connection c)’ или аналогичную в классе, которая может быть переопределена.

Ответ №2:

Похоже, что MPI подходит именно вам. Вот версия Java.

Удачи и с уважением.

Ответ №3:

Вероятно, самым простым решением в чистой Java является использование RMI. Просто предоставьте объект через RMI и попросите клиентов вызывать методы для него удаленно.

Если вам нужно асинхронное поведение, вы можете использовать реализацию JMS или свернуть свою собственную, используя сокеты и TCP / IP, как упоминалось выше.

Если вам не нравится что-либо из этого, возможно, вам подойдет упомянутый выше MPI. Или, возможно, для вас может подойти Apache Hadoop.