RMI之所以使用的范围受限制主要有两方面原因,其一:必须要是java,平台的异构性受到限制;其二:穿越防火墙不方便。这里主要谈谈RMI如何通过固定分配端口来穿越防火墙。
import java.rmi.server.*;
import java.io.*;
import java.net.*;
public class SMRMISocket extends RMISocketFactory {
public Socket createSocket(String host, int port) throws IOException{
return new Socket(host,port);
}
public ServerSocket createServerSocket(int port) throws IOException {
if (port == 0)
port = 10990; //不指定就随机分配了
return new ServerSocket(port);
}
}
2、在实例化UnicastRemoteObject的子类前加入一下代码:
try {
RMISocketFactory.setSocketFactory(new SMRMISocket());
} catch (Exception ex) {
}
这样的话RMI分配的端口就被固定了,防火墙只需要打开1099和10990端口即可。