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

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

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

    底層架構-遠程通訊

    一:基本原理
        主要是要實現網絡之間的通訊,網絡通信需要做的就是將流從一臺計算機傳輸到另外一臺計算機,基于傳輸協議和網絡IO來實現,其中傳輸協議比較出名的有http、 tcp、udp等等,http、tcp、udp都是在基于Socket概念上為某類應用場景而擴展出的傳輸協議,網絡IO,主要有bio、nio、aio 三種方式,所有的分布式應用通訊都基于這個原理而實現。

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

         RMI應用級協議內容:
    1、傳輸的標準格式是什么?
          是Java ObjectStream。
    2、怎么樣將請求轉化為傳輸的流?
          基于Java串行化機制將請求的java object信息轉化為流。
    3、怎么接收和處理流?
          根據采用的協議啟動相應的監聽端口,當有流進入后基于Java串行化機制將流進行反序列化,并根據RMI協議獲取到相應的處理對象信息,進行調用并處理,處理完畢后的結果同樣基于java串行化機制進行返回。
    4、傳輸協議是?
          tcp/ip。

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

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

    /**
     * 遠程接口實現
     * 
     * 
    @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實現
         * 
         * 
    @return hello world
         * 
    @throws RemoteException
         
    */
        public String hello() throws RemoteException {
            return "hello world";
        }

    }

           3)創建服務器端
            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 {  
                //創建遠程對象
                Hello hello=new HelloImpl();
                
                //啟動注冊表
                LocateRegistry.createRegistry(10009);
                
                //將名稱綁定到對象
                Naming.bind(RMI_URL, hello);
                
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }  
        
        /**
         * 
    @param args
         
    */
        public static void main(String[] args) {
            new Server();

        }

    }

            4)創建客服端
            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)先啟動服務器端,然后再啟動客戶端
           顯示結果:hello world

    由于涉及到的內容比較多,打算每一篇里講一個遠程通訊框架,繼續詳解RMI
        
    三:詳解RMI內部原理
    1. RMI基本結構:包含兩個獨立的程序,服務器和客戶端,服務器創建多個遠程對象,讓遠程對象能夠被引用,等待客戶端調用這些遠程對象的方法。客戶端從服務器獲取到一個或則多個遠程對象的引用,然后調用遠程對象方法,主要涉及到RMI接口、回調等技術。

    2.RMI回調:服務器提供遠程對象引用供客戶端調用,客戶端主動調用服務器,如果服務器主動打算調用客戶端,這就叫回調。

    3.命名遠程對象:客戶端通過一個命名或則一個查找服務找到遠程服務,遠程服務包含Java的命名和查找接口(Java Naming and Directory Interface)JNDI
    RMI提供了一種服務:RMI注冊rmiregistry,默認端口:1099,主機提供遠程服務,接受服務,啟動注冊服務的命令:start rmiregistry
    客戶端使用一個靜態類Naming到達RMI注冊處,通過方法lookup()方法,客戶來詢問注冊。

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

    評論

    # re: 底層架構-遠程通訊[未登錄] 2012-03-13 13:38 tbw

    恩 不錯的   回復  更多評論   

    # re: 底層架構-遠程通訊 2012-03-22 14:06 allenny

    Mina算不上吧;JNDI這種東西都過時了  回復  更多評論   


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

    導航

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

    統計

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲va久久久噜噜噜久久男同| 国产亚洲人成网站在线观看| 亚洲综合在线观看视频| 抽搐一进一出gif免费视频| 国产黄色一级毛片亚洲黄片大全| 久久精品熟女亚洲av麻豆| 国产成人无码区免费A∨视频网站| 亚洲人成自拍网站在线观看| 日本无卡码免费一区二区三区| 国产AV无码专区亚洲AV麻豆丫| 国产乱人免费视频| 四虎影视久久久免费| 亚洲中文字幕久久精品无码喷水| 中国一级特黄高清免费的大片中国一级黄色片| 7x7x7x免费在线观看| 亚洲天堂一区二区三区| 女人张腿给男人桶视频免费版 | 久久精品亚洲综合专区| 91精品国产免费久久国语麻豆| 亚洲国产精品国自产拍电影| 99久久99这里只有免费费精品| 亚洲欧美国产国产综合一区| 日产国产精品亚洲系列| 国产无遮挡又黄又爽免费网站| 久久久久亚洲av无码尤物| 国产香蕉免费精品视频| 国产AV无码专区亚洲AV琪琪| 亚洲自偷自偷图片| 免费不卡视频一卡二卡| 免费的黄色的网站| 亚洲伦另类中文字幕| 日本高清免费aaaaa大片视频| 久久嫩草影院免费看夜色| 亚洲一区二区影院| 国产精品va无码免费麻豆| 三年片在线观看免费| 亚洲免费福利在线视频| 亚洲色精品vr一区二区三区| 免费三级毛片电影片| 国产精品福利在线观看免费不卡| 亚洲欧洲在线播放|