RMI除了注册端口外,其通信端口是服务器随机产生的,因此不容易穿过防火墙。解决方法,自定义一个RMISocketFactory,指定固定的通信端口,然后使用setSocketFactory(RMISocketFactory fac)设置。
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 = 2098;//不指定就随机
return new ServerSocket(port);
}
}
try {
RMISocketFactory.setSocketFactory(new SMRMISocket());
LocateRegistry.createRegistry(7112);// 注册端口-----(1)
System.out.println("客户系统开启rmi 成功!");
} catch (RemoteException e) {
System.out.println(e.getMessage());
}
这样防火墙就需要开启通信端口2098和注册端口7112
另外需要注意的是,在公网上使用RMI时,RMI绑定的ip地址必须是外网地址,不能是内网ip,否则RMI客户端也是无法连接上去的,因为RMI Server在验证连接时会判断客户端请求地址是否跟自己的绑定地址相同。
RMI穿透防火墙的问题
猜你喜欢
转载自alanhuang.iteye.com/blog/1605154
今日推荐
周排行