`
log_cd
  • 浏览: 1089570 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论
阅读更多
   RMI限java之间,且使用Stream 技术(serialize)传输。WebService是通过XML来传输数据,可用http等协议因此可在异构系统间传递,并且可以穿过防火墙,可在公网上远程调用。
(1)远程调用接口

import java.rmi.Remote;
import java.rmi.RemoteException;
public interface ComputerEngineRemote extends Remote {
    public Object excuteTask(Task task) throws RemoteException;

}


(2)远程调用接口实现

public class ComputerEngine extends UnicastRemoteObject implements
        ComputerEngineRemote {

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

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

    public Object excuteTask(Task task) throws RemoteException {
        return task.excute();
    }

}


(3)定义业务接口

public interface Task extends Serializable {
    Object excute();

}


(2)业务接口实现

public class TaskImpl implements Task {

	private static final long serialVersionUID = 1L;

	public Object excute() {
        return "Successful!";
    }

}


(4)将远程对象注册到 RMI 的注册表

public class Bootstrap {

/*  "引导"过程(Bootstrap)。引导程序负责创建和注册远程对象。*/
public static void main(String[] args) throws Exception {
         String name="ComputerEngine";
        //System.setProperty("java.rmi.server.hostname","172.31.3.33");
        //System.setProperty( "java.security.policy", "client.policy" );
        //System.setSecurityManager(new java.rmi.RMISecurityManager());
    	LocateRegistry.createRegistry(1099);     
    	ComputerEngine server = new ComputerEngine(); 
    	Naming.rebind("rmi://127.0.0.1:1099/ComputerEngine", server); 
    	System.out.println("Ready to accept tasks"); 

    	}
}


(5)远程调用接口

public class Client {

    public static void main(String[] args) throws Exception {
        String name="rmi://127.0.0.1:1099/ComputerEngine";
        try{
           //定义接口
           ComputerEngineRemote engineRemote=(ComputerEngineRemote) Naming.lookup(name);
           System.out.println(engineRemote.excuteTask(new TaskImpl()));
           }catch(ConnectException e){
    	   e.printStackTrace();
    	   System.out.println("No listener!");
       }

    }

}


(6)java.policy

permission java.net.SocketPermission "127.0.0.1:1099","connect,resolve";

permission   java.security.AllPermission;
  
   Java应用程序环境的安全策略,详细说明了对于不同的代码所拥有的不同资源的许可,它由一个Policy对象来表达。为了让applet(或者运行在   SecurityManager下的一个应用程序)能够执行受保护的行为,例如读写文件,applet(或   Java应用程序)必须获得那项操作的许可,安全策略文件就是用来实现这些许可。
grant   {    
  //对系统和用户目录“读”的权限    
  permission   java.util.PropertyPermission   “user.dir",   “read";    
  permission   java.util.PropertyPermission   “user.home",   “read";    
  permission   java.util.PropertyPermission   “java.home",   “read";    
  permission   java.util.PropertyPermission   “java.class.path",   “read";    
  permission   java.util.PropertyPermission   “user.name",   “read";    
   
  //对线程和线程组的操作权限    
  permission   java.lang.RuntimePermission   “modifyThread";    
  permission   java.lang.RuntimePermission   “modifyThreadGroup";    
   
  //操作Socket端口的各种权限    
  permission   java.net.SocketPermission   “-",   “listen";    
  permission   java.net.SocketPermission   “-",   “accept";    
  permission   java.net.SocketPermission   “-",   “connect";    
  permission   java.net.SocketPermission   “-",   “read";    
  permission   java.net.SocketPermission   “-",   “write";    
   
  //读写文件的权限    
  permission   java.io.FilePermission   “-",   “read";    
  permission   java.io.FilePermission   “-",   “write";    
   
  //退出系统的权限,例如System.exit(0)    
  permission   java.lang.RuntimePermission   “exitVM";    
};    

(7)远程调用,得到图片文件

Remote:
public Object excute() {
		String inputFile="D:/images/img.bmp";
		FileInputStream source=null;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
		try {
			source = new FileInputStream(new File(inputFile));
		    int bytes_read;
		    byte[] buffer = new byte[1024];
		    while (true) {
		        bytes_read = source.read(buffer);
		        if (bytes_read == -1) {
		          break;
		        }
		        bos.write(buffer, 0, bytes_read);
		    }
	        byte[] data = bos.toByteArray();
	        bos.close();
	        bos = null;
	        return data;
        }catch(Exception e){
            
        }finally{
            if(bos != null){
                try {
					bos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
                bos = null;
            }
        }
        return null;
}


Client:

public static void main(String[] args) throws Exception {
        String name="rmi://127.0.0.1:1099/ComputerEngine";
       try{
    	   ComputerEngineRemote engineRemote=(ComputerEngineRemote) Naming.lookup(name);
    	   File outputFile = new File("D:/images/receive.bmp");
		   FileOutputStream target = new FileOutputStream(outputFile);
		   target.write((byte[])engineRemote.excuteTask(new TaskImpl()));
		   System.out.println("OK!");
       }catch(ConnectException e){
    	   e.printStackTrace();
    	   System.out.println("No listener!");
       }
}
分享到:
评论
1 楼 Motte2010 2012-03-08  
远程对象注册到 RMI 的注册表  这步报错  楼主没有遇到这问题?
java.rmi.StubNotFoundException: Stub class not found: server.TaskRemoteImp_Stub; nested exception is: 
	java.lang.ClassNotFoundException: server.TaskRemoteImp_Stub
	at sun.rmi.server.RemoteProxy.getStub(RemoteProxy.java:98)
	at sun.rmi.server.RemoteProxy.getStub(RemoteProxy.java:55)
	at sun.rmi.server.UnicastServerRef.setSkeleton(UnicastServerRef.java:179)
	at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:142)
	at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:129)
	at java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:275)
	at java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:178)
	at java.rmi.server.UnicastRemoteObject.<init>(UnicastRemoteObject.java:75)
	at java.rmi.server.UnicastRemoteObject.<init>(UnicastRemoteObject.java:61)
	at server.TaskRemoteImp.<init>(TaskRemoteImp.java:13)
	at rmiMain.main(rmiMain.java:15)
Caused by: java.lang.ClassNotFoundException: server.TaskRemoteImp_Stub
	at java.net.URLClassLoader$1.run(URLClassLoader.java:199)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
	at sun.rmi.server.RemoteProxy.loadClassFromClass(RemoteProxy.java:191)
	at sun.rmi.server.RemoteProxy.getStub(RemoteProxy.java:93)
	... 10 more
Exception in thread "main" 

是按照楼主所写的那样操作的啊

相关推荐

    java rmi java rmi

    java rmi java rmijava rmi javajava rmi java rmi rmi

    java RMI技术实现的网络聊天室

    java RMI技术实现的网络聊天室 编译通过,很完整的。代码很有参考价值

    基于JAVA RMI的聊天室

    采用JAVA rmi,带图形界面,完全由自己实现的聊天室,具备基本的聊天功能,可以自己扩充功能

    javaRMI反序列化漏洞验证工具

    检测javaRMI反序列化漏洞

    java RMI简单Demo

    java RMI

    java RMI实现代码

    java RMI实现代码。分为客户端和服务器端,有清楚的代码注释。

    Java RMI 简单示例

    Java RMI 简单示例

    java rmi远程调用

    最近在学习代理模式,用到了java rmi远程调用,包含服务端和客户端,之前一直没有接触过,学习了java rmi远程调用,一方面可以了解代理模式,一方面熟悉java低层的远程

    JavaRMI.pdf

    JavaRMI.pdf

    Java RMI.pdf

    《Java RMI》一书的英文版本,With Java RMI, you'll learn tips and tricks for making your RMI code excel. This book provides strategies for working with serialization, threading, the RMI registry, ...

    javaRMI完整版.pdf

    javaRMI完整版.pdf

    Java RMI中文规范

    这是本人搜集整理的Java RMI规范,中文版,经过排版 共包括10个章节,2个附录

    java rmi上传文件

    在这次的项目中,对于客户端与服务器之间的通信,想了许多办法,由于做的是富客户端应用,最终将技术选定在了RMI和Java-sockets两种之间,其中RMI的灵活性不高,客户端和服务器端都必须是java编写,但使用比较方便,...

    原创的JavaRMI项目

    这是原创的最简单的Java RMI入门项目,内含二个Eclipse项目,一是服务器端,二是客户端。非常简单,只看其中的注释就能理解(当然先要知道什么是RMI了),只供入门用。 这是用Java 1.7编辑的,如果你用的版本低,则...

    JavaRMI的原理和实现方法

    JavaRMI的原理和实现方法 分布式对象计算 来源于青岛大学学报

    分布式程序java 实验名称 基于Java RMI的C/S编程实验

    实验名称 基于Socket的C/S编程实验 实验名称 基于Java RMI的C/S编程实验

    java rmi HelloWorld版(源码)

    java rmi 调用实例及详细说明,详细可参见博客:http://blog.csdn.net/fufengrui/article/details/9855865

    JAVARMI实例[文].pdf

    JAVARMI实例[文].pdf

    JavaRMI分布式编程心得

    网络上绝大多数关于Java RMI分布式编程的资料真的很久、很古老了, 我也是偶尔看到别人的文章,自己动手做实验才总结的一些心得与例子, 希望能够帮到那些有用的人!

Global site tag (gtag.js) - Google Analytics