`
xiang37
  • 浏览: 431655 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

最简单的RMI调用示例

 
阅读更多

RMI是Remote Method Innovation的缩写,表示远程方法引进。

 

为不同机器之间提供服务。

第一步:定义接口。这个接口既是自己实现需要,也是远程需要的。两者定义应该是一样的。

 

 

package com.xiva.rmi;

import java.rmi.Remote;
import java.rmi.RemoteException;

/**
 * @Description 接口必须扩展Remote接口,其方法必须throws RemoteException
 * @author Administrator
 *
 */
public interface RoomService  extends Remote{

	public String getRoomName(Long roomId) throws RemoteException; ;
	
}

 

第二步:实现接口。实现接口并写一个main方法启动服务。

 

 

package com.xiva.rmi;

import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;


/**
 * @Description 需要extends UnicastRemoteObject类
 * @author Administrator
 *
 */
public class RoomServiceImpl extends UnicastRemoteObject implements RoomService {

	protected RoomServiceImpl() throws RemoteException {
		super();
	}

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Override
	public String getRoomName(Long roomId) throws RemoteException{
		if(Long.valueOf(12l).equals(roomId)){
			return "废之间";
		}
		return "天之间";
	}
	
	public static void main(String[] args) {
		
		
//		System.setProperty("java.security.policy","*.policy");//设置安全策略  
		System.setSecurityManager(new RMISecurityManager());
		try { 
			Registry reg = LocateRegistry.createRegistry(2011); //注册服务端口
			RoomServiceImpl pt = new RoomServiceImpl(); 
			reg.rebind( "RoomService" , pt); //绑定服务名称
			System.out.println("Ready to do time"); 
		} catch(Exception e) { 
			e.printStackTrace(); 
		} 
	}

}

 

写好上面程序,就可以使用java来运行这个类了。

 

第三步,编写客户端程序。

 

 

package com.xiva.rmi.client;

import java.rmi.Naming;
import java.rmi.RMISecurityManager;

import com.xiva.rmi.RoomService;

public class CallRoom {

	public static void main(String[] args) { 
		System.setSecurityManager( new RMISecurityManager()); 
		try { 
			RoomService t = (RoomService)Naming.lookup( "rmi://192.168.0.16:2011/RoomService"); 
			System.out.println(t.getRoomName(11l));
		} catch(Exception e) { 
			e.printStackTrace(); 
		} 
	} 
}
 

当然写完这些程序,在一般情况下是可以运行的。比如我的机器就可以正常运行。

 

但是有时我们是还需要指定keystore的,主要与环境有关系。有的计算机某些端口访问是需要提供验证,一般部署环境都是这样。

 

相关安全策略的设置:

 

D:\Program Files\Java\jdk1.6.0_29\jre\lib\security\java.policy

 

 

// Standard extensions get all permissions by default

grant codeBase "file:${{java.ext.dirs}}/*" {
	permission java.security.AllPermission;
};

// default permissions granted to all domains

grant { 
	// Allows any thread to stop itself using the java.lang.Thread.stop()
	// method that takes no argument.
	// Note that this permission is granted by default only to remain
	// backwards compatible.
	// It is strongly recommended that you either remove this permission
	// from this policy file or further restrict it to code sources
	// that you specify, because Thread.stop() is potentially unsafe.
	// See the API specification of java.lang.Thread.stop() for more
        // information.stopThread
        //
	permission java.lang.RuntimePermission "accessClassInPackage.sun.jdbc.odbc";

   permission java.lang.RuntimePermission "stopThread";
   permission java.lang.RuntimePermission "modifyThreadGroup";
   permission java.lang.RuntimePermission "modifyThread";
   permission java.net.SocketPermission "*", "connect,accept,resolve";


	// allows anyone to listen on un-privileged ports
	permission java.net.SocketPermission "localhost:1024-", "listen";

	// "standard" properies that can be read by anyone

	permission java.util.PropertyPermission "java.version", "read";
	permission java.util.PropertyPermission "java.vendor", "read";
	permission java.util.PropertyPermission "java.vendor.url", "read";
	permission java.util.PropertyPermission "java.class.version", "read";
	permission java.util.PropertyPermission "os.name", "read";
	permission java.util.PropertyPermission "os.version", "read";
	permission java.util.PropertyPermission "os.arch", "read";
	permission java.util.PropertyPermission "file.separator", "read";
	permission java.util.PropertyPermission "path.separator", "read";
	permission java.util.PropertyPermission "line.separator", "read";

	permission java.util.PropertyPermission "java.specification.version", "read";
	permission java.util.PropertyPermission "java.specification.vendor", "read";
	permission java.util.PropertyPermission "java.specification.name", "read";

	permission java.util.PropertyPermission "java.vm.specification.version", "read";
	permission java.util.PropertyPermission "java.vm.specification.vendor", "read";
	permission java.util.PropertyPermission "java.vm.specification.name", "read";
	permission java.util.PropertyPermission "java.vm.version", "read";
	permission java.util.PropertyPermission "java.vm.vendor", "read";
	permission java.util.PropertyPermission "java.vm.name", "read";
   permission java.util.PropertyPermission "file.encoding", "read";
};

 

 

设置为上面安全策略。

 

createRegister后,可以使用RMIGetRegister 来获取registry,bind新的服务名

 

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.xiva;

import java.rmi.AlreadyBoundException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

/**
 *
 * @author Administrator
 */
public class RMIGetRegister {
    
    private static Registry registry = null;
    
    private static String bindName = "RoomService";
    
     public static void main(String[] args) throws InterruptedException, RemoteException, AlreadyBoundException {
                 // 取得RMIRegistry
        try {
            registry = LocateRegistry.getRegistry(2012);
        } catch (RemoteException ex) {
            System.out.println(ex.getMessage());
        }
        
        // 解除Registry绑定
        try {
            System.out.println("trying to unbind rmi registry");
            registry.unbind(bindName);
            Thread.sleep(3000); //wait 3 seconds.
        } catch (RemoteException ex) {
            ex.printStackTrace();
        } catch (NotBoundException ex) {
            //nothing to do
        }
        
        RoomService o = new RemoteServiceImpl();
        //RemoteMethod  stub= (RemoteMethod) UnicastRemoteObject.exportObject(o, 0);
        registry.bind("xiva", o);
        System.out.println("bindName");
     }
}

 

注意UnicastRemoteObject.exportObject(o, 0)其中的o是没有extends UnicastRemoteObject的类。

 

分享到:
评论

相关推荐

    Java RMI 简单示例

    这个简单的示例展示了如何创建一个基本的Java RMI应用程序,包括远程接口、服务器端和客户端。 首先,我们来看远程接口。在这个例子中,`HelloIn`接口定义了一个方法`sayHello()`,该方法抛出`RemoteException`。这...

    最最简单的RMI实例

    这在多层架构的应用中尤其有用,比如服务器端处理业务逻辑,客户端通过RMI调用这些逻辑。 首先,我们需要创建一个RMI接口。在这个例子中,我们有一个名为`RMIInterface.java`的文件。这个接口定义了可以在远程对象...

    RMI最简单的一个实例

    ### RMI最简单的一个实例解析 #### 一、RMI简介与应用场景 远程方法调用 (RMI) 是 Java 平台提供的一种机制,允许在一台机器上的虚拟机中的对象调用另一台机器上虚拟机中的对象的方法。RMI 结合了面向对象技术与...

    java RMI简单Demo

    7. **异常处理**:由于网络通信的不稳定性,`RemoteException`是Java RMI中最常见的异常类型,通常需要在所有远程方法中捕获它。 在"RMITest"这个示例中,可能包含以下部分: - **远程接口类(如:IRemoteService....

    Java分布式RMI获取服务器时间

    4. **客户机(Client)**:使用RMI调用远程对象的程序,通过注册表获取远程对象的引用,然后就可以像调用本地对象一样调用远程对象的方法。 5. **服务器(Server)**:运行远程对象的程序,负责创建远程对象并将其...

    java rmi java rmi

    这里给出一个简单的RMI示例: 1. **定义远程接口**: ```java public interface HelloIFC extends Remote { String sayHello() throws RemoteException; } ``` 2. **实现远程接口**: ```java public class...

    Java RMI的简单例子

    ### Java RMI基础知识与示例解析 ...通过以上详细分析,我们可以清楚地了解到如何使用Java RMI来实现简单的分布式应用。尽管RMI在现代Java开发中的使用频率不高,但了解其基本原理和技术细节仍然具有一定的价值。

    RMI.rar_rmi

    **远程方法调用(Remote Method Invocation,RMI)是Java平台提供的一种分布式计算技术,它允许Java对象在...RMI文档(如RMI.docx文件)通常会包含详细的API参考、示例代码和最佳实践,帮助开发者更好地理解和使用RMI。

    编写简单的RMI程序 多线程web 服务器

    文件"ex4_5"和"ex6"可能是实验代码或练习,可能包含了实现RMI程序和多线程Web服务器的示例。通过分析和运行这些代码,你可以更好地理解这两个主题的实际应用。对于初学者来说,动手实践是掌握知识的重要步骤,它可以...

    rmi服务端与客户端小程序

    本项目"rmi服务端与客户端小程序"提供了简单易懂的示例,帮助初学者快速理解和上手RMI。 1. **RMI基本概念** - **远程对象**:在远程JVM上运行的对象,可以通过RMI接口被本地对象调用。 - **接口**:定义了远程...

    spring rmi 简单应用

    Spring RMI(Remote Method Invocation)简单应用主要涉及的是在Java平台上使用Spring框架来实现远程方法调用的技术。RMI是Java提供的一种分布式计算能力,它允许一个Java对象调用网络另一端的Java对象的方法,从而...

    rmi基础教程

    RMI(Remote Method Invocation)是Java平台提供的一种远程方法调用技术,它允许在不同JVM(Java虚拟机)上的对象互相通信,就如同本地调用一样简单。RMI的设计理念在于为分布式计算环境提供一个统一的编程模型,使...

    HTTP客户端,HTTP服务器,RMI客户端和服务器

    具体到实验文件"rmi",这可能是RMI相关代码或者教程的集合,可能包含了服务器端和客户端的示例代码,以及如何在Java中设置和运行RMI服务的说明。"cs"可能代表"Client-Server",也就是客户端-服务器相关的文件,可能...

    java分布式之RMI简介及实例

    ### Java分布式之RMI简介...通过上述步骤,我们不仅可以实现简单的RMI服务,还可以构建更为复杂的分布式应用程序。RMI提供了一种强大的工具集,可以帮助开发者轻松地构建分布式系统,同时确保了系统的稳定性和安全性。

    Java网络编程示例代码

    其次,URL/RMI编程示例代码涉及到网络资源的访问和远程方法调用。URL(统一资源定位符)是访问互联网上的资源的地址,Java的java.net.URL类提供了打开、读取和连接URL的方法。RMI(Remote Method Invocation)允许...

    JAVA_RMI_实例.pdf

    在这个实例中,我们将详细探讨如何通过四个步骤来设置和使用一个简单的 Java RMI 应用。 1. 创建远程接口及声明远程方法 首先,我们需要定义一个远程接口 `HelloInterface`,它继承自 `java.rmi.Remote`。这个接口...

    Rmi.zip_The Beginners

    这个"Rmi.zip_The Beginners"压缩包显然是为初学者准备的一个简单示例,旨在帮助他们理解并开始使用Java RMI。 1. **HelloServer.java**: 这个文件代表服务器端程序。在RMI中,服务器端通常会实现一个或多个远程...

    JDK5新版RMI编程指南

    ### JDK5新版RMI编程指南 #### RMI简介与发展历程 RMI(Remote Method Invocation),即远程...随着这些新特性的应用,RMI有望成为Java平台上性能最好且最简单的远程访问技术之一,值得开发者深入了解和广泛使用。

    RMI规范说明

    7. **异常处理**:由于网络通信的不稳定性,`RemoteException`是RMI中最常见的异常,需要在客户端代码中妥善处理。 RMI规范说明中的多个文件可能涵盖了RMI的详细配置、性能优化、故障排查、以及与其他Java技术如EJB...

Global site tag (gtag.js) - Google Analytics