Как определить различные клиенты CORBA на сервере CORBA - PullRequest
0 голосов
/ 30 января 2012


Я создал CORBA Server и двух клиентов - Client1 и Client2, сервер реализован с использованием Java , которые подключаются к этому Server.Когда клиент (ы) подключаются к серверу, сервер должен поддерживать состояние соединения, например connected = true или false

Например, на сервере есть два метода:

  1. connect()
  2. disconnect()

Когда клиент вызывает метод connect(), это подключенное состояние должно быть сохранено в Server для этого Client1.Если тот же (подключенный) клиент снова вызывает метод connect(), то Server должен вернуть ошибку.
Аналогично, если Client2 вызывает disconnect() перед подключением, Server должен обнаружить, что Client2 еще не подключился и возвращает ошибку

Мой вопрос заключается в том, как однозначно идентифицировать клиента CORBA?

Любые идеи / предложения приветствуются.Спасибо ..

Ответы [ 2 ]

2 голосов
/ 31 января 2012

CORBA точно не определяет понятие «клиент», потому что оно имеет несколько значений для разных людей:

  • Компьютер клиента (идентифицируемый по IP-адресу)
  • Сетевая карта, которую клиент использовал для подключения к серверу (определяется по MAC-адресу)
  • Процесс клиента (определяется по идентификатору процесса)
  • Сокет клиента для подключения ксервер (идентифицируется дескриптором файла)
  • ORB внутри этого процесса (идентифицируется идентификатором ORB, который может быть передан ORB::init())
  • Поток внутри процесса, выполняющий вызов (идентифицированпо идентификатору потока)

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

Лучший способ справиться с этой проблемой - внедрить управление временем жизни клиента в ваше приложение и, в частности, в вашу IDL.Попросите клиента запрашивать файл cookie во время «подключения» и передавать этот файл cookie в каждом последующем запросе:

interface Foo {
   void connect(out string cookie) throws AlreadyConnected;
   void doWork(in float data, in string cookie) throws NotConnected;
   void disconnect(in string cookie) throws NotConnected;
};

Мой синтаксис IDL может быть не идеальным, но вы поймете идею.Вам также следует изучить способы прозрачной отправки cookie без необходимости воздействия на вашу IDL с использованием PortableInterceptors и / или Контекстов обслуживания .

Независимо от того, как вы передаете куки или токен сеанса, вашему серверу придется тщательно управлять ими и, при необходимости, удалять старые.Управление сессионными cookie-файлами может быть реальным бременем для службы и препятствовать его способности хорошо масштабироваться.

0 голосов
/ 30 января 2012

Не нужно слишком много думать, я думаю, что этого можно достичь с помощью шаблона Application Controller (Шаблон проектирования)

Поддержите класс, который каким-то образом проверяет, кто вошел в систему (Проверяя его внутриБаза данных или другое место, которое вы хотите)

Надеюсь, что это полезно.

...