freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

分布式軟件體系結(jié)構(gòu)(編輯修改稿)

2025-07-21 07:39 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 并作為參數(shù)向服務(wù)程序發(fā)出查詢請(qǐng)求,然后將服務(wù)程序返回的查詢結(jié)果顯示給終端用戶瀏覽。 客戶程序與服務(wù)程序可利用socket進(jìn)行通信,socket在TCP/IP網(wǎng)絡(luò)中是一種很原始、高效率的通信方式,但要求客戶程序與服務(wù)程序自己處理交換消息的編碼與解碼工作,即程序員必須自定義客戶程序與服務(wù)程序之間的應(yīng)用層通信協(xié)議,這不僅需要花費(fèi)大量的編程時(shí)間(例如必須考慮連接控制、錯(cuò)誤恢復(fù)、如何通過(guò)防火墻等問題),同時(shí)也比較容易產(chǎn)生錯(cuò)誤。一種更好的通信方式是使用遠(yuǎn)程過(guò)程調(diào)用(RPC),它將客戶程序與服務(wù)程序之間的通信接口抽象為過(guò)程調(diào)用層次,程序員可像調(diào)用本地過(guò)程一樣去調(diào)用遠(yuǎn)程過(guò)程,由RPC系統(tǒng)完成參數(shù)與返回值的打包、解包與傳輸?shù)鹊讓尤蝿?wù)。但使用RPC不能平滑地與面向?qū)ο蠹夹g(shù)結(jié)合在一起。本小節(jié)的例子程序采用了抽象層次更高的遠(yuǎn)程方法調(diào)用(RMI)。RMI是支持多層分布式對(duì)象計(jì)算的一系列Java類,使得Java應(yīng)用程序員無(wú)需額外的程序設(shè)計(jì)工作即可實(shí)現(xiàn)客戶程序與服務(wù)程序之間的連接與通信,在客戶程序中可以像使用本地對(duì)象一樣調(diào)用服務(wù)程序中遠(yuǎn)程對(duì)象的方法。 遠(yuǎn)程方法調(diào)用RMI可看作一種簡(jiǎn)化的、專用于Java平臺(tái)的CORBA模型,由JDK 。RMI的服務(wù)程序通常是一個(gè)Java應(yīng)用程序,而客戶程序既可以是一個(gè)Java應(yīng)用程序,也可以是一個(gè)Java Applet。RMI注冊(cè)表rmiregistry是運(yùn)行在服務(wù)器上的一個(gè)后臺(tái)進(jìn)程,必須在服務(wù)程序啟動(dòng)之前就已啟動(dòng)完畢,它相當(dāng)于客戶程序與服務(wù)程序之間的通信網(wǎng)關(guān)。服務(wù)程序?qū)⑦h(yuǎn)程對(duì)象的名字注冊(cè)到RMI注冊(cè)表,客戶程序通過(guò)RMI注冊(cè)表將遠(yuǎn)程對(duì)象名字解析為遠(yuǎn)程對(duì)象引用,通過(guò)該對(duì)象引用調(diào)用遠(yuǎn)程對(duì)象上的方法。RMI體系結(jié)構(gòu)采用典型的層次設(shè)計(jì)風(fēng)格,從上至下分別由樁/框架層、遠(yuǎn)程引用層和傳輸層組成,各層之間明確定義了接口與協(xié)議。 應(yīng)用程序 客戶程序 服務(wù)程序 RMI系統(tǒng) 樁 框 架遠(yuǎn) 程 引 用 層傳 輸 層 遠(yuǎn)程方法調(diào)用(RMI)體系結(jié)構(gòu)RMI系統(tǒng)采用類似CORBA的請(qǐng)求代理機(jī)制,樁(stub)是遠(yuǎn)程對(duì)象在客戶端的代理,客戶程序中的遠(yuǎn)程對(duì)象引用實(shí)際上是對(duì)本地樁的引用。樁負(fù)責(zé)將遠(yuǎn)程調(diào)用請(qǐng)求通過(guò)遠(yuǎn)程引用層轉(zhuǎn)發(fā)給服務(wù)端的框架(skeleton),再由服務(wù)端的框架分派給真正的遠(yuǎn)程對(duì)象實(shí)現(xiàn)。創(chuàng)建應(yīng)用程序時(shí),客戶程序與服務(wù)程序都需要樁,而框架僅服務(wù)程序需要。遠(yuǎn)程引用層完成調(diào)用的語(yǔ)義,例如決定服務(wù)程序的對(duì)象是單個(gè)對(duì)象,還是需要與多個(gè)位置進(jìn)行通信的復(fù)制對(duì)象,這些語(yǔ)義由遠(yuǎn)程對(duì)象的實(shí)現(xiàn)提供。遠(yuǎn)程引用層還為上一層屏蔽了服務(wù)程序的激活方式,即樁/框架層不必關(guān)心提供遠(yuǎn)程對(duì)象的服務(wù)程序是一直在同一機(jī)器上運(yùn)行,還是僅在有方法調(diào)用時(shí)才被激活(JDK )。傳輸層負(fù)責(zé)建立與管理連接,跟蹤遠(yuǎn)程對(duì)象,以及將調(diào)用請(qǐng)求分派給合適對(duì)象。在服務(wù)端,傳輸層將調(diào)用請(qǐng)求向上轉(zhuǎn)發(fā)給遠(yuǎn)程引用層,遠(yuǎn)程引用層作相應(yīng)處理后轉(zhuǎn)發(fā)給框架,由框架向上調(diào)用遠(yuǎn)程對(duì)象的實(shí)現(xiàn),由遠(yuǎn)程對(duì)象的實(shí)現(xiàn)完成真正的方法調(diào)用。遠(yuǎn)程調(diào)用的返回值送回客戶端的路線是:首先經(jīng)過(guò)服務(wù)端的框架、遠(yuǎn)程引用層和傳輸層,再向上經(jīng)過(guò)客戶端的傳輸層、遠(yuǎn)程引用層和樁。RMI在樁/框架層利用了兩種關(guān)鍵技術(shù)。首先,Java語(yǔ)言專用的對(duì)象串行化技術(shù)可將對(duì)象透明地傳送到不同地址空間,樁與框架利用對(duì)象串行化技術(shù)打包(marshal)與解包(unmarshal)遠(yuǎn)程調(diào)用的參數(shù)與返回值。其次,動(dòng)態(tài)類裝載技術(shù)用于支持將客戶端的樁作為遠(yuǎn)程對(duì)象本身,樁實(shí)現(xiàn)了相同的遠(yuǎn)程接口集合,從而支持Java語(yǔ)言的類型檢查與類型轉(zhuǎn)換機(jī)制。 接口定義一個(gè)基于RMI的多層模型分布式應(yīng)用程序通常包括以下幾部分:①遠(yuǎn)程接口,規(guī)定了客戶程序與服務(wù)程序進(jìn)行交互的界面;②遠(yuǎn)程對(duì)象實(shí)現(xiàn),為遠(yuǎn)程接口規(guī)定的每一個(gè)方法提供真正的實(shí)現(xiàn);③服務(wù)程序,遠(yuǎn)程對(duì)象并不是服務(wù)程序本身,它需要由服務(wù)程序創(chuàng)建并注冊(cè),服務(wù)程序中的這些真正提供服務(wù)的對(duì)象實(shí)例又稱伺服對(duì)象(servant);④客戶程序,利用服務(wù)程序中伺服對(duì)象提供的服務(wù)完成某一功能。其中,遠(yuǎn)程接口是編寫服務(wù)程序與客戶程序之前需要首先考慮的問題。Java提供了接口與類兩種機(jī)制:接口不含數(shù)據(jù)表示方法與操作的具體實(shí)現(xiàn),因而適用于定義對(duì)象的規(guī)格說(shuō)明(specification),一個(gè)接口可以同時(shí)繼承多個(gè)接口;類給出了數(shù)據(jù)表示方法與操作實(shí)現(xiàn),因而適用于定義對(duì)象的實(shí)現(xiàn)(implementation),僅支持對(duì)類的單繼承。所有遠(yuǎn)程對(duì)象的接口都使用接口來(lái)定義,,因?yàn)榫W(wǎng)絡(luò)通信或服務(wù)程序等原因均可能導(dǎo)致遠(yuǎn)程調(diào)用失敗。程序11給出了例子程序中通話記錄管理器的遠(yuǎn)程接口定義。程序11 // 通話記錄管理器CallManager的遠(yuǎn)程接口package Telephone。public interface CallManagerInterface extends { // 根據(jù)電話用戶名字查詢通話記錄。 // 參數(shù): subscriber 電話用戶的名字 public getCallHistory(String subscriber) throws 。} 服務(wù)端程序程序12定義的類CallManager為遠(yuǎn)程接口CallManagerInterface中的每一個(gè)遠(yuǎn)程方法提供了具體實(shí)現(xiàn)。為防止多個(gè)客戶程序并發(fā)地調(diào)用數(shù)據(jù)庫(kù)查詢操作,方法getCallHistory()被定義為同步方法。程序13所示ServerApplication是服務(wù)程序的主程序,它必須首先裝入安全管理器,用于保證動(dòng)態(tài)裝載的類不會(huì)執(zhí)行某些敏感操作,如果未指定安全管理器則不允許裝入任何RMI類。程序12 // 通話記錄管理器(即遠(yuǎn)程接口CallManagerInterface的實(shí)現(xiàn))package Telephone。public class CallManager extends implements CallManagerInterface{ // 屬性定義 protected database。 // 缺省構(gòu)造方法,必須拋出RemoteException異常。 public CallManager() throws { database = new ()。 } // 根據(jù)電話用戶名字subscriber查詢通話記錄,實(shí)現(xiàn)遠(yuǎn)程接口指定的方法。 public synchronized getCallHistory(String subscriber) throws { String sql = 。 // SQL查詢語(yǔ)句 table = null。 // 返回的二維表模型 (Respond to client request: + subscriber)。 try { sql = QueryCallHistoryWithSubscriber(39。 + subscriber + 39。)。 rs = (sql)。 table = new (rs)。 ()。 } catch( exc) { (())。 (1)。 } return table。 }}程序13 // 服務(wù)程序的主程序public class ServerApplication{ final static String JDBC_DRIVER = 。 public static void main(String args[]) { // 為RMI設(shè)置安全管理器 (new ())。 // 加載JDBC驅(qū)動(dòng)程序 try { (JDBC_DRIVER)。 } catch(ClassNotFoundException exc) { (())。 (1)。 } // 創(chuàng)建并注冊(cè)伺服對(duì)象 try { // 創(chuàng)建伺服對(duì)象 callManager = new ()。 // 用名字CallManagerServant001注冊(cè)伺服對(duì)象 (CallManagerServant001, callManager)。 } catch( exc) { (())。 (1)。 } catch( exc) { (())。 (1)。 } // 提示服務(wù)程序就緒 (Call manager in the server is ready ...)。 }}程序14定義的DatabaseAccess類與程序15定義的DatabaseTableModel類均用于抽象JDBC訪問數(shù)據(jù)庫(kù)的行為,在實(shí)際應(yīng)用中我們通常會(huì)設(shè)計(jì)更完善、更個(gè)性化的數(shù)據(jù)庫(kù)訪問程序包來(lái)包裝JDBC的API。DatabaseAccess主要用于管理服務(wù)程序與數(shù)據(jù)庫(kù)的連接,并完成數(shù)據(jù)庫(kù)的查詢與更新操作。DatabaseTableModel負(fù)責(zé)將數(shù)據(jù)庫(kù)查詢結(jié)果轉(zhuǎn)換為二維表數(shù)據(jù)模型的形式,方便利用Swing的二維表控件顯示查詢結(jié)果。在基于關(guān)系數(shù)據(jù)庫(kù)的應(yīng)用中,二維表控件是最常用的數(shù)據(jù)表達(dá)方式,對(duì)于某些具有層次結(jié)構(gòu)的數(shù)據(jù)則以樹控件表達(dá)會(huì)更加自然。程序14 // 實(shí)現(xiàn)JDBC與數(shù)據(jù)庫(kù)的連接package Database。import .*。public class DatabaseAccess{ // 常量定義 protected final String DATABASE_NAME = jdbc:odbc:Telephone。 // 屬性定義 protected Connection connection。 // 為數(shù)據(jù)庫(kù)建立的連接 protected Statement statement。 // 將執(zhí)行的SQL語(yǔ)句 protected CallableStatement callable。 // 將調(diào)用的SQL存儲(chǔ)過(guò)程語(yǔ)句 // 行為定義 // 構(gòu)造方法,建立與數(shù)據(jù)庫(kù)的連接。 public DatabaseAccess() { try { // 建立與指定數(shù)據(jù)庫(kù)的連接 connection = (DATABASE_NAME)。 // 如果連接成功則檢測(cè)是否有警告信息 SQLWarning warn = ()。 while (warn != null) { (())。 warn = ()。 } // 創(chuàng)建一個(gè)用于執(zhí)行SQL的語(yǔ)句 statement = ()。 callable = null。 } catch(SQLException exc) { (())。 (1)。 } } // 析構(gòu)方法,撤銷與數(shù)據(jù)庫(kù)的連接。 public synchronized void finalize() { try { ()。 } catch(SQLException exc) { (())。 (1)。 } } // 利用存儲(chǔ)過(guò)程執(zhí)行數(shù)據(jù)庫(kù)查詢操作。 // 參數(shù): procedure 存儲(chǔ)過(guò)程名字 // 返回: 查詢結(jié)果集 public synchronized ResultSet callQuery(String procedure) throws SQLException { callable = ({call + procedure + })。 ResultSet rs = ()。 return rs。 }}程序15 // 根據(jù)數(shù)據(jù)庫(kù)查詢結(jié)果構(gòu)造供JTable控件使用的二維表數(shù)據(jù)模型package Database。import .*。import .*。import 。public class DatabaseTableModel extends { // 屬性定義 protected String[] titles。 // 列標(biāo)題 protected int[] types。 // 各列的數(shù)據(jù)類型 protected Vector data。 // 二維表的數(shù)據(jù)
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1