Module java.rmi
Package java.rmi.server

Class RMISocketFactory

java.lang.Object
java.rmi.server.RMISocketFactory
所有已实现的接口:
RMIClientSocketFactory, RMIServerSocketFactory

public abstract class RMISocketFactory extends Object implements RMIClientSocketFactory, RMIServerSocketFactory
RMISocketFactory实例被RMI运行时用于获取RMI调用的客户端和服务器套接字。应用程序可以使用setSocketFactory方法请求RMI运行时使用其套接字工厂实例而不是默认实现。

默认的套接字工厂实现创建直接套接字连接到远程主机。

默认的套接字工厂实现创建绑定到通配符地址的服务器套接字,接受来自所有网络接口的请求。

实现注意事项:

您可以使用RMISocketFactory类创建绑定到特定地址的服务器套接字,限制请求的来源。例如,以下代码实现了一个将服务器套接字绑定到IPv4回环地址的套接字工厂。这将限制RMI仅处理来自本地主机的请求。


     class LoopbackSocketFactory extends RMISocketFactory {
         public ServerSocket createServerSocket(int port) throws IOException {
             return new ServerSocket(port, 5, InetAddress.getByName("127.0.0.1"));
         }

         public Socket createSocket(String host, int port) throws IOException {
             // just call the default client socket factory
             return RMISocketFactory.getDefaultSocketFactory()
                                    .createSocket(host, port);
         }
     }

     // ...

     RMISocketFactory.setSocketFactory(new LoopbackSocketFactory());
 
java.rmi.server.hostname系统属性设置为127.0.0.1,以确保生成的存根连接到正确的网络接口。
自1.1版本起:
1.1
  • Constructor Details

    • RMISocketFactory

      public RMISocketFactory()
      构造一个RMISocketFactory
      自1.1版本起:
      1.1
  • Method Details

    • createSocket

      public abstract Socket createSocket(String host, int port) throws IOException
      创建连接到指定主机和端口的客户端套接字。
      指定者:
      createSocket 在接口 RMIClientSocketFactory
      参数:
      host - 主机名
      port - 端口号
      返回:
      连接到指定主机和端口的套接字。
      抛出:
      IOException - 如果在套接字创建过程中发生I/O错误
      自1.1版本起:
      1.1
    • createServerSocket

      public abstract ServerSocket createServerSocket(int port) throws IOException
      在指定端口上创建服务器套接字(端口0表示匿名端口)。
      指定者:
      createServerSocket 在接口 RMIServerSocketFactory
      参数:
      port - 端口号
      返回:
      指定端口上的服务器套接字
      抛出:
      IOException - 如果在服务器套接字创建过程中发生I/O错误
      自1.1版本起:
      1.1
    • setSocketFactory

      public static void setSocketFactory(RMISocketFactory fac) throws IOException
      设置全局套接字工厂,RMI从中获取套接字(如果远程对象未关联特定的客户端和/或服务器套接字工厂)。RMI套接字工厂只能设置一次。注意: 如果当前安全管理器允许设置套接字工厂,则可以设置RMISocketFactory;如果不允许,则会抛出SecurityException。
      参数:
      fac - 套接字工厂
      抛出:
      IOException - 如果RMI套接字工厂已经设置
      SecurityException - 如果存在安全管理器且其checkSetFactory方法不允许该操作。
      自1.1版本起:
      1.1
      参见:
    • getSocketFactory

      public static RMISocketFactory getSocketFactory()
      返回由setSocketFactory方法设置的套接字工厂。如果未设置套接字工厂,则返回null
      返回:
      套接字工厂
      自1.1版本起:
      1.1
      参见:
    • getDefaultSocketFactory

      public static RMISocketFactory getDefaultSocketFactory()
      返回此RMI实现使用的默认套接字工厂的引用。当getSocketFactory返回null时,RMI运行时将使用此工厂。
      返回:
      默认的RMI套接字工厂
      自1.1版本起:
      1.1
    • setFailureHandler

      public static void setFailureHandler(RMIFailureHandler fh)
      设置RMI运行时在服务器套接字创建失败时调用的失败处理程序。默认情况下,如果未安装失败处理程序并且服务器套接字创建失败,则RMI运行时会尝试重新创建服务器套接字。

      如果存在安全管理器,此方法首先调用安全管理器的checkSetFactory方法以确保允许该操作。这可能导致SecurityException

      参数:
      fh - 失败处理程序
      抛出:
      SecurityException - 如果存在安全管理器且其checkSetFactory方法不允许该操作。
      自1.1版本起:
      1.1
      参见:
    • getFailureHandler

      public static RMIFailureHandler getFailureHandler()
      返回由setFailureHandler方法设置的套接字创建失败处理程序。
      返回:
      失败处理程序
      自1.1版本起:
      1.1
      参见: