分布式計算、云計算與大數據 第2版 課件 第2章 分布式計算編程基礎_第1頁
分布式計算、云計算與大數據 第2版 課件 第2章 分布式計算編程基礎_第2頁
分布式計算、云計算與大數據 第2版 課件 第2章 分布式計算編程基礎_第3頁
分布式計算、云計算與大數據 第2版 課件 第2章 分布式計算編程基礎_第4頁
分布式計算、云計算與大數據 第2版 課件 第2章 分布式計算編程基礎_第5頁
已閱讀5頁,還剩72頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第2章分布式編程基礎提綱進程間通信Socket編程RMI編程P2P編程進程間通信的定義分布式計算的核心技術是進程間通信(interprocesscommunication,IPC),即在互相獨立的進程(進程是程序的運行時表示)間通信及共同協作以完成某項任務的能力。計算機1計算機2互聯網單播通信與組播通信在分布式計算中,兩個或多個進程按約定的某種協議進行IPC,此處協議是指數據通信各參與進程必須遵守的一組規則。在協議中,一個進程有些時候可能是發送者,在其他時候則可能是接收者。單播組播IPC設施系統級IPC設施消息隊列共享內存。。。高層的IPCAPI抽象開發分布式應用往往工作量比較大且復雜更好地把注意力集中在應用邏輯上API:ApplicationProgrammingInterface,應用編程接口或應用程序接口IPCAPI的四種基本操作發送(Send):該操作由發送進程發起,旨在向接收進程傳輸數據。操作必須允許發送進程識別接收進程和定義待傳數據。接收(Receive):該操作由接收進程發起,旨在接收發送進程發來的數據操作必須允許接收進程識別發送進程和定義保存數據的內存空間,該內存隨后被接收者訪問。連接(Connect):對面向連接的IPC,必須有允許在發起進程和指定進程間建立邏輯連擊的操作:其中以進程發出請求連接操作而另一進程發出接受連接操作。斷開連接(Disconnect):對面向連接的IPC,該操作允許通信的雙方關閉先前建立起來的某一邏輯連接。IPC使用示例:HTTP事件同步IPC中的一個主要難點是進行IPC的各相關進程是獨立執行的,各進程不知道對方進程的情況。協議涉及的雙方必須按特定順序發起IPC操作,否則可能通信失敗。因此,參與通信的兩個進程需要同步他們的操作,由一方發送數據,另一方則需要等待所有數據發送完成時,開始接收數據。IPC設施提供事件同步的最簡單的方法是使用阻塞(blocking)機制或同步(synchronous),即掛起某一進程的執行,直到該進程發起的某個操作執行結束。另外,IPC操作可以是異步(asynchronous)或非阻塞操作(nonblocking)。進程發起的異步操作不會引起阻塞。因此,一旦向IPC設施發出異步操作后,進程可以繼續執行。當該異步操作完成后,進程才會隨后得到IPC設施的通知。IPC范型在最低抽象層,IPC利用底層的串行或并行數據傳輸機制,在連接上傳輸二進制流。例如,這種IPC范型可以用于編寫網絡驅動軟件。這種形式的IPC屬于網絡或操作系統編程領域。下一個抽象層是眾所周知的一種范型,稱作socket應用程序接口(socketAPI)。在socket范型中,兩個進程使用名為socket的邏輯構造交換數據,每一方都要建立一個socket。待發送數據被寫入socket。在另一端,接收進程從自身的socket中讀取或提取數據。遠程過程調用(remoteprocedurecall)或遠程方法調用(remotemethodinvocation)范型通過允許向遠程進程發送過程調用或方法調用,來提供更高層次的抽象。這是,數據作為參數和返回值,在兩個進程間進行傳遞。提綱進程間通信Socket編程RMI編程P2P編程Socket歷史SocketAPI最早作為BerkeleyUnix操作系統的程序庫,出現于20世紀80年代早期,用于提供IPC功能。現在所有主流操作系統都支持SocketAPI。在BSD、Linux等基于Unix的系統中,SocketAPI都是操作系統的一部分。在個人計算機操作系統如MS-DOS、WindowsNT、Mac-OS、OS\2中,SocketAPI都是以程序庫形式提供的(在Windows系統中,SocketAPI稱為Winsocket)。Java語言在設計之初就考慮到了網絡編程,也將SocketAPI作為語言核心類的一部分提供給用戶。所有這些API都使用相同的消息傳遞模型和非常類似的語法。Socket現狀SocketAPI是實現進程間通信的第一種編程設施。SocketAPI非常重要的原因主要有以下兩點:1)SocketAPI已經成為IPC編程事實上的標準,高層IPC設施都是構建于SocketAPI之上的,即它們基于SocketAPI實現的。2)對于響應時間要求較高或在有限資源平臺上運行的應用來說,用SocketAPI實現是最合適的。基本Socket機制兩種主要的傳輸層協議UDP(UserDatagramProtocol,用戶數據包協議):允許使用無連接通信傳輸報文(即在傳輸層發送和接受)。被傳輸報文稱為數據報(datagram)。根據無連接通信協議,每個傳輸的數據包都被分別解析和路由,并且可按任何順序到達接收者。TCP(TransmissionControlProtocol,傳輸控制協議):面向連接的協議,它通過在接受者和發送者之間建立的邏輯連接來傳輸數據流。由于有連接,從發送者到接受者的數據能保證以與發送次序相同的順序被接受。兩種主要的傳輸層協議UDP:如果主機A上的進程1通過順序傳輸數據包m1、m2,向主機B上的進程2發送消息,這些數據包可以通過不同路由在網絡上傳輸,并且可按下列任何一種順序到達接收進程:m1-m2或m2-m1。在數據通信網絡的術語中,“包”(或稱分組,英文為packet)是指在網絡上傳輸的數據單位。每個包中都包含有效數據(載荷,payload)以及一些控制信息(頭部信息),如目的地址。TCP:如果主機A上的進程1順序傳輸m1、m2,向主機B上的進程2發送消息,接收進程可以認為消息將以m1-m2順序到達,而不是m2-m1。兩種類型的Socket根據傳輸層所使用協議不同,SocketAPI分成兩種類型:數據包Socket:即DatagramSocket,一種使用UDP傳輸的Socket。流式Socket:即StreamSocket,使用TCP傳輸的Socket。提示:由于分布式計算與網絡應用主要使用流式Socket比較多,后面將重點討論流式Socket的開發技術。兩種類型的SocketAPI數據報Socket(DatagramSocket)流式Socket(StreamSocket)流式SocketAPIJava流式Socket

API在Java中,有兩個類提供了流式SocketAPI:1)ServerSocket用于接受連接,我們將稱之為連接socket2)Socket用于數據交換,我們將稱之為數據socket流式Socket程序流類ServerSocket的主要方法和構造函數Method/constructorDescriptionServerSocket(int

port)Createsaserversocketonaspecifiedport.Socketaccept()throwsIOExceptionListensforaconnectiontobemadetothissocketandacceptsit.Themethodblocksuntilaconnectionismade.publicvoidclose()throwsIOException

Closesthissocket.voidsetSoTimeout(int

timeout)throwsSocketExceptionSetatimeoutperiod(inmilliseconds)sothatacalltoaccept()forthissocketwillblockforonlythisamountoftime.Ifthetimeoutexpires,ajava.io.InterruptedIOExceptionisraised類Socket的主要方法和構造函數Method/constructorDescriptionSocket(InetAddress

address,int

port)CreatesastreamsocketandconnectsittothespecifiedportnumberatthespecifiedIPaddressvoidclose()throwsIOExceptionClosesthissocket.InputStreamgetInputStream()throwsIOExceptionReturnsaninputstreamsothatdatamaybereadfromthissocket.OutputStream

getOutputStream()throwsIOExceptionReturnsanoutputstreamsothatdatamaybewrittentothissocket.voidsetSoTimeout(int

timeout)throwsSocketExceptionSetatimeoutperiodforblockingsothataread()callontheInputStreamassociatedwiththisSocketwillblockforonlythisamountoftime.Ifthetimeoutexpires,ajava.io.InterruptedIOExceptionisraised流式Socket基本語法//instantiatesasocketforacceptingconnectionServerSocketconnectionSocket=newServerSocket(portNo);SocketdataSocket=connectionSocket.accept();//getaoutputstreamforwritingtothedatasocketOutputStreamoutStream=dataSocket.getOutputStream();PrintWritersocketOutput=newPrintWriter(newOutputStreamWriter(outStream));socketOutput.println(message);socketOutput.flush();dataSocket.close();connectionSocket.close();//instantiatesadatasocketandconnectwithatimeoutSocketAddress

sockAddr=newInetSocketAddress(acceptorHost,acceptorPort);SocketmySocket=newSocket();inttimeoutPeriod=2000;//2secondsmySocket.connect(sockAddr,timeoutPeriod);//getaninputstreamforreadingfromthedatasocketInputStreaminStream=mySocket.getInputStream();BufferedReader

socketInput=newBufferedReader(newInputStreamReader(inStream));Stringmessage=socketInput.readLine();mySocket.close();類Example1ConnectionAcceptor類Example1ConnectionRequestor流式Socket基本語法在本例中有一些值得關注的地方:1)由于這里處理的是數據流,因此可使用Java類PrinterWriter向socket寫數據和使用BufferedReader從流中讀取數據。這些類中所使用的方法與向屏幕寫入一行或從鍵盤讀取一行文本相同。2)盡管本例將Acceptor和Requestor分別作為數據發送者和數據接收者介紹,但兩者的角色可以很容易地進行互換。在那種情況下,Requestor將使用getOutputStream向socket中寫數據,而Acceptor將使用getInputStream從socket中讀取數據。3)事實上,任一進城都可以通過調用getInputStream和getOutputStream從流中讀取數據或向其中寫入數據。4)在本例中,每次只讀寫一行數據(分別使用readLine和println方法),但其實也可以每次只讀寫一行中的一部分數據(分別使用read和print方法來實現)。然而,對于以文本形式交換消息的文本協議來說,每次讀寫一行是標準做法。事件狀態圖隱藏數據Socket細節publicclassExample2ConnectionAcceptor{publicstaticvoidmain(String[]args){…

ServerSocketconnectionSocket=newServerSocket(portNo);MyStreamSocketdataSocket=newMyStreamSocket(connectionSocket.accept());dataSocket.sendMessage(message);dataSocket.close();connectionSocket.close();…}//endmain}//endclass類Example2ConnectionAcceptor類Example2ConnectionRequestorpublicclassExample2ConnectionRequestor{publicstaticvoidmain(String[]args){…

MyStreamSocket

mySocket=newMyStreamSocket(acceptorHost,acceptorPort);Stringmessage=mySocket.receiveMessage();

mySocket.close();…}//endmain}//endclassMyStreamSocket類實現細節publicclassMyStreamSocketextendsSocket{privateSocketsocket;privateBufferedReaderinput;privatePrintWriteroutput;

MyStreamSocket(InetAddress

acceptorHost,intacceptorPort)throwsSocketException,IOException{socket=newSocket(acceptorHost,acceptorPort);

setStreams();}

MyStreamSocket(Socketsocket)throwsIOException{

this.socket=socket;

setStreams();}privatevoidsetStreams()throwsIOException{//getaninputstreamforreadingfromthedatasocket

InputStream

inStream=socket.getInputStream();input=newBufferedReader(newInputStreamReader(inStream));

OutputStream

outStream=socket.getOutputStream();output=newPrintWriter(newOutputStreamWriter(outStream));//createaobjectforcharacter-modeoutput}publicvoidsendMessage(Stringmessage)throwsIOException{

output.println(message);

output.flush();}//endsendMessagepublicStringreceiveMessage()throwsIOException{//readalinefromthedatastreamStringmessage=input.readLine();returnmessage;}//endreceiveMessage}//endclass提綱進程間通信Socket編程RMI編程P2P編程RMI的定義RMI是RemoteMethodInvocation的縮寫,即遠程方法調用。RMI是RPC模型的面向對象實現,是一種用于實現遠程過程調用的應用程序編程接口,它使客戶機上運行的程序可以調用遠程服務器上的對象。JavaRMI由于RMIAPI只適用于Java程序,所以,我們一般稱為JavaRMI。但該API相對簡單,因此,非常適合于用作學習網絡應用中分布式對象技術的入門資料。

JavaRMI使用接口化編程。在需要服務端的某一個遠程對象時,編程人員通過定義一個該對象的接口來隱藏它的實現,并在客戶端定義一個相同的接口,客戶端使用該接口可以像本地調用一樣實現遠程方法調用。通過調用RMI的API,對象服務器通過目錄服務導出和注冊遠程對象,這些對象提供一些可以被客戶程序調用的遠程方法。從語法上來看,RMI通過遠程接口聲明遠程對象,該接口是Java接口的擴展;遠程接口由對象服務器實現;對象客戶使用與本地方法調用類似的語法訪問遠程對象,并調用遠程對象的方法。JavaRMI體系結構從應用層看,RMI由客戶應用、服務器應用和對象目錄服務3個部分。RMI系統實現架構由三層組成:樁/框架(Stub/Skeleton)層:客戶端的樁和服務器端的框架;遠程引用(remotereference)層:處理遠程引用行為;傳輸層(transport):連接的建立和管理,以及遠程對象的跟蹤。RMI基本分布式應用遠程接口定義服務器端軟件客戶端軟件RMI基本分布式應用:遠程接口定義在RMIAPI中,分布式對象的創建開始于遠程接口。Java接口是為其他類提供模板的一種類:它包括方法聲明或簽名,其實現由實現該接口的類提供。Java遠程接口是繼承Java類remote的一個接口,該類允許使用RMI語法實現接口。與必須為每個方法簽名定義擴展和RemoteException不同,遠程接口語法與常規或本地Java接口相同。RMI基本分布式應用:遠程接口定義importjava.rmi.*;publicinterfaceSomeInterface

extendsRemote{//signatureoffirstremotemethodpublicStringsomeMethod1()throwsjava.rmi.RemoteException;//signatureofsecondremotemethodpublicintsomeMethod2(intx)throwsjava.rmi.RemoteException;//signatureofotherremotemethodsmayfollow}//endinterfaceRMI基本分布式應用:服務器端軟件對象服務器是指這樣的一種對象,它可以提供某一分布式對象的方法和接口。每個對象服務器必須:1)實現接口部分定義的每個遠程方法;2)向目錄服務注冊包含了實現的對象。RMI基本分布式應用:服務器端軟件import

java.rmi.*;import

java.rmi.server.*;publicclassSomeImplextendsUnicastRemoteObject

implementsSomeInterface{publicStringsomeMethod1()throwsRemoteException{//codetobesupplied}publicintsomeMethod2()throwsRemoteException{//codetobesupplied}}//endclass1)遠程接口實現遠程接口實現類的一個通用模板RMI基本分布式應用:服務器端軟件1)遠程接口實現import

java.rmi.*;import

java.rmi.server.*;publicclassHelloImplextendsUnicastRemoteObjectimplementsHelloInterface{publicHelloImpl()throwsRemoteException{super();}publicStringsayHello(Stringname)throwsRemoteException{return"WELCOMETORMI!Goodafternoon!"+name+".";}}//endclassRMI基本分布式應用:服務器端軟件1)遠程接口實現RMI基本分布式應用:服務器端軟件2)stub和skeleton生成在RMI中,分布式對象需要為每個對象服務器和對象客戶提供代理,分別成為對象skeleton和stub。這些代理可通過使用JavaSDK提供的RMI編譯器rmic,編譯遠程接口實現生成。可在命令行下輸入下述命令生成stub和skeleton文件:rmic<classnameoftheremoteinterfaceimplementation>例如:rmicSomeImplRMI基本分布式應用:服務器端軟件2)stub和skeleton生成如果編譯成功,將生成兩個代理文件,每個文件的名都以實現類的類名為前綴:SomeImpl_stub.classSomeImpl_skel.class但在Java2版本以上的平臺下,只生成stub文件。對象的stub文件及遠程接口文件,必須被每個對象客戶所共享:這些文件是編譯客戶程序時所必須的文件。可以手工為對象客戶提供每個文件的一個拷貝。此外JavaRMI具有stub下載特征,允許客戶端動態獲取stub文件。RMI基本分布式應用:服務器端軟件3)對象服務器的實現SomeImplexportedObj=newSomeImpl();startRegistry(1234);registryURL="rmi://localhost:"+portNum+"/some";Naming.rebind(registryURL,exportedObj);listRegistry(registryURL);主機名

端口號引用名類Naming提供從注冊表獲取和存儲引用的方法。具體來說,rebind方法允許如下形式URL將對象引用存儲到注冊表中:主機名應該是服務器名,或簡寫成localhost,引用名指用戶選擇的名稱,該名稱在注冊表中應該是惟一的。rebind方法將覆蓋注冊表中與給定引用名綁定的任何引用。如果不希望覆蓋,可以使用bind方法。URL:rmi://<hostname>:<portnumber>/<referencename>//檢查RMI注冊表當前是否運行在默認端口上。如果不在,RMI注冊表將被激活。RMI基本分布式應用:服務器端軟件3)對象服務器的實現此外,可以使用JDK中的rmiregistry工具在系統提示符輸入下列命令,手工激活RMI注冊表:rmiregistry<portnumber>

端口號(默認1099)RMI對象服務器是并發服務器:每個對象客戶請求都使用服務器上的一個獨立線程服務。由于遠程方法調用可并發執行,因此遠程對象實現的線程安全性非常重要。RMI基本分布式應用:服務器端軟件3)對象服務器的實現RMI基本分布式應用:客戶端軟件查找遠程對象:如果對象服務器先前在注冊表中保存了對象引用,可以用類Naming的lookup方法獲取這些引用。注意,應將獲取的引用傳給遠程接口類。StringregistryURL="rmi://localhost:"+portNum+"/some";SomeInterfaceh=(SomeInterface)Naming.lookup(registryURL);調用遠程方法:遠程接口引用可以調用遠程接口中的任何方法,例如:Stringmessage=h.method1();System.out.println(message);注意,調用遠程方法的語法與調用本地方法相同。RMI應用構建步驟總結1)服務器端軟件開發算法為該應用的所有待生成文件創建一個目錄。在SomeInterface.java中定義遠程服務器接口。編譯并修改程序,直到不再有任何語法錯誤。SomeImpl.java中實現接口,編譯并修改程序,直到不再有任何語法錯誤。使用RMI編譯器rmic處理實現類,生成遠程對象的stub文件

rmicSomeImpl可以從目錄中看到新生成文件SomeImpl_Stub.class,每次修改接口實現時,都要重新執行步驟3和步驟4創建對象服務器程序SomeServer.java,編譯并修改程序,直到不再有任何語法錯誤。激活對象服務器javaSomeServerRMI應用構建步驟2)客戶端軟件開發算法為該應用的所有待生成文件創建一個目錄獲取遠程接口類文件的一個拷貝,也可獲取遠程接口源文件的一個拷貝,使用javac編譯程序,生成接口文件。獲取接口實現stub文件SomeImpl_stub.class的一個拷貝開發客戶程序SomeClient.java,編譯程序,生成客戶類激活客戶javaSomeClientRMI應用構建步驟2)客戶端軟件開發算法客戶類程序與任何其他Java類相似。RMI所需的語法包括定位服務器主機的RMI注冊表和查找服務器對象的遠程引用;該引用隨后可被傳到遠程接口類和被調用的遠程方法查找遠程對象:如果對象服務器先前在注冊表中保存了對象引用,可以用類Naming的lookup方法獲取這些引用。注意,應將獲取的引用傳給遠程接口類。

StringregistryURL="rmi://localhost:"+portNum+"/some";

SomeInterfaceh=(SomeInterface)Naming.lookup(registryURL);調用遠程方法:遠程接口引用可以調用遠程接口中的任何方法,例如:

Stringmessage=h.method1();System.out.println(message);注意,調用遠程方法的語法與調用本地方法相同。RMI應用構建步驟2)客戶端軟件開發算法基本RMI應用程序演示RMI應用的HelloWorld實現程序:HelloInterface.javaHelloImpl.javaHelloServer.javaHelloClient.javaHelloWorld程序演示RMI應用構建步驟3)測試和調試構建最小RMI程序的一個模板。從一個遠程接口開始,其中包括一個方法簽名,一個stub實現,一個輸出對象的服務器程序以及一個足以用來調用遠程方法的客戶程序。在單機上測試模板程序,直到遠程方法調用成功。每次在接口中增加一個方法簽名。每次增加后都修改客戶程序來調用新增方法。完善遠程方法定義內容,每次只修改一個。在繼續下一個方法之前,測試并徹底調試每個新增方法。完全測試所有遠程方法后,采用增量式方法開發客戶應用。每次增加后,都測試和調試程序。將程序部署到多臺機器上,測試并調試。RMI和socketAPI的比較遠程方法調用API作為分布式對象計算范型的代表,是構建網絡應用的有效工具。它可用來取代socketAPI快速構建網絡應用。在RMIAPI和socketAPI之間權衡時,需要考慮以下因素:1)socketAPI的執行與操作系統密切相關,因此執行開銷更小,RMI需要額外的中間件支持,包括代理和目錄服務,這些不可避免地帶來運行時開銷。對有高性能要求的應用來說,socketAPI仍將是惟一可行途徑。2)RMIAPI提供了使軟件開發任務更為簡單的抽象。用高級抽象開發的程序更易理解,因此也更易調試。RMI和socketAPI的比較由于運行在低層,socketAPI通常是平臺和語言獨立的,RMI則不一定。例如JavaRMI需要特定的Java運行時支持。結果是,使用JavaRMI實現的應用必須用Java編寫,并且也只能運行在Java平臺上。在設計應用系統時,是否能選擇適當的范型和API是非常關鍵的。依賴于具體環境,可以在應用的某些部分使用某種范型或API,而在其他部分使用另一種范型或API。由于使用RMI開發網絡應用相對簡單,RMI是快速開發應用原型的一個很好的候選工具。提綱進程間通信Socket編程RMI編程P2P編程P2P的定義P2P,即Peer-to-Peer的縮寫,常稱它為“點對點”或者“端對端”,而學術界常稱它為“對等計算”。P2P是一種以非集中化方式使用分布式資源來完成計算任務的一種分布式計算模式。非集中化:P2P系統中并非采用傳統的以服務器為中心管理所有客戶端的方法,而是消除“中心”的概念,將原來的客戶端視為服務器和客戶端的綜合體;分布式資源:P2P系統的參與者共享自己的一部分空閑資源供系統處理關鍵任務所用,這些資源包括處理能力、數據文件、數據存儲和網絡帶寬等。P2P的優點P2P技術打破了傳統的Client/Server(縮寫為C/S)模式,在P2P網絡中所有結點的地位都是對等的,每個結點既充當服務器,又充當客戶端,這樣緩解了中心服務器的壓力,使得資源或任務處理更加的分散化。由于P2P網絡中結點是Client和Server的綜合體,因此結點也被形象地稱為“SERVENT”。C/S模式與P2P模式對比C/S模式P2P模式C/S模式與P2P模式對比C/S模式:服務器和客戶端之間是一對多的主從關系,系統的信息和數據都保存在中心服務器上若要索取信息,必須先訪問服務器,才能得到所需的信息,且客戶端之間是沒有交互能力的。P2P模式:不區分提供信息的服務器和請求信息的客戶端,每一個結點都是信息的發布者和請求者,對等結點之間可以實現自治交互,無需使用服務器。每個對等結點都可以在網絡中發布和分享信息,使得網絡中閑散的資源得到充分利用。不需要花費高昂的費用來維護中心服務器。基于P2P范型的即時聊天系統開發由于演示的是簡單的P2P即時聊天系統,所以,我們僅僅設計了如下幾個功能:(1)點對點單人聊天;(2)多人同時在線聊天;(3)用戶可以自由加入和退出系統;(4)具備用戶在線狀態監視。1)確定系統實現功能為了更好地理解P2P分布式計算模式和P2P應用的開發方法,本節使用JavaSocket來實現一個簡單的基于P2P范型的即時聊天系統。系統的功能基于P2P范型的即時聊天系統開發為了簡單起見,我們采用類似于中心化拓撲結構的P2P模式,所有客戶都需要與中心服務器相連,并將自己的網絡地址寫入服務器中,服務器只需要監聽和更新用戶列表信息,并發送給客戶最新的用戶列表信息即可。當需要點對點聊天時,客戶端只需要從本地用戶列表中讀取目標用戶的網絡地址,并連接目標用戶,即可實現通信。因為是P2P系統,客戶端要同時扮演服務器和客戶端兩個角色,所以,用戶登錄后都會創建一個接收其他用戶連接的監聽線程,以實現服務器的功能。2)確定P2P模式基于P2P范型的即時聊天系統開發創建Socket、綁定地址和端口號,監聽并接受客戶端的連接請求。服務器端在客戶連接后自動獲取客戶端用戶名、IP地址和端口號,并將其保存在服務器端的用戶列表中,同時更新所有在線用戶的客戶端在線用戶列表信息,以方便客戶了解上下線的實時情況,以進行聊天。當有用戶下線時,服務器端要能即時監聽到,并更新用戶列表信息,發送給所有在線客戶端。對在線用戶數量進行統計。3)確定服務器主要任務基于P2P范型的即時聊天系統開發客戶端創建Socket,并調用connect()函數,向中心服務器發送連接請求。客戶端在登錄后也必須充當服務器,以接收其他用戶的連接請求,所有需要創建一個用戶接收線程來監聽。用戶登錄后需要接收來自服務器的所有在線用戶信息列表,并更新本地的用戶列表信息,以方便選擇特定用戶進行聊天。客戶端可以使用群發功能,向在線用戶列表中的所有用戶發送聊天信息。4)確定客戶端主要任務基于P2P范型的即時聊天系統開發服務器主要任務客戶端主要任務創建Socket、綁定地址和端口號,監聽并接受客戶端的連接請求自動獲取客戶端用戶名、IP地址和端口號,并將其保存在服務器端的用戶列表中,同時更新所有在線用戶的客戶端在線用戶列表信息當有用戶下線時,服務器端要能即時監聽到,并更新用戶列表信息,發送給所有在線客戶端。對在線用戶數量進行統計。創建Socket,并調用connect()函數,向中心服務器發送連接請求。在登錄后也必須充當服務器,接收其他用戶的連接請求,需要創建一個用戶接收線程來監聽用戶登錄后需要接收來自服務器的所有在線用戶信息列表,并更新本地的用戶列表信息客戶端可以使用群發功能,向在線用戶列表中的所有用戶發送聊天信息注意,服務器向所有客戶發送最新用戶列表信息,及客戶端的群發功能,都是通過簡單地遍歷用戶列表來實現。基于P2P范型的即時聊天系統開發中心服務器啟動后會自動創建一個監聽線程,以接受客戶端發來的連接請求。當客戶端與服務器連接后,客戶端會將自己的信息(用戶名、IP地址和端口號等)寫入socket,服務器端從此socket中讀取該用戶信息,并登記到用戶信息列表中。然后,服務器將最新的用戶信息列表群發給所有在線的客戶端,以便客戶端得到最新的用戶列表。步驟1、2展示了客戶登陸服務器的過程。5)確定交互過程:登陸基于P2P范型的即時聊天系統開發每個連接到中心服務器的客戶都會得到最新的用戶信息列表。如步驟3所示,若Client2欲與Client3聊天,則Client2檢索自己的用戶信息列表,得到Client3的用戶信息后,便可與Client3進行連接,實現通信。此過程,并不需要中心服務器的干預。5)確定交互過程:通信基于P2P范型的即時聊天系統開發當有一個客戶需要下線時,例如圖中的Client1,那么Client1首先將下線請求寫入socket,中心服務器接收到含有下線請求標記的信息后,Client1便通過握手機制下線(為了安全關閉socket)。Client1安全下線后,中心服務器會將Client1的用戶信息從在線列表中刪除,并將更新后的用戶列表、下線用戶名稱和當前網絡的在線用戶情況等群發給所有在線客戶端,以便客戶端得到最新的在線用戶列表。5)確定交互過程:登出基于P2P范型的即時聊天系統開發客戶端的群發功能與服務器端的群發類似,都采用遍歷用戶列表的方法。例如,圖中Client3欲與所有在線用戶聊天,則只要遍歷Client3的在線用戶列表,與所有在線用戶進行連接,便可以進行群聊。5)確定交互過程:群聊基于P2P范型的即時聊天系統開

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論