yeshucheng
          追逐自己,追逐方向,心隨悟所動(dòng)
          posts - 24,comments - 24,trackbacks - 0
           

              在上篇blog中談到RMI的問世由來只是大致的把一些概念結(jié)構(gòu)說明了下,自己靜靜想想要有好的說明干脆用代碼說明比較妥當(dāng)也最為有說明性。事后自己倒騰了一個(gè)簡(jiǎn)單的代碼DEMO。代碼中有個(gè)簡(jiǎn)單的場(chǎng)景,比如你是屬于某地區(qū)醫(yī)保范圍內(nèi)的成員,到醫(yī)院看病,這個(gè)候醫(yī)院為了審核你的相關(guān)個(gè)人資料需要到醫(yī)保管理部門調(diào)閱信息,你只需要給出用戶名稱或者其他一個(gè)有效參數(shù)交給工作人員通過網(wǎng)絡(luò)到遠(yuǎn)程醫(yī)保部門調(diào)閱信息即可。

                 廢話不多說,代碼最能說明問題了。首先出場(chǎng)的客戶端的代碼。

          客戶端

          代理接口

          /**

           *IUserInfo:代理接口

           *

           *@author:wgh

           */

          public interface IUserInfo {

              public UserInfoOut getValidate(UserInfoIn in) throws IOException, ClassNotFoundException;

          }

           

          后臺(tái)樁基類(實(shí)現(xiàn)了代理接口):

          /**

           *UserInfoStub:后臺(tái)樁基(stub),把接口中的參數(shù)通過套接字請(qǐng)求方式發(fā)送到服務(wù)端(接收返回對(duì)象或者參數(shù))

           *

           *@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;

              }

          }

              到這里客戶端就基本結(jié)束了,呵呵。是不是很容易?接下來我們要看看服務(wù)端如何運(yùn)作的:

          服務(wù)端

          實(shí)現(xiàn)類:

          /**

           *UserInfoImpl:實(shí)現(xiàn)類

           *

           *@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("萬(wàn)國(guó)輝");

                     userInfoOut.setAge("30");

                     userInfoOut.setDescn("描述");

                     return userInfoOut;

                 }

                 return null;

              }

          }

           

          后臺(tái)骨架類:

          /**

           *UserInfoSkeleton:后臺(tái)服務(wù)端(skeleton),通過ServerSocket處理請(qǐng)求參數(shù)根據(jù)需求返回對(duì)象值

           *

           *@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());

                     }

                 }

              }

          }

                 到這里服務(wù)端的代碼也結(jié)束了。那我們還缺少什么呢?沒錯(cuò),就是傳輸?shù)膶?duì)象。在這里我們采用ValueObject的方式通過兩個(gè)對(duì)象來說明,一個(gè)是請(qǐng)求對(duì)象,一個(gè)是返回相應(yīng)對(duì)象。

          值對(duì)象:

          /**

           *UserInfoIn:發(fā)送對(duì)象

           *

           *@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:返回對(duì)象

           *

           *@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;

              }

          }

                 好了到這里算是結(jié)束了。至于為什么有這個(gè)思路,要結(jié)合前面的RMI的問世由來提到的相結(jié)合就好理解了。最后就是讓我們來構(gòu)造一個(gè)運(yùn)行主函數(shù)類了:

          /**

           * TestMain:啟動(dòng)

           *

           *@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());

              }

          }

          注:這里的代碼稍顯寫的有點(diǎn)亂不夠章法,我就這么寫這大家就先這么看著。不過代碼已經(jīng)運(yùn)行成功過了。這里的代碼其實(shí)還可以優(yōu)化的更OO

          posted on 2009-02-03 21:56 葉澍成 閱讀(1798) 評(píng)論(3)  編輯  收藏 所屬分類: java基礎(chǔ)分布式

          FeedBack:
          # re: 從套接字衍生到RMI代碼思路
          2009-03-13 13:32 | JeckyWang
          謝謝分享!!!  回復(fù)  更多評(píng)論
            
          # re: 從套接字衍生到RMI代碼思路
          2009-04-28 20:24 | InMin
          寫的很口語(yǔ)化、很容易理解,順著作者的思路去理解不但了解了本身要講解的,還有學(xué)到一個(gè)思考的過程。作者的的講解能力很強(qiáng)啊!如果做老師的話,那些學(xué)生一定很容易接受你所講解的內(nèi)容。非常感謝你!  回復(fù)  更多評(píng)論
            
          # 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;

          }

          這一方法中,怎么又是序列化又是反序列化,對(duì)象傳出去怎么又傳進(jìn)來了,看了很久沒看明白,理解的人跟我解釋下,謝謝!!!  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 承德县| 文成县| 嵩明县| 杭州市| 揭东县| 乌苏市| 德令哈市| 额尔古纳市| 旺苍县| 武夷山市| 得荣县| 大同县| 武邑县| 酉阳| 兴海县| 松桃| 大英县| 琼结县| 察雅县| 西林县| 蒲城县| 精河县| 漳平市| 崇阳县| 四川省| 依安县| 公安县| 柳林县| 周口市| 蒙山县| 扶沟县| 临汾市| 阿克苏市| 武汉市| 宜宾市| 二手房| 桑植县| 荣昌县| 庆城县| 南丰县| 阿克陶县|