Spring RMI远程调用时的内外网端口映射问题

参考:http://blog.csdn.net/ktyl2000/article/details/4485896
实现:调用公网ip注册的远程对象   

外网IP:x.x.x.102 port:9000/9010   内网IP: 192.168.2.20 port:9000/9010(即将内网中的地址映射为公网ip)


所要注意的问题:

 rmi使用两类端口,一种是服务注册与查找服务端口,另一种是数据传输端口。此处9000为服务注册和查找服务端口,9010为数据传输端口


spring rmi 配置:

spring rmi server端配置如下:


	    
	    
	    
	    
	     
	    	${registry.port}
	    
	    
	    
	    
	

	
	

其中com.cetcnav.pushNotification.util.MyRMISocket定义数据传输端口,代码如下:

public class MyRMISocket extends RMISocketFactory implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	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 = Integer.parseInt(PropertyUtil.getProperty("transport.port"));

	System.out.println("RMI服务器的注册与数据传输端口 ="+port);
	    return new ServerSocket(port);
	  }
	}

服务端主要调用代码如下:

//注册主机名,需要注册为公网地址
		String hostname = PropertyUtil.getProperty("registry.hostname");
		System.setProperty("java.rmi.server.hostname", hostname);
		
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		final NotificationPushServiceImpl notificationPushService = (NotificationPushServiceImpl) context.getBean("notificationPushService");

spring rmi client端的类结构和配置

因为spring rmi server端使用到了com.cetcnav.pushNotification.service.NotificationPushService和com.cetcnav.pushNotification.util.MyRMISocket,client端需要这两个类

配置如下:


	    
	    	${registry.addr}
	    
	    
	      
        
	

这样,客户端即可通过公网ip来查询远程服务对象,并调用远程对象的方法

你可能感兴趣的:(Spring RMI远程调用时的内外网端口映射问题)