版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
中間件技術
————MiddlewareTechnology聯(lián)系方式鹿旭東Dongxul@.c算機軟件工程系先修課程面向對象技術Java語言程序設計軟件工程內容簡介
中間件已經成為構建網絡分布式異構信息系統(tǒng)不可缺少的關鍵技術,與操作系統(tǒng)、數據庫管理系統(tǒng)并列為基礎軟件體系的三大支柱。本課程將闡述中間件產生的背景,中間件概念、定義及發(fā)展情況,中間件的功能、作用、特點、分類、優(yōu)越性、面臨的問題及發(fā)展趨勢。將以OMG組織的CORBA和Sun公司的EJB規(guī)范為例,闡述中間件基本框架、工作原理和實現的關鍵技術。并介紹當前技術及相應框架。
計算:從集中到分布計算模式的發(fā)展集中式計算模式桌面計算模式分布式計算模式軟件設計的基本思想(1)隱式地(implicitly)與顯式地(explicitly)兩種不同的支持方式對面向對象設計的支持對異常的支持對象約束的支持底層支持來解決分布式軟件的復雜性邏輯的(logical)與物理的(physical)不同的抽象層次抽象定義源于對復雜控制性的不足目的是在更高層次上掌握各種機制軟件設計的基本思想(2)面向對象技術本質上是一個建模過程封裝、繼承、多態(tài)性有機融合分布式和面向對象技術RPC和RMICorbaEJBDCOM軟件體系結構從體系結構角度探討分布式軟件系統(tǒng)的有關問題分布式系統(tǒng)應用一些典型的商務應用系統(tǒng):股票交易系統(tǒng)銀行應用系統(tǒng)客戶電話中心系統(tǒng)采購系統(tǒng)這些系統(tǒng)都應是分布式系統(tǒng)現代應用系統(tǒng)的基本特征分布任務已不只是在單機上運行,而是由網絡中多臺計算機上的相關應用共同協(xié)作完成,需考慮網絡傳輸、數據安全、數據一致性、同步等諸多問題;異構計算機硬件、操作系統(tǒng)、網絡協(xié)議、數據庫系統(tǒng)以及開發(fā)工具種類繁多,需考慮數據表示、調用接口、處理方式等諸多問題;動態(tài)協(xié)作參與協(xié)作的應用允許位置透明性、遷移透明性、負載平衡性等需求。傳統(tǒng)的Client/Server結構數據庫ClientClientClient數據庫服務器服務器(數據)層客戶層客戶向服務器請求數據庫服務廣義的C/S體系結構信息提供和請求服務過程式程序設計中的過程調用接口(interface、規(guī)格說明)通信協(xié)議(參數傳遞風格)分布式程序一般是C/S結構的,重要的是接口和通信協(xié)議,此外還有可靠性、安全性、性能等因素2層結構的缺陷2層結構存在很多缺陷:客戶端的負擔仍比較重仍然需要客戶端進行較復雜的數據處理客戶端的可移植性不好處理復雜必然牽涉更多的移植性問題每個客戶端上都要安裝數據庫驅動程序系統(tǒng)的可維護性不好客戶端包含過多的商業(yè)邏輯商業(yè)邏輯與人機交互界面交織在一起數據的安全性需求:需要更合理的工作分配——3層或多層結構典型的3層結構數據庫ClientClientClient數據庫服務器服務器(數據)層中間層中間層服務器向數據庫服務器請求中間層應用程序中間層客戶層客戶向中間層服務器請求3層結構的優(yōu)點(1of2)除了更合理的分配任務外,3層結構還具有如下優(yōu)點:將業(yè)務邏輯放置在中間層可以提高系統(tǒng)的性能,使中間層的業(yè)務邏輯處理與數據層的業(yè)務數據緊密結合在一起,而無需考慮客戶的具體位置。添加新的中間層服務器能夠滿足新增客戶機的需求,可以大大提高3層系統(tǒng)的可伸縮性。將業(yè)務邏輯從客戶端移到中間層,在客戶層的應用程序與數據層的數據庫之間增加了一層,這樣客戶端的應用程序可以獨立于數據層的數據庫。3層結構的優(yōu)點(2of2)將業(yè)務邏輯致于中間層,從而使業(yè)務邏輯集中到一處。而在2層方式下,業(yè)務邏輯被分散到所有的客戶機上(除非使用存儲過程)。這樣做是不可取的,因為業(yè)務規(guī)則是動態(tài)變化的,而對于這些業(yè)務而言,規(guī)范又是強制性的,所以,將業(yè)務邏輯分散到整個客戶層的客戶機上會使實施過程變得非常困難。大量的中間層中間件平臺提供豐富的系統(tǒng)級服務,使得開發(fā)人員可以以更少的工作量開發(fā)出更復雜、可靠、高效的軟件系統(tǒng)。N層結構在3層結構中,客戶層和數據層已被嚴格定義,但中間層并未明確定義。中間層可以包括所有與應用程序的界面和持久數據存儲無關的處理。假定將中間層劃分成許多服務程序是符合邏輯的,那么將每一主要服務都視為獨立的層,則3層結構就成為了n層結構。如中間層可以分為實現任務分配機制和界面呈現的Web服務器層和實現實際商業(yè)邏輯的EJB層。多層結構問題分布異構環(huán)境中,通常存在:多種硬件系統(tǒng)平臺,各種各樣的系統(tǒng)軟件,多種風格各異的用戶界面,不同的網絡協(xié)議和網絡體系結構連接。中間件的理解AnextensionoftheOSwhichprovidesatransparentcommunicationlayertotheapplications(操作系統(tǒng)的擴展-透明的通訊)Thegluewhichconnectsobjectswhicharedistributedacrossmultipleheterogeneouscomputersystems(膠水-連接(管理)組件)位于操作系統(tǒng)和應用軟件之間的一個軟件層,向各種應用軟件提供服務,使不同的應用進程能在屏蔽掉平臺差異的情況下,通過網絡互通信息。發(fā)展:通訊-服務-領域解決方案定義中間件是介于應用系統(tǒng)和系統(tǒng)軟件之間的一類軟件它使用系統(tǒng)軟件所提供的基礎服務(功能),銜接網絡上應用系統(tǒng)的各個部分或不同的應用,能夠達到資源共享、功能共享的目的中間件的特性易用性位置透明性:應用不必知道對方網絡和應用的地址;不經重新編譯,就可把一個應用從一臺機器上轉移到另一臺機器消息傳輸的完整性:消息不應丟失或重復消息格式的完整性:消息格式不應被破壞語言透明性:使用中間件的程序應能與另一個用不同語言編寫的程序通信;如果用不同語言重寫一個程序,其他程序應不受影響中間件分類遠程過程中間件:RemoteProcedureCall,RPC消息中間件:Message-OrientedMiddleware(MOM)面向對象中間件:Object-OrientedMiddleware事務處理中間件(TPMonitor)數據庫中間件其他分類:如安全中間件、網絡中間件、防病毒中間件等遠程過程調用中間件在傳統(tǒng)的編程概念中,過程是由程序員在本地編譯完成,并只能局限在本地運行的一段代碼,也就是說主程序和過程之間的運行關系是本地調用關系。這種結構在網絡日益發(fā)展的今天已無法適應實際需求。其調用模式無法充分利用網絡上其他主機的資源(如計算資源、存儲資源、數據資源、顯示資源等),也無法提高代碼在實體間的共享程度,使得主機資源大量浪費。本地過程調用的擴展,可透明地調用遠地提供的服務數據表示、可靠傳遞、服務定位等分布式計算環(huán)境,DCEMsRPC消息中間件(1)動機:RPC調用的缺點(1)客戶端與服務器端需要同時在線;(2)客戶端需要知道服務器端的調用接口,若調用接口發(fā)生改變,客戶端需要做相應變化,如通過ODBC連接訪問數據庫,客戶端需要知道遠程數據庫的類型,若類型發(fā)生改變,還需要重新裝載相應的驅動程序。(3)操作過程中需要一直保持與服務器端的連接,直到操作結束。因而,(a)一旦連接中斷,就意味著操作失敗或數據丟失;(b)通常判斷連接中斷的時間較長,若信道的可靠性較差,容易造成連接中斷,那么應用效率將嚴重低下; (c)服務器端在執(zhí)行操作的過程中,并不涉及網上數據傳輸,但連接的保持占用信道,容易造成網絡堵塞。消息中間件(2)這個問題可用消息中間件來解決,應用間通過傳遞消息來進行協(xié)作,是一種異步通信模式主要功能是在不同的網絡協(xié)議、不同的操作系統(tǒng)和不同的應用程序之間提供可靠的和可恢復的(若發(fā)生意外)消息傳送。工作原理:應用之間以一系列消息的方式進行通信。在消息傳遞過程中,為了避免消息被丟失,消息被保存在消息隊列中。應用把消息發(fā)送到與接收者有關的隊列中。消息傳遞機制保證將消息傳送到目的地且只傳送一次。在消息傳遞過程中,應用之間不必建立聯(lián)系,發(fā)送者僅需將消息放入到與接收者有關的隊列中,而不必關心接收者是否在線。接收者僅需從自己的隊列中提取消息即可。IBM的MQSeries、Microsoft的MSMQ、東方通的TongLink/Q、BEA的MessageQ事務處理中間件也稱為交易中間件常見功能全局事務協(xié)調事務的分布式兩階段提交資源管理器支持故障恢復負載平衡產品:Bea的Tuxedo等數據庫中間件實現對來自不同廠家的數據庫的訪問屏蔽操作系統(tǒng)、網絡協(xié)議、數據庫平臺等的差異應用最廣泛、最成熟(1)通用網關接口CGI(駐留在WebServer上)(2)專用API:DLL形式
NSAPI(Netscape)ISAPI(Microsoft)(3)通用數據庫接口
JDBC(SUN)
ODBC(Microsoft)(4)數據庫引擎
Borland公司開發(fā),類似于ODBC,支持與數據庫的直接連接,效率較ODBC高(5)數據庫網關用于分布式應用環(huán)境,無需在客戶機進行各種配置,如安裝各種ODBC驅動、設置ODBC數據源等,使用網關來統(tǒng)一管理不同數據庫的訪問相關產品:EDA/SQL、RDA、DRDA對象在分布式環(huán)境中的表現傳統(tǒng)對象的關注點:封裝和通過繼承對實現進行重用。封裝提供了一種將對象實現細節(jié)與其他對象屏蔽開的嚴格方法,可以大大緩解在面向過程系統(tǒng)中較突出的維護問題。繼承提供了一種重用對象實現的簡便方法分布式環(huán)境要求更好的可插入性:不太關注于直接重用代碼,而是要求能夠利用遠程所實現的服務。要求另一層次上的封裝,只需暴露公用接口對象——〉組件組件的特性(1of2)組件是一個嚴格定義的可插入單元組件一般是基于對象實現的,但也可以不作為對象實現。組件將封裝運用到了極限組件通過封裝來隱藏組件的實現以達到:組件的實現語言是未知的:一個Java客戶不會感覺到所使用的組件是由C++實現的。組件的物理位置是未知的:一個VB客戶不會感覺到所使用的組件是運行在相同的進程內(使用DLL),還是在同一機器的不同進程內,甚至是位于不同機器上。組件的特性(2of2)組件通常在容器中進行管理:組件遵循所處的容器的規(guī)則,并按照標準的途徑向容器發(fā)送事件。組件可以從容器中獲得屬性或服務:例如,組件可以使用容器的背景色作為自己的背景色。組件允許對所支持的接口進行動態(tài)發(fā)現和調用:客戶程序可以在運行狀態(tài)下確定一個組件支持何種功能,然后調用該功能。組件化軟件系統(tǒng)的升級方式組件1組件2組件4組件3組件5組件6軟件系統(tǒng)版本1組件1‘組件2組件4組件3‘組件5組件6軟件系統(tǒng)版本1接口保持不變兩點說明組件不必是小的實體:組件不一定只是小的、可視化的東西,如VB控件面板的控件;一個大規(guī)模的、復雜組件例子就是IE內使用的HTML查看器。組件及其容器不一定是可視化的:組件可能完全不可視(實際上一個分布式系統(tǒng)中的大多數組件都是不可視的)并實現業(yè)務邏輯。服務的重要性除了通信協(xié)議外,組件還會用到一些可能很復雜,但又會經常重復使用的服務。如安全性管理、事務處理等。一個平臺或體系結構所顯式提供的服務越多,開發(fā)者就越容易在更短的時間內開發(fā)出高質量的分布式系統(tǒng)。有了平臺提供的服務,開發(fā)者可以將更多的精力集中于系統(tǒng)的商業(yè)邏輯。EJB是一個很好的例子常見的服務命名服務(Naming)在分布式系統(tǒng)中,命名服務提供了一種定位分布式對象的機制。監(jiān)視(Monitoring)監(jiān)視服務不僅可以監(jiān)視系統(tǒng)的運行狀態(tài),而且當需要操作人員參與時可以發(fā)出警告信息。持久性(Persistence)持久性服務提供一種統(tǒng)一的機制,使得分布式對象可以通過持久的數據存儲來保存、更新和恢復他的狀態(tài)。常見的服務(cont.)安全性(Security)安全性服務確保于分布式對象的通信是安全的,并確認相應的用戶具有適當的權限。事務(Transaction)事務服務能夠確保一個事務或者完全完成,或者完全放棄。在企業(yè)系統(tǒng)中,事務定義了工作的原子級(atomic)單元。分布式事務處理就是一個跨越多臺計算機的單個工作單元。消息處理(Messaging)消息處理服務提供異步編程模式。異步模式在很多應用中都需要。常見的服務(cont.)分布式垃圾回收(Distributedgarbagecollection)當一個程序不再使用分布式對象時,分布式垃圾回收服務會自動釋放分布式對象所占用的存儲單元。資源管理(ResourceManagement)一般來說,資源管理器按照使可伸縮性最大化的方式來管理分布式對象,即支持大量的客戶程序同分布式對象在短時間內進行交互的能力。通信客戶程序與服務程序之間通信方式SocketRPCRMI抽象層次更高SocketSocket:面對TCP/IP協(xié)議編程,普遍采用Socket(套接字)規(guī)范,即UNIX習慣的TCP/IP基本編程方法,由一組圍繞Socket概念的函數調用支持,已經成為TCP/IP應用的標準手段。RPC:RPC是一種邏輯上的協(xié)議,它可以使用Socket、Named和Pipe等更低級的協(xié)議完成通信任務。RPC是在socket的基礎上實現的,RPC比socket需要更多的條件假定,更多的系統(tǒng)資源。RPC方法的基本原則是以模塊調用的簡單概念忽略通訊細節(jié),讓程序員不用關心C/S之間的通訊協(xié)議,集中精力對付實現過程。對于需要廣泛應用和兼容的C/S應用,由于其應用平臺的多樣性和復雜性,可能在某些環(huán)境下不能提供對RPC編程方法的支持,這時必須知道通訊包的細節(jié),用RPC獲得簡單性的前提已經被大大削弱??蛻艋诜掌髦g使用的大部分通訊組件都是基于socket接口來實現的。Socket是兩個程序之間進行雙向數據傳輸的網絡通訊端點,有一個地址和一個端口號來標識。每個服務程序在提供服務時都要在一個端口進行,而想使用該服務的客戶機也必須連接該端口。因為是基于傳輸層,所以它是比較原始的通訊協(xié)議機制。通過Socket的數據表現形式為字節(jié)流信息,因此通訊雙方要想完成某項具體的應用則必須按雙方約定的方式進行數據的格式化和解釋
.*;
importjava.io.*;
publicclassSocketCommunicationServer
{
publicstaticvoidmain(String[]args)
try
{
booleanflag=true;//設置標志位為真
Socketclient=null;//創(chuàng)建Socketclient以接收來自客戶端的請求
StringinputLine;/*1首先調用ServerSocket類以某個端口號為參數,創(chuàng)建一個ServerSocket對象,即是服務器端的服務程序在該指定端口監(jiān)聽的Socket。*/
ServerSocket
serverSocket=newServerSocket(9000);//以端口9000創(chuàng)建一個服務器Socket
System.out.println("服務器在端口9000上監(jiān)聽");/*2服務器端程序使用ServerSocket對象的accept()方法,接收來自客戶機程序的連接請求,此時服務器端將一直保持停滯狀態(tài),直到收到客戶端發(fā)來的連接請求,此時該方法將返回一個新建的Socket類的實例,代表和客戶機建立的通訊鏈路在服務程序內的通訊端點。如果采用Java的多線程編程方法,可以實現并發(fā)服務器,繼續(xù)監(jiān)聽來自其他客戶的連接請求。*/
while(flag)
{
client=serverSocket.accept();/*3使用新建的Socket對象創(chuàng)建輸入、輸出流對象。*/
DataInputStreaminput=newDataInputStream(new
BufferedInputStream(client.getInputStream()));
PrintStreamoutput=newPrintStream(new
BufferedOutputStream(client.getOutputStream());/*4使用流對象的方法完成和客戶端的數據傳輸,按約定協(xié)議識別并處理來自客戶端的請求數據,并把處理的結果返回給客戶端。*/
while((inputLine=input.readLine())!=null)
{
if(inputLine.equals("Stop"))
{
flag=false;
break;
}
output.println(inputLine);
output.flush();
}/*5客戶端工作完畢后,則服務器端程序關閉和客戶端通訊的流和通訊的Socket。*/
output.close();
input.close();
client.close();
}/*6在服務器程序運行結束之間,應當關閉用來監(jiān)聽的Socket.*/
serverSocket.close();
}catch(IOExceptione){}
}
}
}
importjava.io.*;
.*;
publicclassSocketCommunicationClient
{
publicstaticvoidmain(String[]args)
{
try{/*1首先調用Socket類的構造函數,以服務器的指定的IP地址或指定的主機名和指定的端口號為參數,創(chuàng)建一個Socket流,在創(chuàng)建Socket流的過程中包含了向服務器請求建立通訊連接的過程實現。*/
SocketclientSocket=newSocket("mice",9000);//創(chuàng)建一個流Socket并與主機mice上的端口9000相連接/*2使用Socket的方法getInputStream()和getOutputStream()來創(chuàng)建輸入/輸出流。這樣,使用Socket類后,網絡輸入輸出也轉化為使用流對象的過程。*/
OutputStreamoutput=clientSocket.getOutputStream();//向此Socket寫入字節(jié)的一個輸出流
DataInputStreaminput=newDataInputStream(clientSocket.getInputStream());
intc;/*3使用輸入輸出流對象的相應方法讀寫字節(jié)流數據,因為流連接著通訊所用的Socket,Socket又是和服務器端建立連接的一個端點,因此數據將通過連接從服務器得到或發(fā)向服務器。這時我們就可以對字節(jié)流數據按客戶端和服務器之間的協(xié)議進行處理,完成雙方的通訊任務。*/
Stringresponse;
while((c=System.in.read())!=-1)//從屏幕上接受輸入的字符串,并且分解成一個個字符
{
output.write((byte)c);
if(c=='\n')//如果字符為回車,則輸出字符串緩沖
{
output.flush();
response=input.readLine();
System.out.println("Communication:"+response);
}
}/*待通訊任務完畢后,我們用流對象的close()方法來關閉用于網絡通訊的輸入輸出流,在用Socket對象的close()方法來關閉Socket。*/
output.close();
input.close();
clientSocket.close();
}catch(Exceptione){
System.err.println("Exception:"+e);
}
}
}RMI在java分布式對象模型中,遠程對象是指它的方法可以從另外一個位于不同主機上的java虛擬機來調用的對象。該對象采用一個或多個遠程接口進行描述,這些接口聲明了遠程對象的方法。RMI(遠程方法調用)就是對一個遠程對象的遠程接口中的方法進行調用RMI的目的是要使運行在不同的計算機中的對象之間的調用表現得象本地調用一樣RMI應用程序包括兩個獨立程序:server和client程序。RMI存在于客戶端遠程對象的本地映象:調用遠程對象時,實際調用的是存根對象上的方法負責初始化并與遠程對象所在的遠程VM連接將參數打包,傳遞到遠程VM等待方法調用的結果解包返回值和異常將值返回給調用者存根(stub)框架存在于服務器接收客戶存根的請求和真正的遠程對象進行交互傳送服務器響應到客戶負責解包客戶端輸入的遠程方法的參數調用實際的遠程對象的方法將結果打包返回給調用者傳至遠程引用層遠程引用層和傳輸層遠程引用層負責為獨立于stub/skeleton的多種形式的遠程引用和調用協(xié)議提供支持傳輸層負責在不同的地址空間內傳輸序列化的字節(jié)流,使用TCP/UDP傳輸RMIregistry簡單的命名和查找遠程對象的服務遠程對象在服務器端注冊客戶能夠發(fā)現遠程對象和找到遠程對象引用RMI系統(tǒng)體系結構ClientVirtualMachineClientServerVirtualMachineStubRemoteObjectSkeletonRegistryVirtualMachine“Fred”ServerRMI流程(1)ClientVirtualMachineClientServerVirtualMachineStubRemoteObjectSkeletonRegistryVirtualMachine“Fred”Server121.ServerCreatesRemoteObject
2.ServerRegistersRemoteObjectRMI流程(2)ClientVirtualMachineClientServerVirtualMachineStubRemoteObjectSkeletonRegistryVirtualMachine“Fred”Server43.ClientrequestsobjectfromRegistry4.Registryreturnsremotereference(andstubgetscreated)3RMI流程(3)ClientVirtualMachineClientServerVirtualMachineStubRemoteObjectSkeletonRegistryVirtualMachine“Fred”Server65.Clientinvokesstubmethod6.Stubtalkstoskeleton7.Skeletoninvokesremoteobjectmethod57基于RMI的程序組成遠程對象接口遠程對象實現服務程序客戶程序接口和類一個簡單的RMI例子1.遠程對象的本地接口聲明(RMIOperate.java)該類僅僅是一個接口聲明,RMI客戶機可以直接使用它,RMI服務器必須通過一個遠程對象來實現它,并用某個專有的URL注冊它的一個實例。
遠程接口擴展java.rmi.Remote
接口。除了所有應用程序特定的例外之外,每個方法還必須在
throws子句中聲明java.rmi.RemoteException(或RemoteException
的父類)。Hello.javaimport
java.rmi.*;//RMI本地接口必須從Remote接口派生public
interfaceHelloextendsRemote{//接口中的具體方法聲明,注意必須聲明拋出RemoteException
String
sayHello(Stringname)throws
RemoteException;}2、遠程對象實現類
這個類應實現RMI客戶機調用的遠程服務對象的本地接口,它必須從UnicastRemoteObject或PortableRemoteObject繼承,構造函數應拋出RemoteException異常。
HelloImpl.javaimport
java.rmi.*;import
javax.rmi.PortableRemoteObject;public
class
HelloImpl
extends
PortableRemoteObject
implementsHello{/*構造函數*/
public
HelloImpl()throws
RemoteException{super();}/*實現本地接口中聲明的'sayHello()'方法*/
public
String
sayHello(Stringmessage)throws
RemoteException{ System.out.println("我在RMI的服務器端,客戶端正在調用'sayHello'方法。");System.out.println("Hello"+message);returnmessage;}}3.RMI服務器類該類創(chuàng)建遠程對象實現類HelloImpl的一個實例,然后通過一個專有的URL來注冊它。所謂注冊就是通過Java.rmi.Naming.bind()方法或Java.rmi.Naming.rebind()方法,將HelloImpl實例綁定到指定的URL上。HelloServer.javaimportjava.rmi.*;publicclassHelloServer{publicstaticvoidmain(String[]args){try{
System.out.println("開始RMIServer...");/*創(chuàng)建遠程對象的實現實例*/
HelloImpl
hImpl=newHelloImpl();
System.out.println("將實例注冊到專有的URL");
Naming.rebind("HelloService",hImpl);
System.out.println("等待RMI客戶端調用...");
System.out.println("");}catch(Exceptione){
System.out.println("錯誤:"+e);}}}請注意有關rebind方法調用的下列參數:第一個參數是URL格式的java.lang.String,表示遠程對象的位置和名字。如果URL中省略主機,則主機缺省值為當前主機,而且在URL中無需指定協(xié)議(例如“HelloServer”)。在URL中,可以選擇提供端口號:例如“//myhost:1234/HelloServer”。端口缺省值為1099。除非服務器在缺省1099端口上創(chuàng)建注冊服務程序,否則需要指定端口號。第二個參數為從中調用遠程方法的對象實現引用。
RMI客戶使用java.rmi.Naming.lookup()方法,在指定的遠程主機上查找RMI服務對象,若找到就把它轉換成本地接口RMIOperate類型。它必須知道提供RMI服務主機的URL,這個URL可以通過rmi://host/path或rmi://host:port/path來指定,如果省略端口號,就默認使用1099。
Java.rmi.Naming.lookup()方法可能產生三個異常:Java.rmi.RemoteException、Java.rmi.NotBoundException、.MalformedURLException,三個異常都需要捕獲。HelloClient.java/**/importjava.rmi.*;publicclassHelloClient{publicstaticvoidmain(String[]args){/*默認為本地主機和默認端口*/Stringhost="localhost:1099";/*帶輸入參數時,將host設置為指定主機*/if(args.length>0)host=args[0];t
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版建筑工程施工監(jiān)理單位招標投標合同書3篇
- 二零二五版古籍文獻儲藏室修復合同3篇
- 二零二五年度高品質膩子施工服務供應合同2篇
- 二零二五版導游人員旅游安全責任合同3篇
- 小區(qū)車子棚施工合同(2篇)
- 2025年度新能源項目財務監(jiān)督出納人員擔保合同2篇
- 二零二五版車位購置及租賃合同樣本12篇
- 2025年度欠條收藏:古董字畫修復與交易合同3篇
- 二零二五年度高新技術項目研發(fā)團隊聘用合同范本3篇
- 二零二五年餐飲服務人員勞動合同樣本12篇
- 細胞庫建設與標準制定-洞察分析
- 2024年國家公務員錄用考試公共基礎知識復習題庫2500題及答案
- DB3309T 98-2023 登步黃金瓜生產技術規(guī)程
- DBJ41-T 108-2011 鋼絲網架水泥膨脹珍珠巖夾芯板隔墻應用技術規(guī)程
- 2025年學長引領的讀書會定期活動合同
- 表內乘除法口算l練習題1200道a4打印
- 《EICC培訓講義》課件
- 2025年四川省政府直屬事業(yè)單位招聘管理單位筆試遴選500模擬題附帶答案詳解
- 2024年物業(yè)公司服務質量保證合同條款
- 文言文閱讀之理解實詞含義(講義)-2025年中考語文專項復習
- DB32-T 4444-2023 單位消防安全管理規(guī)范
評論
0/150
提交評論