RMI穿透防火墙的问题

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在验证连接时会判断客户端请求地址是否跟自己的绑定地址相同。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值