public abstract class RMISocketFactory extends Object implements RMIClientSocketFactory, RMIServerSocketFactory
RMISocketFactory
实例,以获取RMI调用的客户端和服务器套接字。
应用程序可以使用setSocketFactory
方法来请求RMI运行时使用其套接字工厂实例而不是默认实现。
默认套接字工厂实现执行三层方法来创建客户端套接字。 首先,尝试与远程VM的直接套接字连接。 如果失败(由于防火墙),运行时将使用具有服务器的显式端口号的HTTP。 如果防火墙不允许这种类型的通信,则使用服务器上的cgi-bin脚本的HTTP来POST RMI调用。 默认情况下禁用HTTP隧道机制。 此行为由java.rmi.server.disableHttp
属性控制,其默认值为true
。 将此属性的值设置为false
将启用HTTP隧道机制。
已弃用:HTTP隧道。 上面描述的HTTP隧道机制,特别是具有显式端口的HTTP和到cgi-bin脚本的HTTP已被弃用。 这些HTTP隧道机制在将来的平台版本中被删除。
默认套接字工厂实现创建绑定到通配符地址的服务器套接字,该通配符地址接受来自所有网络接口的请求。
您可以使用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
以确保生成的存根连接到正确的网络接口。
Constructor and Description |
---|
RMISocketFactory()
构造一个
RMISocketFactory 。
|
Modifier and Type | Method and Description |
---|---|
abstract ServerSocket |
createServerSocket(int port)
在指定端口上创建服务器套接字(端口0表示匿名端口)。
|
abstract Socket |
createSocket(String host, int port)
创建连接到指定主机和端口的客户端套接字。
|
static RMISocketFactory |
getDefaultSocketFactory()
返回对此RMI实现使用的默认套接字工厂的引用。
|
static RMIFailureHandler |
getFailureHandler()
返回由
setFailureHandler 方法设置的套接字创建失败的处理程序。
|
static RMISocketFactory |
getSocketFactory()
返回由
setSocketFactory 方法设置的套接字工厂。
|
static void |
setFailureHandler(RMIFailureHandler fh)
如果服务器套接字创建失败,则设置由RMI运行时调用的故障处理程序。
|
static void |
setSocketFactory(RMISocketFactory fac)
设置RMI获取套接字的全局套接字工厂(如果远程对象与特定客户端和/或服务器套接字工厂没有关联)。
|
public abstract Socket createSocket(String host, int port) throws IOException
createSocket
在界面
RMIClientSocketFactory
host
- 主机名
port
- 端口号
IOException
- 如果套接字创建期间发生I / O错误
public abstract ServerSocket createServerSocket(int port) throws IOException
createServerSocket
在界面
RMIServerSocketFactory
port
- 端口号
IOException
- 如果在创建服务器套接字期间发生I / O错误
public static void setSocketFactory(RMISocketFactory fac) throws IOException
fac
- 插座工厂
IOException
- 如果已经设置了RMI套接字工厂
SecurityException
- 如果安全管理器存在,并且其
checkSetFactory
方法不允许操作。
getSocketFactory()
,
SecurityManager.checkSetFactory()
public static RMISocketFactory getSocketFactory()
setSocketFactory
方法设置的套接字工厂。
如果没有设置套接字工厂,返回null
。
setSocketFactory(RMISocketFactory)
public static RMISocketFactory getDefaultSocketFactory()
getSocketFactory
运行时使用的工厂, getSocketFactory
返回null
。
public static void setFailureHandler(RMIFailureHandler fh)
如果有安全管理员,则该方法首先调用安全管理器的checkSetFactory
方法,以确保允许操作。 这可能会导致一个SecurityException
。
fh
- 故障处理程序
SecurityException
- 如果存在安全管理员,并且其
checkSetFactory
方法不允许操作。
getFailureHandler()
,
RMIFailureHandler.failure(Exception)
public static RMIFailureHandler getFailureHandler()
setFailureHandler
方法设置的套接字创建失败的处理程序。
setFailureHandler(RMIFailureHandler)