удаленный и динамический прокси

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

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

может быть, я неправильно понял концепцию динамического прокси.

  1. кроме того, я читал об этой теме, касающейся Java и Rmi, как мне реализовать удаленный прокси-сервер на C++, я, вероятно, могу использовать DCOM, есть ли другой, может быть, более простой способ? (и нужен ли мне заглушка/скелет в DCom или больше не нравится java?)

Благодарность


person Idan    schedule 03.12.2009    source источник


Ответы (2)


скажем, у вас есть interface A и class B implements A.

серверная виртуальная машина имеет один экземпляр B; это связано с именем; сервер прослушивает порт TCP для связи с клиентом. что-то вроде этого:

Server server = new Server(localhost, port);
server.bind("bbbb", new B() );

на клиентской виртуальной машине вы хотите получить доступ к этому объекту B, находящемуся на серверной виртуальной машине. Вам необходимо получить ссылку (типа A) на него

A bb = lookup(serverIp, port, "bbbb");

bb является подклассом A, созданным с помощью java.lang.reflect.Proxy. любой вызов метода на bb обрабатывается InvocationHandler, который кодирует вызов любым способом и отправляет его на сервер по сети. сервер получает запрос на «вызов этого метода с этим именем [с этими аргументами] для объекта с именем bbbb», и у сервера нет проблем с выполнением этой задачи с отражением. затем возвращаемое значение отправляется обратно клиенту аналогичным образом.

Так что сделать это самостоятельно совсем не сложно. RMI от Sun, вероятно, делает то же самое (RMI имеет некоторые другие функции, такие как удаленная сборка мусора). см. http://java.sun.com/j2se/1.5.0/docs/guide/rmi/relnotes.html

person irreputable    schedule 04.12.2009
comment
я до сих пор не понимаю ... так вы говорите, что InvocationHandler заменяет использование заглушки/скелета? и какая разница с отражением здесь и без отражения, как это было раньше? - person Idan; 04.12.2009

Если я не ошибаюсь, заглушка/скелет была создана статически с помощью инструмента rmic, а теперь весь процесс является динамическим.

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

Что касается вопроса № 1: в некоторых реализациях RMI используется Corba, поэтому, если код доступен, вы можете взглянуть на него.

Все, что вам нужно, это связать ваш код C++ со слоем Corba, как это сделал заглушка/скелет.

person Jeach    schedule 11.12.2009