Spec-Zone .ru
спецификации, руководства, описания, API
СОДЕРЖАНИЕ | ПРЕДЫДУЩИЙ | NEXT Java Удаленный Вызов метода


5.8 Фабрики Сокета RMI

Когда реализация времени выполнения RMI нуждается в экземплярах 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 старшего возраста.


5.8.1 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 следующим образом:

Метод setFailureHandler устанавливает обработчик отказа, который вызовет время выполнения RMI, если создание сервера снабжает сбои сокетом. Обработчик отказа возвращает булевскую переменную, чтобы указать, должна ли повторная попытка произойти. Возвраты обработчика отказа по умолчанию false, подразумевать, которое воссозданием по умолчанию сокетов не предпринимается временем выполнения.

Метод getFailureHandler возвращает текущий обработчик для отказа создания сокета, или null если обработчик отказа не устанавливается.


5.8.2 RMIServerSocketFactory Интерфейс

См. RMIServerSocketFactory Документация API.


5.8.3 RMIClientSocketFactory Интерфейс

См. RMIClientSocketFactory Документация API.



СОДЕРЖАНИЕ | ПРЕДЫДУЩИЙ | NEXT
Copyright 1997, 2010, Oracle и/или его филиалы. Все права защищены.