java学习笔记(十六)――Java RMI(二)
) 返回指定 host 在默认注册表端口 1099 上对远程对象 Registry 的引用;
getRegistry(String host, int port) 返回指定的 host 和 port 上对远程对象 Registry 的引用
registry.bind(“I serve”,service);// bind(String name,Remote obj) 绑定对此注册表中指定 name 的远程引用。name : 与该远程引用相关的名称 obj : 对远程对象(通常是一个 stub)的引用
unbind(String name)移除注册表中指定name的绑定。
rebind(String name,Remote obj)重新绑定,如果name已存在,但是Remote不一样则替换,如果Remote一样则丢弃现有的绑定
lookup(String name) 返回注册表中绑定到指定 name 的远程引用,返回Remote
String[] list() 返回在此注册表中绑定的名称的数组。该数组将包含一个此注册表中调用此方法时绑定的名称快照。
客户机端:向服务器提供相应的服务请求。
Registry registry=LocateRegisty.getRegistry();
SomeService servcie=(SomeService)registry.lookup(“I serve”);
Servcie.requestService();
(四) Naming类和Registry类类似。
客户端:
Naming.lookup(String url)
url 格式如下"rmi://localhost/"+远程对象引用
服务器端:
Registry registry=LocateRegistry.createRegistry(int port);
Naming.rebind(“service”,service);
(五) RMISecurityManager类
在RMI引用程序中,如果没有设置安全管理器,则只能从本地类路径加载stub和类,这可以确保应用程序不受由远程方法调用所
下载的代码侵害
在从远程主机下载代码之前必须执行以下代码来安装RMISecurityManager:
System.setSecurityManager(new RMISecurityManager());
十、demo开发
为了编写一个demo,我们分为两部分,一部分是server端的代码,一部分是client端的代码,client端的代码主要是为了使用server端的代码。当然这个代码是非常简单的,只是为了说明问题,现实的使用会使比较复杂的。
(一) 我们的目的
建立一个server端的java project,包含远程端的代码,定义接口,定义接口实现,然后在建立一个client端的java project,通过RMI使用远端服务中的方法。
(二) 我们的代码结构
(三) 远程服务代码
1. 远程服务的接口定义
第一步就是建立和编译服务接口的
Java代码。这个接口定义了所有的提供远程服务的功能,下面是源程序:
UserManagerInterface.java
复制代码
1 package cn.com.tt.rmiserver.stub;
2
3 import java.rmi.Remote;
4 import java.rmi.RemoteException;
5
6 import cn.com.tt.rmiserver.bean.Account;
7
8 public interface UserManagerInterface extends Remote{
9 public String getUserName() throws RemoteException;
10 public Account getAdminAccount() throws RemoteException;
11 }
复制代码
接口必须继承Remote类,每一个定义地方法都要抛出RemoteException异常对象。
2. 接口的具体实现
第二步就是对于上面的接口进行实现:
UserManagerImp.java
复制代码
1 package cn.com.tt.rmiserver;
2
3 import java.rmi.RemoteException;
4
5 import cn.com.tt.rmiserver.stub.UserManagerInterface;
6 import cn.com.tt.rmiserver.bean.Account;
7
8 public class UserManagerImp implements UserManagerInterface {
9 public UserManagerImp() throws RemoteException {
10
11 }
12 private static final long serialVersionUID = -3111492742628447261L;
13
14 public String getUserName() throws RemoteException{
15 return "TT";
16 }
17 public Account getAdminAccount() throws RemoteException{
18 Account account=new Account();
19 account.setUsername("TT");
20 account.setPassword("123456");
21 return account;
22 }
23 }
复制代码
3. 定义一个bean,实现implements Serializable序列化接口。也就是可以在client和server端进行传输的可序列化对象。
Account.java
复制代码
1 package cn.com.tt.rmiserver.bean;
2
3 import java.io.Serializable;
4
5 public class Account implements Serializable,Cloneable{
6 private static final long serialVersionUID = -1858518369668584532L;
7 private String username;
8 private S