yeshucheng
追逐自己,追逐方向,心随悟所动
posts - 24,comments - 24,trackbacks - 0
 

    在上篇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;

    }

}

 

/**

 *UserInfoOut:返回对象

 *

 *@author:wgh

 */

public class UserInfoOut implements Serializable { 

    private static final long serialVersionUID = 1L;

    private String id;

    private String name;

    private String descn;

    private String age;

    public String getId() {

       returnid;

    }

    public void setId(String id) {

       this.id = id;

    }

    public String getName() {

       returnname;

    }

    public void setName(String name) {

       this.name = name;

    }

    public String getDescn() {

       returndescn;

    }

    public void setDescn(String descn) {

       this.descn = descn;

    }

    public String getAge() {

       returnage;

    }

    public void setAge(String age) {

       this.age = age;

    }

}

       好了到这里算是结束了。至于为什么有这个思路,要结合前面的RMI的问世由来提到的相结合就好理解了。最后就是让我们来构造一个运行主函数类了:

/**

 * TestMain:启动

 *

 *@author:wgh

 */

public class TestMain {

    /**

     *@paramargs

     *@throwsIOException

     *@throwsClassNotFoundException

     *@throwsInterruptedException

     */

    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {

       //start server

       UserInfoImpl impl=new UserInfoImpl();

       UserInfoSkeleton skel=new UserInfoSkeleton(impl);

       skel.start();

       Thread.sleep(6000);

       //start client

       IUserInfo stub = new UserInfoStub();

        UserInfoIn userInfoIn=new UserInfoIn();

        userInfoIn.setId("1");

        userInfoIn.setParameter("yeshucheng");

        UserInfoOut userInfoOut=stub.getValidate(userInfoIn);

        System.out.println("return vo's id is :" + userInfoOut.getId());

        System.out.println("return vo's name is :" + userInfoOut.getName());

        System.out.println("return vo's age is :" + userInfoOut.getAge());  

        System.out.println("return vo's descn is :" + userInfoOut.getDescn());

    }

}

注:这里的代码稍显写的有点乱不够章法,我就这么写这大家就先这么看着。不过代码已经运行成功过了。这里的代码其实还可以优化的更OO

posted on 2009-02-03 21:56 叶澍成 阅读(1760) 评论(3)  编辑  收藏 所属分类: java基础分布式

FeedBack:
# re: 从套接字衍生到RMI代码思路
2009-03-13 13:32 | JeckyWang
谢谢分享!!!  回复  更多评论
  
# re: 从套接字衍生到RMI代码思路
2009-04-28 20:24 | InMin
写的很口语化、很容易理解,顺着作者的思路去理解不但了解了本身要讲解的,还有学到一个思考的过程。作者的的讲解能力很强啊!如果做老师的话,那些学生一定很容易接受你所讲解的内容。非常感谢你!  回复  更多评论
  
# re: 从套接字衍生到RMI代码思路
2009-09-04 09:57 | xzk
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;

}

这一方法中,怎么又是序列化又是反序列化,对象传出去怎么又传进来了,看了很久没看明白,理解的人跟我解释下,谢谢!!!  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: