天天看點

RMI 和 Socket 差別簡介

RMI 簡介

RMI是Java的一組擁護開發分布式應用程式的API。RMI 使用Java語言接口定義了遠端對象,它集合了Java序列化和Java遠端方法協定(Java Remote Method Protocol)。簡單地說,這樣使原先的程式在同一作業系統的方法調用,變成了不同作業系統之間程式的方法調用,由于J2EE是分布式程式平台,它一 RMI機制實作程式元件在不同作業系統之間的通信。比如,一個EJB可以通過RMI調用Web上另一台機器上的EJB遠端方法。

  RMI(Remote Method Invocation,遠端方法調用)是用Java在JDK1.1中實作的,它大大增強了Java開發分布式應用的能力。Java作為一種風靡一時的網絡開發語言,其巨大的威力就展現在它強大的開發分布式網絡應用的能力上,而RMI就是開發百分之百純Java的網絡分布式應用系統的核心解決方案之一。其實它可以被看作是RPC的Java版本。但是傳統RPC并不能很好地應用于分布式對象系統。而Java RMI 則支援存儲于不同位址空間的程式級對象之間彼此進行通信,實作遠端對象之間的無縫遠端調用。

  RMI目前使用Java遠端消息交換協定JRMP(Java Remote Messaging Protocol)進行通信。JRMP是專為Java的遠端對象制定的協定。是以,Java RMI具有Java的“Write Once,Run Anywhere”的優點,是分布式應用系統的百分之百純Java解決方案。用Java RMI開發的應用系統可以部署在任何支援JRE(Java Run Environment Java,運作環境)的平台上。但由于JRMP是專為Java對象制定的,是以,RMI對于用非Java語言開發的應用系統的支援不足。不能與用非 Java語言書寫的對象進行通信。

  Java Remote Method Invocation ( RMI -- Java遠端方法調用)允許您使用Java編寫分布式對象。本文将介紹RMI的優點以及如何将其連接配接到現有的和原有的系統中,以及與用Java 編寫的元件的連接配接。

  RMI為采用Java對象的分布式計算提供了簡單而直接的途徑。這些對象可以是新的Java對象,也可以是圍繞現有API的簡單的Java包裝程式。Java展現了“編寫一次就能在任何地方運作的模式。而RMI可将Java模式進行擴充,使之可在任何地方運作”。

  因為RMI是以Java為核心的,是以,它将Java的安全性和可移植性等強大功能帶給了分布式計算。您可将代理和梢?務邏輯等屬性移動到網絡中最合适的地方。如果您要擴充Java在系統中的使用,RMI将使您充分利用其強大功能。

  RMI可利用标準Java本機方法接口JNI與現有的和原有的系統相連接配接。RMI還可利用标準JDBC包與現有的關系資料庫連接配接。RMI/JNI和 RMI/JDBC相結合,可幫助您利用RMI與目前使用非Java語言的現有伺服器進行通信,而且在您需要時可擴充Java在這些伺服器上的使用。RMI 可幫助您在擴充使用時充分利用Java的強大功能。 

RMI  的組成:

  一個正常工作的RMI系統由下面幾個部分組成:

  ·遠端服務的接口定義

  ·遠端服務接口的具體實作

  ·樁(Stub)和架構(Skeleton)檔案

  ·一個運作遠端服務的伺服器

  ·一個RMI命名服務,它允許用戶端去發現這個遠端服務

  ·類檔案的提供者(一個HTTP或者FTP伺服器)

  ·一個需要這個遠端服務的用戶端程式

socket簡介

Socket協定的形象描述

socket的英文原義是“孔”或“插座”。在這裡作為4BDS UNIX的程序通信機制,取後一種意義。socket非常類似于電話插座。以一個國家級電話網為例。電話的通話雙方相當于互相通信的2個程序,區号是它的網絡位址;區内一個機關的交換機相當于一台主機,主機配置設定給每個使用者的局内号碼相當于socket号。任何使用者在通話之前,首先要占有一部電話機,相當于申請一個socket;同時要知道對方的号碼,相當于對方有一個固定的socket。然後向對方撥号呼叫,相當于發出連接配接請求(假如對方不在同一區内,還要撥對方區号,相當于給出網絡位址)。對方假如在場并空閑(相當于通信的另一主機開機且可以接受連接配接請求),拿起電話話筒,雙方就可以正式通話,相當于連接配接成功。雙方通話的過程,是一方向電話機發出信号和對方從電話機接收信号的過程,相當于向socket發送資料和從socket接收資料。通話結束後,一方挂起電話機相當于關閉socket,撤消連接配接。

在電話系統中,一般使用者隻能感受到本地電話機和對方電話号碼的存在,建立通話的過程,話音傳輸的過程以及整個電話系統的技術細節對他都是透明的,這也與 socket機制非常相似。socket利用網間網通信設施實作程序通信,但它對通信設施的細節毫不關心,隻要通信設施能提供足夠的通信能力,它就滿足了。

至此,我們對socket進行了直覺的描述。抽象出來,socket實質上提供了程序通信的端點。程序通信之前,雙方首先必須各自建立一個端點,否則是沒有辦法建立聯系并互相通信的。正如打電話之前,雙方必須各自擁有一台電話機一樣。在網間網内部,每一個socket用一個半相關描述:

(協定,本地位址,本地端口)

一個完整的socket有一個本地唯一的socket号,由作業系統配置設定。

最重要的是,socket 是面向客戶/伺服器模型而設計的,針對客戶和伺服器程式提供不同的socket 系統調用。客戶随機申請一個socket (相當于一個想打電話的人可以在任何一台入網電話上撥号呼叫),系統為之配置設定一個socket号;伺服器擁有全局公認的 socket ,任何客戶都可以向它發出連接配接請求和資訊請求(相當于一個被呼叫的電話擁有一個呼叫方知道的電話号碼)。

socket利用客戶/伺服器模式巧妙地解決了程序之間建立通信連接配接的問題。伺服器socket 半相關為全局所公認非常重要。讀者不妨考慮一下,兩個完全随機的使用者程序之間如何建立通信?假如通信雙方沒有任何一方的socket 固定,就好比打電話的雙方彼此不知道對方的電話号碼,要通話是不可能的。

-----

Socket 接口是通路 Internet 使用得最廣泛的方法。如果你有一台剛配好TCP/IP協定的主機,其IP位址是202.120.127.201, 此時在另一台主機或同一台主機上執行ftp 202.120.127.201,顯然無法建立連接配接。因"202.120.127.201" 這台主機沒有運作FTP服務軟體。同樣,在另一台或同一台主機上運作浏覽軟體如Netscape,輸入"http://202.120.127.201",也無法建立連接配接。現在,如果在這台主機上運作一個FTP服務軟體(該軟體将打開一個Socket, 并将其綁定到21端口),再在這台主機上運作一個Web 服務軟體(該軟體将打開另一個Socket,并将其綁定到80端口)。這樣,在另一台主機或同一台主機上執行ftp 202.120.127.201,FTP客戶軟體将通過21端口來呼叫主機上由FTP 服務軟體提供的Socket,與其建立連接配接并對話。而在netscape中輸入"http://202.120.127.201"時,将通過80端口來呼叫主機上由Web服務軟體提供的Socket,與其建 立連接配接并對話。

在Internet上有很多這樣的主機,這些主機一般運作了多個服務軟體,同時提供幾種服務。每種服務都打開一個Socket,并綁定到一個端口上,不同的端口對應于不同的服務。Socket正如其英文原意那樣,象一個多孔插座。一台主機猶如布滿各種插座的房間,每個插座有一個編号,有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節目。 客戶軟體将插頭插到不同編号的插座,就可以得到不同的服務。

-----

1.什麼是socket 所謂socket通常也稱作"套接字",用于描述IP位址和端口,是一個通信鍊的句柄。應用程式通常通過"套接字"向網絡送出請求或者應答網絡請求。以J2SDK-1.3為例,Socket和ServerSocket類庫位于java.net包中。ServerSocket用于伺服器端,Socket 是建立網絡連接配接時使用的。在連接配接成功時,應用程式兩端都會産生一個Socket執行個體,操作這個執行個體,完成所需的會話。對于一個網絡連接配接來說,套接字是平等的,并沒有差别,不因為在伺服器端或在用戶端而産生不同級别。不管是Socket還是ServerSocket它們的工作都是通過SocketImpl類及其子類完成的。

重要的Socket API:java.net.Socket繼承于java.lang.Object,有八個構造器,其方法并不多,下面介紹使用最頻繁的三個方法,其它方法大家可以見JDK-1.3文檔。

Accept方法用于産生"阻塞",直到接受到一個連接配接,并且傳回一個用戶端的Socket對象執行個體。"阻塞"是一個術語,它使程式運作暫時"停留"在這個地方,直到一個會話産生,然後程式繼續;通常"阻塞"是由循環産生的。

getInputStream方法獲得網絡連接配接輸入,同時傳回一個IutputStream對象執行個體。

getOutputStream方法連接配接的另一端将得到輸入,同時傳回一個OutputStream對象執行個體。注意:其中getInputStream和getOutputStream方法均會産生一個IOException,它必須被捕獲,因為它們傳回的流對象,通常都會被另一個流對象使用。

2.如何開發一個Server-Client模型的程式 開發原理:

伺服器,使用ServerSocket監聽指定的端口,端口可以随意指定(由于1024以下的端口通常屬于保留端口,在一些作業系統中不可以随意使用,是以建議使用大于1024的端口),等待客戶連接配接請求,客戶連接配接後,會話産生;在完成會話後,關閉連接配接。

用戶端,使用Socket對網絡上某一個伺服器的某一個端口發出連接配接請求,一旦連接配接成功,打開會話;會話完成後,關閉Socket。用戶端不需要指定打開的端口,通常臨時的、動态的配置設定一個1024以上的端口。

Socket接口是TCP/IP網絡的API,Socket接口定義了許多函數或例程,程式員可以用它們來開發TCP/IP網絡上的應用程式。要學 Internet上的TCP/IP網絡程式設計,必須了解Socket接口。 Socket接口設計者最先是将接口放在Unix作業系統裡面的。如果了解Unix系統的輸入和輸出的話,就很容易了解Socket了。網絡的 Socket資料傳輸是一種特殊的I/O,Socket也是一種檔案描述符。Socket也具有一個類似于打開檔案的函數調用Socket(),該函數傳回一個整型的Socket描述符,随後的連接配接建立、資料傳輸等操作都是通過該Socket實作的。

常用的Socket類型有兩種:流式Socket(SOCK_STREAM)和資料報式Socket(SOCK_DGRAM)。流式是一種面向連接配接的 Socket,針對于面向連接配接的TCP服務應用;資料報式Socket是一種無連接配接的Socket,對應于無連接配接的UDP服務應用。 Socket建立為了建立Socket,程式可以調用Socket函數,該函數傳回一個類似于檔案描述符的句柄。socket函數原型為:int socket(int domain, int type, int protocol);domain指明所使用的協定族,通常為PF_INET,表示網際網路協定族(TCP/IP協定族);type參數指定socket的類型:SOCK_STREAM 或SOCK_DGRAM,Socket接口還定義了原始Socket(SOCK_RAW),允許程式使用低層協定;protocol通常指派"0"。 Socket()調用傳回一個整型socket描述符,你可以在後面的調用使用它。 Socket描述符是一個指向内部資料結構的指針,它指向描述符表入口。調用Socket函數時,socket執行體将建立一個Socket,實際上"建立一個Socket"意味着為一個Socket資料結構配置設定存儲空間。 Socket執行體為你管理描述符表。兩個網絡程式之間的一個網絡連接配接包括五種資訊:通信協定、本地協定位址、本地主機端口、遠端主機位址和遠端協定端口。Socket資料結構中包含這五種資訊。 socket在測量軟體中的使用也很廣泛.

效率對比

socket的效率要高于rmi,

socket是通過套接流的直接讀寫方式,隻經過傳輸層。

rmi經過傳輸層 〉〉應用層有專門rmi服務做解析 生成遠端對象。