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

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

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

    底層架構(gòu)-遠(yuǎn)程通訊

    一:基本原理
        主要是要實(shí)現(xiàn)網(wǎng)絡(luò)之間的通訊,網(wǎng)絡(luò)通信需要做的就是將流從一臺(tái)計(jì)算機(jī)傳輸?shù)搅硗庖慌_(tái)計(jì)算機(jī),基于傳輸協(xié)議和網(wǎng)絡(luò)IO來實(shí)現(xiàn),其中傳輸協(xié)議比較出名的有http、 tcp、udp等等,http、tcp、udp都是在基于Socket概念上為某類應(yīng)用場(chǎng)景而擴(kuò)展出的傳輸協(xié)議,網(wǎng)絡(luò)IO,主要有bio、nio、aio 三種方式,所有的分布式應(yīng)用通訊都基于這個(gè)原理而實(shí)現(xiàn)。

    二:實(shí)踐
    在分布式服務(wù)框架中,一個(gè)最基礎(chǔ)的問題就是遠(yuǎn)程服務(wù)是怎么通訊的,在Java領(lǐng)域中有很多可實(shí)現(xiàn)遠(yuǎn)程通訊的技術(shù):RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS
    既然引入出了這么多技術(shù),那我們就順道深入挖掘下去,了解每個(gè)技術(shù)框架背后的東西:
    1.首先看RMI
         RMI主要包含如下內(nèi)容: 
         遠(yuǎn)程服務(wù)的接口定義 
          ·遠(yuǎn)程服務(wù)接口的具體實(shí)現(xiàn) 
          ·樁(Stub)和框架(Skeleton)文件 
          ·一個(gè)運(yùn)行遠(yuǎn)程服務(wù)的服務(wù)器 
          ·一個(gè)RMI命名服務(wù),它允許客戶端去發(fā)現(xiàn)這個(gè)遠(yuǎn)程服務(wù) 
          ·文件的提供者(一個(gè)HTTP或者FTP服務(wù)器) 
          ·一個(gè)需要這個(gè)遠(yuǎn)程服務(wù)的客戶端程序 
        
        來看下基于RMI的一次完整的遠(yuǎn)程通信過程的原理:
        1)客戶端發(fā)起請(qǐng)求,請(qǐng)求轉(zhuǎn)交至RMI客戶端的stub類;
        2)stub類將請(qǐng)求的接口、方法、參數(shù)等信息進(jìn)行序列化;
        3)基于tcp/ip將序列化后的流傳輸至服務(wù)器端;
        4)服務(wù)器端接收到流后轉(zhuǎn)發(fā)至相應(yīng)的skelton類;
        5)skelton類將請(qǐng)求的信息反序列化后調(diào)用實(shí)際的處理類;
        6)處理類處理完畢后將結(jié)果返回給skelton類;
        7)Skelton類將結(jié)果序列化,通過tcp/ip將流傳送給客戶端的stub;
        8)stub在接收到流后反序列化,將反序列化后的Java Object返回給調(diào)用者。

         RMI應(yīng)用級(jí)協(xié)議內(nèi)容:
    1、傳輸?shù)臉?biāo)準(zhǔn)格式是什么?
          是Java ObjectStream。
    2、怎么樣將請(qǐng)求轉(zhuǎn)化為傳輸?shù)牧鳎?/div>
          基于Java串行化機(jī)制將請(qǐng)求的java object信息轉(zhuǎn)化為流。
    3、怎么接收和處理流?
          根據(jù)采用的協(xié)議啟動(dòng)相應(yīng)的監(jiān)聽端口,當(dāng)有流進(jìn)入后基于Java串行化機(jī)制將流進(jìn)行反序列化,并根據(jù)RMI協(xié)議獲取到相應(yīng)的處理對(duì)象信息,進(jìn)行調(diào)用并處理,處理完畢后的結(jié)果同樣基于java串行化機(jī)制進(jìn)行返回。
    4、傳輸協(xié)議是?
          tcp/ip。

    原理講了,開始實(shí)踐:
    創(chuàng)建RMI程序的6個(gè)步驟: 
    1、定義一個(gè)遠(yuǎn)程接口的接口,該接口中的每一個(gè)方法必須聲明它將產(chǎn)生一個(gè)RemoteException異常。 
    2、定義一個(gè)實(shí)現(xiàn)該接口的類。 
    3、使用RMIC程序生成遠(yuǎn)程實(shí)現(xiàn)所需的殘根和框架。 
    4、創(chuàng)建一個(gè)服務(wù)器,用于發(fā)布2中寫好的類。 
    5. 創(chuàng)建一個(gè)客戶程序進(jìn)行RMI調(diào)用。 
    6、啟動(dòng)rmiRegistry并運(yùn)行自己的遠(yuǎn)程服務(wù)器和客戶程序     
        
     
    1)首先創(chuàng)建遠(yuǎn)程接口:
     /**
     * 遠(yuǎn)程接口
     * 
     * @author mike
     *
     * 
    @since 2012-3-14
     
    */
    public interface Hello extends Remote {
        /**
         * 測(cè)試rmi 
         * 
         * 
    @return   hello
         * 
    @throws RemoteException
         
    */
        public String hello()throws RemoteException;
    }
           
         2)創(chuàng)建接口實(shí)現(xiàn)
            package com.gewara.rmi;

    import java.rmi.RemoteException;
    import java.rmi.server.UnicastRemoteObject;

    /**
     * 遠(yuǎn)程接口實(shí)現(xiàn)
     * 
     * 
    @author mike
     *
     * 
    @since 2012-3-14
     
    */
    public class HelloImpl extends UnicastRemoteObject implements Hello {

        /**
         * seria id
         
    */
        private static final long serialVersionUID = -7931720891757437009L;

        protected HelloImpl() throws RemoteException {
            super();
        }

        /**
         * hello實(shí)現(xiàn)
         * 
         * 
    @return hello world
         * 
    @throws RemoteException
         
    */
        public String hello() throws RemoteException {
            return "hello world";
        }

    }

           3)創(chuàng)建服務(wù)器端
            package com.gewara.rmi;

    import java.rmi.Naming;
    import java.rmi.registry.LocateRegistry;

    public class Server {
        
        private static final String RMI_URL="rmi://192.168.2.89:10009/server";
        
        /**
         * RMI Server
         
    */
        public Server() {  
            try {  
                //創(chuàng)建遠(yuǎn)程對(duì)象
                Hello hello=new HelloImpl();
                
                //啟動(dòng)注冊(cè)表
                LocateRegistry.createRegistry(10009);
                
                //將名稱綁定到對(duì)象
                Naming.bind(RMI_URL, hello);
                
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }  
        
        /**
         * 
    @param args
         
    */
        public static void main(String[] args) {
            new Server();

        }

    }

            4)創(chuàng)建客服端
            package com.gewara.rmi;

    import java.rmi.Naming;

    public class Client {

        private static final String RMI_URL="rmi://192.168.2.89:10009/server";
        /**
         * 
    @param args
         
    */
        public static void main(String[] args) {
             try {  
                       String result=((Hello)Naming.lookup(RMI_URL)).hello();
                    System.out.println(result);  
                } catch (Exception e) {  
                    e.printStackTrace();  
                }  
        }

    }

        5)先啟動(dòng)服務(wù)器端,然后再啟動(dòng)客戶端
           顯示結(jié)果:hello world

    由于涉及到的內(nèi)容比較多,打算每一篇里講一個(gè)遠(yuǎn)程通訊框架,繼續(xù)詳解RMI
        
    三:詳解RMI內(nèi)部原理
    1. RMI基本結(jié)構(gòu):包含兩個(gè)獨(dú)立的程序,服務(wù)器和客戶端,服務(wù)器創(chuàng)建多個(gè)遠(yuǎn)程對(duì)象,讓遠(yuǎn)程對(duì)象能夠被引用,等待客戶端調(diào)用這些遠(yuǎn)程對(duì)象的方法。客戶端從服務(wù)器獲取到一個(gè)或則多個(gè)遠(yuǎn)程對(duì)象的引用,然后調(diào)用遠(yuǎn)程對(duì)象方法,主要涉及到RMI接口、回調(diào)等技術(shù)。

    2.RMI回調(diào):服務(wù)器提供遠(yuǎn)程對(duì)象引用供客戶端調(diào)用,客戶端主動(dòng)調(diào)用服務(wù)器,如果服務(wù)器主動(dòng)打算調(diào)用客戶端,這就叫回調(diào)。

    3.命名遠(yuǎn)程對(duì)象:客戶端通過一個(gè)命名或則一個(gè)查找服務(wù)找到遠(yuǎn)程服務(wù),遠(yuǎn)程服務(wù)包含Java的命名和查找接口(Java Naming and Directory Interface)JNDI
    RMI提供了一種服務(wù):RMI注冊(cè)rmiregistry,默認(rèn)端口:1099,主機(jī)提供遠(yuǎn)程服務(wù),接受服務(wù),啟動(dòng)注冊(cè)服務(wù)的命令:start rmiregistry
    客戶端使用一個(gè)靜態(tài)類Naming到達(dá)RMI注冊(cè)處,通過方法lookup()方法,客戶來詢問注冊(cè)。

    posted on 2012-03-12 09:57 陳睿 閱讀(2291) 評(píng)論(2)  編輯  收藏 所屬分類: 底層架構(gòu)

    評(píng)論

    # re: 底層架構(gòu)-遠(yuǎn)程通訊[未登錄] 2012-03-13 13:38 tbw

    恩 不錯(cuò)的   回復(fù)  更多評(píng)論   

    # re: 底層架構(gòu)-遠(yuǎn)程通訊 2012-03-22 14:06 allenny

    Mina算不上吧;JNDI這種東西都過時(shí)了  回復(fù)  更多評(píng)論   


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     

    導(dǎo)航

    <2012年3月>
    26272829123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    統(tǒng)計(jì)

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲精品在线免费看| 精品国产亚洲AV麻豆| 亚洲沟沟美女亚洲沟沟| 亚洲va久久久噜噜噜久久男同| 国产亚洲人成无码网在线观看| 在线精品亚洲一区二区小说| 亚洲美女又黄又爽在线观看| 亚洲人成网7777777国产| 亚洲精品乱码久久久久久蜜桃不卡| 亚洲欧洲国产成人综合在线观看 | 四虎影视在线影院在线观看免费视频 | 国国内清清草原免费视频99| 四虎1515hh永久久免费| 国国内清清草原免费视频99| 皇色在线视频免费网站| 成人在线免费观看| 午夜国产大片免费观看| 亚洲AV无码一区二区三区在线观看 | 国产 亚洲 中文在线 字幕| 亚洲国产精品一区二区三区在线观看| 亚洲综合激情五月丁香六月 | 四虎永久成人免费| 久久久久亚洲爆乳少妇无 | 青娱分类视频精品免费2| 无码免费午夜福利片在线| 国产无遮挡裸体免费视频| 亚洲国产小视频精品久久久三级 | 国产香蕉九九久久精品免费| 国产精品久久免费视频| 免费国产人做人视频在线观看| 亚洲国产aⅴ综合网| 亚洲AV无码久久精品蜜桃| 亚洲欧洲国产精品久久| 亚洲精品美女久久7777777| 在线看亚洲十八禁网站| 曰批全过程免费视频在线观看无码 | 亚洲成a人片77777老司机| 国产成+人+综合+亚洲专| 美女扒开屁股让男人桶爽免费| 国产精品极品美女自在线观看免费| 精品四虎免费观看国产高清午夜|