Spec-Zone .ru
спецификации, руководства, описания, API
|
СОДЕРЖАНИЕ | ПРЕДЫДУЩИЙ | NEXT | Java Удаленный Вызов метода |
java.net.Socket
и java.net.ServerSocket
для его соединений, вместо того, чтобы инстанцировать объектов тех классов непосредственно, это вызывает createSocket
и createServerSocket
методы на токе RMISocketFactory
объект, возвращенный статическим методом RMISocketFactory.getSocketFactory
. Это позволяет приложению иметь рычаг, чтобы настроить тип сокетов, используемых транспортом RMI, таких как альтернативные подклассы java.net.Socket
и java.net.ServerSocket
классы. Экземпляр RMISocketFactory
использоваться может быть установлено однажды кодом достоверной системы. В JDK1.1 эта настройка была ограничена относительно глобальными решениями о типе сокета, потому что единственные параметры, предоставленные методам фабрики, были host
и port
(для createSocket
) и только port
(для createServerSocket
). В Java платформа SE, новые интерфейсы RMIServerSocketFactory
и RMIClientSocketFactory
были представлены, чтобы обеспечить более гибкую настройку того, что протоколы используются, чтобы передать с удаленными объектами.
Позволить приложениям, используя RMI использовать в своих интересах эти новые интерфейсы фабрики сокета, несколько новых конструкторов и exportObject
методы, которые берут фабрику сокета клиента и сервера в качестве дополнительных параметров, были добавлены к обоим UnicastRemoteObject
и java.rmi.activation.Activatable.
Удаленные объекты, экспортируемые или с новых конструкторов или с exportObject
методы (с RMIClientSocketFactory
и RMIServerSocketFactory
параметры), будет обработан по-другому ко времени выполнения RMI. Для времени жизни такого удаленного объекта время выполнения будет использовать пользовательское RMIServerSocketFactory
создать a ServerSocket
принять входящие вызовы к удаленному объекту и использовать пользовательское RMIClientSocketFactory
создать a Socket
соединить клиенты с удаленным объектом.
Реализация RemoteRef
и ServerRef
используемый в тупиках и скелетах для удаленных объектов, экспортируемых с пользовательскими фабриками сокета, UnicastRef2
и UnicastServerRef2
, соответственно. Проводное представление UnicastRef2
тип содержит различное представление "конечной точки", чтобы связаться чем UnicastRef
тип имеет (который использовал только строку имени хоста в формате UTF, после целочисленным номером порта). Для UnicastRef2
, проводное представление конечной точки состоит из байта формата, определяющего содержание остальной части представления конечной точки (чтобы учесть будущее расширение представления конечной точки) сопровождаемый данными в обозначенном формате. В настоящий момент данные могут состоять из имени хоста в формате UTF, номере порта, и дополнительно (как определено байтом формата конечной точки) сериализированное представление RMIClientSocketFactory
объект, который используется клиентами, чтобы генерировать сокетные соединения с удаленным объектом в этой конечной точке. Представление конечной точки не содержит RMIServerSocketFactory
объект, который был определен, когда удаленный объект экспортировался.
Когда вызовы выполняются через ссылки UnicastRef2
введите, время выполнения использует createSocket
метод RMIClientSocketFactory
объект в конечной точке, создавая сокеты для соединений с удаленным объектом референта. Кроме того, когда время выполнения делает "грязные" и "чистые" призывы DGC к определенному удаленному объекту, оно должно вызвать DGC на удаленной JVM, используя соединение, сгенерированное от того же самого RMIClientSocketFactory
возразите как определено в удаленной ссылке, и реализация DGC на серверной стороне должна проверить, что это было сделано правильно.
Удаленные объекты, экспортируемые с конструктором старшего возраста или методом на UnicastRemoteObject
это не берет пользовательские фабрики сокета, как параметры будут иметь RemoteRef
и ServerRef
из типа UnicastRef
и UnicastServerRef
как прежде и использование старое проводное представление для их конечных точек, то есть узел представляет в виде строки в формате UTF, сопровождаемом целым числом, определяющим номер порта. Это - то, так, чтобы серверы RMI, которые не используют новые 1.2 функции, взаимодействовали с клиентами RMI старшего возраста.
RMISocketFactory
Классjava.rmi.server.RMISocketFactory
абстрактный класс обеспечивает интерфейс для того, чтобы он определил, как транспорт должен получить сокеты. Отметьте что класс ниже использования Socket
и ServerSocket
от java.net
пакет. package java.rmi.server; public abstract class RMISocketFactory implements RMIClientSocketFactory, RMIServerSocketFactory { public abstract Socket createSocket(String host, int port) throws IOException; public abstract ServerSocket createServerSocket(int port) throws IOException; public static void setSocketFactory(RMISocketFactory fac) throws IOException {...} public static RMISocketFactory getSocketFactory() {...} public static void setFailureHandler(RMIFailureHandler fh) {...} public static RMIFailureHandler getFailureHandler() {...} }Статический метод
setSocketFactory
используется, чтобы установить фабрику сокета, из которой RMI получает сокеты. Приложение может вызвать этот метод со своим собственным RMISocketFactory
экземпляр только однажды. Определенная с помощью приложения реализация RMISocketFactory
мог, например, сделать предварительную фильтрацию на требуемом соединении и выдать исключения, или возвратить его собственное расширение java.net.Socket
или java.net.ServerSocket
классы, такие как, которые обеспечивают безопасный канал связи. Отметьте что RMISocketFactory
май только быть установленным, если текущий менеджер безопасности позволяет устанавливать фабрику сокета; если установка фабрики сокета отвергается, a SecurityException
будет брошен. Статический метод getSocketFactory
возвращает фабрику сокета, используемую RMI. Возвраты метода null
если фабрика сокета не устанавливается.
Транспортный уровень вызывает createSocket
и createServerSocket
методы на RMISocketFactory
возвращенный getSocketFactory
метод, когда транспорт должен создать сокеты. Например:
RMISocketFactory.getSocketFactory().createSocket(myhost, myport)Метод
createSocket
должен создать клиентский сокет, соединенный с указанным узлом и портом. Метод createServerSocket
должен создать сокет сервера на указанном порту. Реализация транспорта по умолчанию RMISocketFactory
предусматривает прозрачный RMI через брандмауэры, используя HTTP следующим образом:
createSocket
, фабрика автоматически делает попытку HTTP-соединений с узлами, с которыми нельзя связаться с прямым сокетом.createServerSocket
, фабрика возвращает сокет сервера, который автоматически обнаруживает, если недавно принятое соединение является запросом POST HTTP. Если так, это возвращает сокет, который прозрачно представит только тело запроса к транспорту и отформатирует его вывод как ответ HTTP.setFailureHandler
устанавливает обработчик отказа, который вызовет время выполнения RMI, если создание сервера снабжает сбои сокетом. Обработчик отказа возвращает булевскую переменную, чтобы указать, должна ли повторная попытка произойти. Возвраты обработчика отказа по умолчанию false
, подразумевать, которое воссозданием по умолчанию сокетов не предпринимается временем выполнения. Метод getFailureHandler
возвращает текущий обработчик для отказа создания сокета, или null
если обработчик отказа не устанавливается.
RMIServerSocketFactory
ИнтерфейсRMIServerSocketFactory
Документация API. RMIClientSocketFactory
ИнтерфейсRMIClientSocketFactory
Документация API.