<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

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

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

    客戶端

    代理接口

    /**

     *IUserInfo:代理接口

     *

     *@author:wgh

     */

    public interface IUserInfo {

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

    }

     

    后臺樁基類(實現(xiàn)了代理接口):

    /**

     *UserInfoStub:后臺樁基(stub),把接口中的參數(shù)通過套接字請求方式發(fā)送到服務(wù)端(接收返回對象或者參數(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ù)端如何運作的:

    服務(wù)端

    實現(xiàn)類:

    /**

     *UserInfoImpl:實現(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("萬國輝");

               userInfoOut.setAge("30");

               userInfoOut.setDescn("描述");

               return userInfoOut;

           }

           return null;

        }

    }

     

    后臺骨架類:

    /**

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

     *

     *@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é)束了。那我們還缺少什么呢?沒錯,就是傳輸?shù)膶ο蟆T谶@里我們采用ValueObject的方式通過兩個對象來說明,一個是請求對象,一個是返回相應(yīng)對象。

    值對象:

    /**

     *UserInfoIn:發(fā)送對象

     *

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

        }

    }

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

    /**

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

        }

    }

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

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

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

    }

    這一方法中,怎么又是序列化又是反序列化,對象傳出去怎么又傳進來了,看了很久沒看明白,理解的人跟我解釋下,謝謝!!!  回復(fù)  更多評論
      
    主站蜘蛛池模板: 中文字幕在线视频免费| 亚洲Av综合色区无码专区桃色 | 91高清免费国产自产| 免费在线观看一区| 亚洲中文字幕无码久久2020| 亚洲AV日韩AV鸥美在线观看| 亚洲精品97久久中文字幕无码| 在线观看视频免费国语| 99久久免费国产香蕉麻豆| 无码日韩精品一区二区三区免费| 一级毛片a免费播放王色电影 | 97在线免费视频| 一本久久免费视频| 边摸边吃奶边做爽免费视频99| 2019亚洲午夜无码天堂| 亚洲成av人片在线看片| 91亚洲一区二区在线观看不卡| 亚洲精品成人片在线播放| 亚洲高清免费视频| 国产国产人免费视频成69大陆| 好爽又高潮了毛片免费下载| 曰批全过程免费视频在线观看| 18女人毛片水真多免费| 3d动漫精品啪啪一区二区免费| 99久久免费观看| 麻豆高清免费国产一区| 2019中文字幕在线电影免费 | 亚洲国产精品一区二区久久| 亚洲国产精品无码久久久蜜芽| 亚洲色大成网站WWW久久九九| 亚洲自偷自偷偷色无码中文| 超清首页国产亚洲丝袜| 在线精品亚洲一区二区小说| 色噜噜亚洲精品中文字幕 | 最新亚洲成av人免费看| 国产成年无码久久久免费| 久久精品视频免费| 日本免费人成视频在线观看| 久久九九兔免费精品6| 18禁免费无码无遮挡不卡网站 | 亚洲国产精品自在线一区二区 |