在上篇blog中谈到RMI的问世由来只是大致的把一些概念结构说明了下,自己静静想想要有好的说明干脆用代码说明比较妥当也最为有说明性。事后自己倒腾了一个简单的代码DEMO。代码中有个简单的场景,比如你是属于某地区医保范围内的成员,到医院看病,这个候医院为了审核你的相关个人资料需要到医保管理部门调阅信息,你只需要给出用户名称或者其他一个有效参数交给工作人员通过网络到远程医保部门调阅信息即可。
废话不多说,代码最能说明问题了。首先出场的客户端的代码。
客户端
代理接口:
/**
*IUserInfo:代理接口
*
*@author:wgh
*/
public interface IUserInfo {
public UserInfoOut getValidate(UserInfoIn in) throws IOException, ClassNotFoundException;
}
后台桩基类(实现了代理接口):
/**
*UserInfoStub:后台桩基(stub)类,把接口中的参数通过套接字请求方式发送到服务端(接收返回对象或者参数)
*
*@author:wgh
*/
public class UserInfoStub implements IUserInfo {
Socket socket = null;
public UserInfoStub() throws IOException {
socket = new Socket("localhost", 8999);
}
public UserInfoOut getValidate(UserInfoIn in) throws IOException,ClassNotFoundException {
ObjectOutputStream os = new ObjectOutputStream(socket.getOutputStream());
os.writeObject(in);
os.flush();
ObjectInputStream is = new ObjectInputStream(socket.getInputStream());
UserInfoOut userInfo = (UserInfoOut) is.readObject();
return userInfo;
}
}
到这里客户端就基本结束了,呵呵。是不是很容易?接下来我们要看看服务端如何运作的:
服务端
实现类:
/**
*UserInfoImpl:实现类
*
*@author:wgh
*/
public class UserInfoImpl implements IUserInfo {
public UserInfoOut getValidate(UserInfoIn userInfoIn) {
if(userInfoIn.getParameter().equals("yeshucheng")){
UserInfoOut userInfoOut=new UserInfoOut();
userInfoOut.setId(userInfoIn.getId());
userInfoOut.setName("万国辉");
userInfoOut.setAge("30");
userInfoOut.setDescn("描述");
return userInfoOut;
}
return null;
}
}
后台骨架类:
/**
*UserInfoSkeleton:后台服务端(skeleton)类,通过ServerSocket处理请求参数根据需求返回对象值
*
*@author:wgh
*/
public class UserInfoSkeleton extends Thread{
public UserInfoImpl userInfoImpl;
Socket socket=null;
public UserInfoSkeleton(UserInfoImpl userInfoImpl){
this.userInfoImpl=userInfoImpl;
}
public void run(){
try {
ServerSocket server=new ServerSocket(8999);
System.out.println("Server Waiting...");
socket=server.accept();
ObjectInputStream oi=new ObjectInputStream(socket.getInputStream());
UserInfoIn userInfoIn=(UserInfoIn) oi.readObject();
UserInfoOut userInfoOut=userInfoImpl.getValidate(userInfoIn);
if(userInfoIn.getParameter().equals("yeshucheng")){
ObjectOutputStream os=new ObjectOutputStream(socket.getOutputStream());
os.writeObject(userInfoOut);
os.flush();
}
}catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally{
try{
if(socket!=null)
socket.close();
}catch(Exception e){
System.out.println(" socket is Exception not closed cause is:"+e.toString());
}
}
}
}
到这里服务端的代码也结束了。那我们还缺少什么呢?没错,就是传输的对象。在这里我们采用ValueObject的方式通过两个对象来说明,一个是请求对象,一个是返回相应对象。
值对象:
/**
*UserInfoIn:发送对象
*
*@author:wgh
*/
public class UserInfoIn implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String parameter;
public String getId() {
returnid;
}
public void setId(String id) {
this.id = id;
}
public String getParameter() {
returnparameter;
}
public void setParameter(String parameter) {
this.parameter = parameter;
}
}
分享到:
相关推荐
java RMI实现代码。分为客户端和服务器端,有清楚的代码注释。
完整的Rmi调用示例,极难得的Rmi应用示例
RMI代码动态下载,包含了个简单的http服务,直接就可以运行。
一个简单的RMI例子Java源代码,用于学习理解RMI
rmi client和server完整代码,亲测有效,实现远程访问
Java RPC和RMI代码实战,有关键注释,为最简案例。Maven搭建,JDK8编译。 RPC体验:依次运行RpcProvider和RpcConsumer类。 RMI体验:RMITest中依次运行testServer和testClient方法。
可直接运行在Linux和Windows平台上
远程调用代码RMI技术,可是实现远程方法调用的代码
学习RMI的经典!这里是精通rmi的程序代码
rmi回调实例含代码 rmi回调实例含代码 rmi回调实例含代码
RMI简单远程调用,实现数字相加!代码简单易懂
rmi 客户端 和 服务端 代码
RMI(远程方法调用)简单代码例子 RMI(远程方法调用)简单代码例子
可运行的RMI示例代码,RMI概念和其中的技术要点总结参见我的blog文章:"EJB第一枪:RMI and RMI-IIOP
一个相当经典的RMI实例源代码及详细说明
一份很全的介绍rmi基本原理,以及如何使用rmi,以及使用过程中需要注意的事项,非常不错的文档
java rmi java rmijava rmi javajava rmi java rmi rmi
让VC++ 支持RMI功能类库 示例代码
RMI简单实例RMI简单实例RMI简单实例