在做的项目中发现了一句:factory.setServiceUrl("rmi://"+url+":"+port+"/ipsvc"); 都说学习java只要学会如何调用底层方法就行,但说是这么说。
咱们还是要了解下底层东东,才能写出大师级别的代码。
出于什么,我百度了下RMI,操,不百度不知道。rmi听起来很厉害的样子,远程方法调用。
何为远程方法调用:跨平台、跨操作系统、跨虚拟机。
简单点就是,你在河东写了个方法,我在河西就能访问到,确实不错。
主文:
rmi程序编写步骤:
- 远程接口,要实现Remote接口、
- 远程接口实现,实现远程接口同时还要集成UnicastRemoteObject
- 远程服务类,绑定端口、绑定对象
- 远程访问客户类
开始写程序(没有在IDE上写,错误之处,见谅)
1 远程接口:必须集成Remote接口 2 public interface IMessage extends Remote{ 3 public Person getPerson() throws RemoteException; 4 } 5 //待传递对象,因此要实现序列化 6 public class Person implements Serializable{ 7 private int age; 8 private String name; 9 10 public Person(){11 12 }13 14 public Person(){15 this.age = age;16 this.name = name;17 }18 }19 20 远程接口实现:要集成UnicastRemoteObject类21 public class MessageImpl extends UnicastRemoteObject implements Rmote{22 public MessageImpl() throws RemoteException{23 24 }25 26 public Person getPerson() throws RemoteException{27 return new Person(22,"**");28 }29 }30 31 远程接口服务:32 public class server{33 public static void main(String agrs[]){34 if(System.getSercurity() == null){35 System.setSecurty(new RmiSercurtyManage());36 }37 38 LocateRegistry.createRegistry(9999); //绑定服务端口39 40 IMessage m = new MessageImpl();41 Naming.bing("rmi://loacalhost:9999/person",m);42 System.out.println("remote method is startting.......");43 }44 }45 46 client:47 pubic class Client{48 public static void main(String args[]){49 if(System.getSercurity() == null){50 System.setSecurty(new RmiSercurtyManage());51 }52 53 IMessage m = (IMessage)Naming.lookup("rmi://loacalhost:9999/person");54 Person p = m.getPerson();55 System.out.println("" + p.getName());56 }57 }
写是能写出来,但有什么用呢?
我在一个项目中建立server和client包,这样是可以访问的。但是我写两个项目,一个用户server、一个用于client,就会报access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve)
这是远程方法访问,我通过Naming.lookup("----");获取的对象,是在远程,是从远程传递过来的。那么我需要调用远程接口的方法,我还必须得到远程的接口。
如果远程接口中定义的方法获取的是对象,就是说,我在本地调用方法获取的是远程的对象。
在本地访问远程方法时:
需要远程接口,
需要远程接口中返回的对象,
需要远程接口绑定的端口,和url
posted on 2013-12-05 11:11 阅读( ...) 评论( ...)