Клиентская фабрика сокетов в RMI exportObject? - PullRequest
0 голосов
/ 07 июня 2011

Если вы хотите использовать пользовательские сокеты для RMI (например, с использованием SSL), в UnicastRemoteObject.exportObject (4) вам необходимо указать фабрику сокетов клиента, а также фабрику сокетов сервера. Но экспорт объектов осуществляется на стороне сервера. Зачем нужна фабрика клиентских сокетов?

Если только ... он сериализован и используется клиентом, желающим установить соединение с этим объектом? Я считаю это маловероятным (хотя это может быть ответом); (SSL) Фабрики сокетов для меня не похожи на классические примеры сериализуемых объектов, хранилища ключей локальные и тому подобное.

Ответы [ 2 ]

1 голос
/ 08 июня 2011

Да, как вы уже сказали в вопросе:

RMIClientSocketFactory должен быть сериализуемым, а будет сериализован на клиентской стороне , если используется с exportObject или конструктором UnicastRemoteObject.

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

(я недавно опубликовал пример для RMISocketFactory , где мне нужно было позаботиться о том, чтобы сериализоваться.)


Редактировать (после комментария от EJP):

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

И да, нет смысла сериализовать хранилище доверенных сертификатов сервера для клиента - если клиент должен доверять реестру или другим удаленным объектам, для которых сертификаты должны приниматься, у нас есть точка для человека-посредника. средняя атака. Таким образом, SslRMIClientSocketFactory , будучи сериализуемым, не сериализует контекст SSL сервера, а просто использует настройки SSL клиентской виртуальной машины.

0 голосов
/ 08 июня 2011

В UnicastRemoteObject.exportObject (...) вам нужно указать клиентский сокет фабрика, а также сокет сервера фабрика (если вы используете обычай розетки вообще, конечно).

Только если вы используете эту перегрузку exportObject (), и даже тогда вы можете указать ноль. Существует еще одна перегрузка, когда вам нужно только указать номер порта.

Почему это?

Это не так.

Экспорт объектов выполняется на стороне сервера.

Correct.

Зачем нужна фабрика клиентских сокетов?

Это не так.

...