【利用tuscany的话本地无法连接服务器的service _tuscany 】 | IT修真院·坑乎
问题已收录 利用tuscany的话本地无法连接服务器的service
我也踩过这个坑( 1 )
已统计您的踩坑,无需重复点击
回答(1)
tuscany
详细描述
编辑于2024-05-03
  • [郑州|结业弟子]JAVA-何爽
    0


    应该是RMI端口的问题:

    RMI之所以使用的范围受限制主要有两方面原因,其一:必须要是java,平台的异构性受到限制其二:穿越防火墙不方便。这里主要谈谈RMI如何通过固定分配端口来穿越防火墙。 

    RMI穿越防火墙不方便主要是因为除了RMI服务注册的端口(默认1099)外,与RMI的通讯还需要另外的端口来传送数据而另外的端口是随机分配的,所以要想RMI的客户能通过防火墙来与RMI服务通讯,

    第一种方法:

    需要能让随机分配的端口固定下来,具体做法如下:


    如果是spring+rmi,可以通过spring bean方式来指定两个端口,但是tuscany不行,需要自己写类来完成。 

    通过比对spring 的指定端口的源码发现

    <bean id = "rmiService" class = "org.springframework.remoting.rmi.RmiRegistryFactoryBean" >

    在这个类里

    通过这个接口配置服务器相关配置

    在RMIServerSocketFactory里 发现设置端口的接口,

    继承它的实现,并重写

    public class SMRMISocket extends RMISocketFactory {

    private  static Logger logger = LoggerFactory.getLogger(SMRMISocket.class);
       
       @Override
       public  Socket createSocket(String host, int port) throws IOException {
            return new Socket(host,port);
       }

    @Override
       public ServerSocket createServerSocket(int port) throws IOException {
       if (port == 0) {
          port = 8089//不指定就随机分配了
        logger.info("port服务端端口号:+ port);
        }
        logger.info("服务端端口号:+ port);
         return new ServerSocket(port);
       }
    }

    在main里调用:

    RMISocketFactory.setSocketFactory(new SMRMISocket());

    这样的话RMI分配的端口就被固定了,防火墙只需要打开1099和8089端口即可。

    第二种方法:

    在阿里云中开放所有的端口,这样不管rmi传送数据的是哪个端口都可以通过,要开放全端口应填:1/65535

    编辑于2018-10-12