Java面向?qū)ο蟪绦蛟O(shè)計(jì)第7章-網(wǎng)絡(luò)編程基礎(chǔ)_第1頁
Java面向?qū)ο蟪绦蛟O(shè)計(jì)第7章-網(wǎng)絡(luò)編程基礎(chǔ)_第2頁
Java面向?qū)ο蟪绦蛟O(shè)計(jì)第7章-網(wǎng)絡(luò)編程基礎(chǔ)_第3頁
Java面向?qū)ο蟪绦蛟O(shè)計(jì)第7章-網(wǎng)絡(luò)編程基礎(chǔ)_第4頁
Java面向?qū)ο蟪绦蛟O(shè)計(jì)第7章-網(wǎng)絡(luò)編程基礎(chǔ)_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、網(wǎng)絡(luò)編程基礎(chǔ)網(wǎng)絡(luò)聊天室范例演示需要解決的問題1)如何與對方機(jī)器進(jìn)行連接2)如何找到對應(yīng)的應(yīng)用程序3)對收到的信息怎樣實(shí)現(xiàn)是廣播還是一對一?網(wǎng)絡(luò)編程基礎(chǔ)知識解決問題1和2Internet上互相通信的計(jì)算機(jī)采用的協(xié)議是TCP協(xié)議或者UDP協(xié)議,它們的結(jié)構(gòu)類似于:網(wǎng)絡(luò)編程基礎(chǔ)知識解決問題1和2TCP是傳輸控制協(xié)議,也稱為“基于數(shù)據(jù)流的套接字”,根據(jù)該協(xié)議的設(shè)計(jì)宗旨,它具有高度的可靠性,而且能保證數(shù)據(jù)順利到達(dá)目的地。換言之,它允許重傳那些由于各種原因半路“走失”的數(shù)據(jù)。而且收到字節(jié)的順序與它們發(fā)出的順序是一樣的。TCP的高可靠性需要付出的代價是:高開銷(需要有很多的信息用于控制信息)。而UDP稱為用戶

2、數(shù)據(jù)報協(xié)議,它并不刻意追求數(shù)據(jù)報會完全發(fā)送出去,也不能擔(dān)保抵達(dá)的順序與它們發(fā)出時一樣。因此,UDP被認(rèn)為是一種不可靠協(xié)議。但是,它的速度快,對于某些應(yīng)用來說(例如聲音),如果速度并質(zhì)量更重要,就可以采用UDP協(xié)議。大多數(shù)互聯(lián)網(wǎng)游戲也是采用UDP協(xié)議。網(wǎng)絡(luò)編程基礎(chǔ)知識解決問題1和2機(jī)器標(biāo)識 為了分辨出網(wǎng)絡(luò)上的每一臺機(jī)器,必須有一種機(jī)制能獨(dú)一無二地標(biāo)識出網(wǎng)絡(luò)內(nèi)的每臺機(jī)器。這可以通過IP地址來實(shí)現(xiàn)。IP地址以兩種形式存在:直接IP地址( 如)域名()。網(wǎng)絡(luò)編程基礎(chǔ)知識解決問題1和2服務(wù)器和客戶機(jī) 網(wǎng)絡(luò)最基本的精神是讓兩臺計(jì)算機(jī)連接在一起,并相互“溝通”。一旦兩臺計(jì)算機(jī)發(fā)現(xiàn)了對方,就可以開始溝通,但它

3、們怎樣才能“發(fā)現(xiàn)”對方呢?兩臺計(jì)算機(jī)要發(fā)現(xiàn)對方,通常需要其中一臺扮演“服務(wù)器”的角色,另一臺扮演“客戶機(jī)”的角色??蛻魴C(jī)用來發(fā)出連接請求,而服務(wù)器用來等待連接請求。網(wǎng)絡(luò)編程基礎(chǔ)知識解決問題1和2客戶機(jī)發(fā)出連接請求到服務(wù)器(通過IP地址),請求信息在網(wǎng)絡(luò)上傳輸,當(dāng)服務(wù)器在接到連接請求并確認(rèn)后,建立與客戶機(jī)的連接。一旦連接建立好,服務(wù)器和客戶機(jī)之間就變成了一種雙向通信,那么無論是對服務(wù)器端還是對客戶機(jī)端來說,連接就變成了一個IO數(shù)據(jù)流對象。從這是開始,我們就可以象讀寫一個普通的文件一樣來對待連接。網(wǎng)絡(luò)編程基礎(chǔ)知識解決問題1和2端口 有些時候,一個IP地址并不足以完整標(biāo)識一個服務(wù)器。這是由于在一臺計(jì)

4、算機(jī)中,往往運(yùn)行著多個服務(wù)器(即不同的網(wǎng)絡(luò)應(yīng)用程序)。為了標(biāo)識是哪個服務(wù)器,就需要用到一個端口。例如,通常來說HTTP采用的是80端口,F(xiàn)TP采用的是21端口。端口并不是機(jī)器上一個物理上存在的場所,而是一種軟件抽象(主要是為了表達(dá)的方便)??蛻舫绦蛑廊绾瓮ㄟ^機(jī)器的IP地址同服務(wù)器連接,但怎樣才能同自己真正需要的那種服務(wù)連接呢(一般每個端口都運(yùn)行著一種服務(wù),一臺機(jī)器可能提供了多種服務(wù),例如HTTP、FTP)?端口在這里扮演了重要的角色,它是必需的一種二級定址措施。也就是說,我們請求一個特定的端口,就是請求與那個端口編號關(guān)聯(lián)的服務(wù)。系統(tǒng)保留了使用端口1到端口1024的權(quán)利,所以,在我們設(shè)計(jì)網(wǎng)絡(luò)通

5、信程序時,一般不應(yīng)站用這些端口。網(wǎng)絡(luò)編程基礎(chǔ)知識解決問題1和2套接字 Socket套接字也是一種軟件形式的抽象。用于表達(dá)兩臺機(jī)器間一個連接的“通道”。針對一個特定的連接,每臺機(jī)器上都有一個“套接字”,通過“套接字”,兩臺機(jī)器之間就形成了一條“虛擬”的通道。Java的網(wǎng)絡(luò)編程類JDK提供了1個包,在該包中,主要包含如下的幾個類:1Java中IP地址的表示(InetAddress類) 包中提供了一個InetAddress類,該類用于表示一個IP地址。它常用的方法有:(1) public static InetAddress getByName(Stringhost) 返回字符串host所表示的IP

6、地址。(2)public static InetAddress getLocalHost() 返回本機(jī)IP地址(如果你的機(jī)器設(shè)置了IP地址,則返回你自己的IP,否則返回默認(rèn)的IP地址:)。Java的網(wǎng)絡(luò)編程類2服務(wù)器端口打開(ServerSocket類)ServerSocket類用于在服務(wù)器端打開某一個端口,等待客戶端的連接請求,它常用的方法有:(1)構(gòu)造器方法public ServerSocket(intport) 用于打開服務(wù)器port端口。(2)public Socket accept() 用于等待客戶連接,當(dāng)連接成功時,形成一個套接字對象。(3)public void close()

7、關(guān)閉用戶連接。Java的網(wǎng)絡(luò)編程類3套接字建立(Socket類) Socket類用于套接字的建立。它常用的方法有:(1)構(gòu)造器方法public Socket(InetAddressaddress, intport) 用于客戶端與指定的服務(wù)器IP地址及服務(wù)器端口進(jìn)行套接字連接。(2)public void close() 關(guān)閉用戶連接。(3)public InputStream getInputStream() 從套接字返回一個輸入流(4)public OutputStream getOutputStream() 從套接字返回一個輸出流服務(wù)器的連接過程 服務(wù)器的工作就是偵聽來自客戶機(jī)的連接請求并

8、建立連接。因此,對于服務(wù)器端來說,網(wǎng)絡(luò)編程的步驟是:(1)創(chuàng)建ServerSocket對象:ServerSocket server=new ServerSocket(PORT),其中,PORT是指服務(wù)器打開哪個端口來等待和建立連接。(2)等待連接:Socket socket=server.accept() ,連接形成是以套接字來表示的,一旦連接成功,就會在服務(wù)器客戶機(jī)之間形成一個套接字。 (3)一旦連接建立好(即服務(wù)器客戶機(jī)套接字建立),我們就可以使用Socket類提供的兩個方法getInputStream()和getOutputStream()來作為輸入輸出設(shè)備設(shè)備,實(shí)現(xiàn)服務(wù)器與客戶機(jī)之間的

9、信息交互??蛻舳说倪B接過程 客戶機(jī)的工作就是要向服務(wù)器發(fā)出連接請求并建立連接。對客戶機(jī)來說,它需要給出要連接的服務(wù)器的IP地址(以便找到該服務(wù)器)以及服務(wù)器的端口號(以便找到需要連接的服務(wù))。至于客戶機(jī)到底用哪個端口與服務(wù)器的端口建立連接,是客戶機(jī)上的Java系統(tǒng)決定的。 因此,對于客戶機(jī)來說,網(wǎng)絡(luò)編程的步驟是:(1)創(chuàng)建InetAddress對象,指定服務(wù)器的IP地址:InetAddress addr=InetAddress. getByName(服務(wù)器的IP地址) (2)創(chuàng)建與服務(wù)器的指定端口的連接:Socket socket=new Socket(addr,PORT) 簡單聊天系統(tǒng)的實(shí)現(xiàn)

10、 1、演示簡單聊天系統(tǒng)-服務(wù)器端成員變量設(shè)計(jì)ServerSocket server=null;Socket socket=null;BufferedReader cin=null;PrintStream cout=null;簡單聊天系統(tǒng)-服務(wù)器端事件處理1.打開服務(wù)器端口2.等待客戶連接3.構(gòu)建輸入輸出通道4.讀入客戶端發(fā)送的信息簡單聊天系統(tǒng)-客戶端成員變量設(shè)計(jì) Socket socket=null;BufferedReader cin=null;PrintStream cout=null;簡單聊天系統(tǒng)-客戶端事件處理1.獲得服務(wù)器IP2.獲得服務(wù)器端口3.與服務(wù)器連接4.構(gòu)建輸入輸出通道5.

11、向服務(wù)器發(fā)送一條信息簡單聊天系統(tǒng)-運(yùn)行與問題運(yùn)行程序發(fā)現(xiàn):無法收發(fā)信息。原因:信息未發(fā)送。解決1:客戶端發(fā)送按鈕簡單聊天系統(tǒng)-運(yùn)行與問題仍然存在問題原因:服務(wù)器未進(jìn)行多次接收解決:對服務(wù)器進(jìn)行10次信息收發(fā)簡單聊天系統(tǒng)-運(yùn)行與問題任意多次信息收發(fā)的解決?假死問題出現(xiàn)? 必須發(fā)送10條信息,才能顯示。 對任意多條,必定永遠(yuǎn)假死。 假死問題的原因?獨(dú)占資源解決辦法: 多線程。 演示Java的多線程機(jī)制 我們都很熟悉多任務(wù)的概念,通常來說,多任務(wù)是指通過CPU時間分片的方式,讓幾個程序同時運(yùn)行。 既然程序和程序之間可以同時運(yùn)行,而程序也無非是一些代碼,那么,我們可以自然而然地推理出,應(yīng)該也可以通過C

12、PU時間分片的方式,讓一個程序的幾段代碼同時運(yùn)行,這就是多線程(Multi Threads)。 Java作為一種網(wǎng)絡(luò)編程語言,支持多線程機(jī)制。上例中出現(xiàn)假死的原因就是因?yàn)镃PU資源獨(dú)占的緣故。如果我們能夠?qū)⒃斐伞凹偎馈钡哪嵌未a采用多線程機(jī)制來進(jìn)行,那么就可以讓服務(wù)器不停讀套接字端口的同時,原來的程序照預(yù)定方式繼續(xù)運(yùn)行。 線程的創(chuàng)建要在程序中對某些程序片段采用多線程,就必須遵照J(rèn)ava的多線程編程機(jī)制。1線程的運(yùn)行機(jī)制 線程實(shí)際上是程序中的一條執(zhí)行路徑。而多線程則是指程序包含多條執(zhí)行路徑。這樣,在“同一”時間內(nèi),程序可以存在多條執(zhí)行路徑,“同步”執(zhí)行,以提高程序的執(zhí)行效率。2線程的創(chuàng)建 在Ja

13、va中,系統(tǒng)提供了一個Thread類,用戶通過繼承Thread類的方式,可以將需要的程序段以線程的機(jī)制來運(yùn)行。其通常做法是: (1)用戶自定義類,該類繼承自Thread類。 (2)覆蓋(Override)Thread類的run方法。在該方法中實(shí)現(xiàn)需要與“主”程序“同步”運(yùn)行的功能。線程的生命周期 對一個具體的線程對象,在其生命周期內(nèi),根據(jù)狀態(tài)的不同,通??梢詤^(qū)分為:1創(chuàng)建狀態(tài)(new) 2可運(yùn)行狀態(tài)(Runnable) 3阻塞狀態(tài)(Blocked) 4終止?fàn)顟B(tài)線程的實(shí)現(xiàn) 目標(biāo):針對上例,我們希望服務(wù)器端能多次接收客戶端發(fā)送的信息,直到接收到“QUIT”信息才終止連接。解決辦法:我們就可以采用線

14、程的機(jī)制來實(shí)現(xiàn) 在SingleServer工程的MainFrame類中,添加一個內(nèi)部類,該內(nèi)部類的作用是自定義線程類,主要實(shí)現(xiàn)服務(wù)器端對客戶端信息的接收功能。內(nèi)部線程類將需要循環(huán)執(zhí)行的語句塊在線程的run方法中實(shí)現(xiàn)服務(wù)器端監(jiān)聽按鈕事件將實(shí)現(xiàn)收發(fā)功能的代碼用線程來實(shí)現(xiàn)簡單聊天系統(tǒng)的實(shí)現(xiàn)-運(yùn)行運(yùn)行,客戶端可以發(fā)送多條信息,服務(wù)器端顯示。簡單聊天系統(tǒng)-實(shí)戰(zhàn)演習(xí) 在上例中,我們已經(jīng)實(shí)現(xiàn)服務(wù)器端不停地接收信息,請對這兩個工程做修改,實(shí)現(xiàn)如下功能:(1)服務(wù)器在接收到來自客戶端的非退出信息時,發(fā)送一條“服務(wù)器反饋信息XX”信息到客戶端。(2)服務(wù)器在接收到來自客戶端的退出信息時,發(fā)送一條“QUIT”信息到

15、客戶端。(3)客戶端能實(shí)時接收服務(wù)器發(fā)送的信息,當(dāng)接收到“QUIT”信息時,則關(guān)閉套接字連接。簡單聊天系統(tǒng)的實(shí)現(xiàn)-問題問題:多個客戶端怎樣同時與服務(wù)器聯(lián)系?多客戶-服務(wù)器信息交互系統(tǒng)上例中之所以只能實(shí)現(xiàn)一個客戶的連接,是因?yàn)榉?wù)器端的套接字打開后,只允許了一個客戶的連接(serverSocket.accept()只被運(yùn)行了1次)。要實(shí)現(xiàn)多個客戶的連接,最顯然的方式是讓“等待連接連接建立接收信息”程序段重復(fù)運(yùn)行。因此,我們就可以考慮采用多線程的機(jī)制來實(shí)現(xiàn)。演示客戶連接線程的實(shí)現(xiàn) 由于針對多用戶連接,每個用戶與服務(wù)器之間都必須形成一條自己的“通道”,以進(jìn)行信息的“收發(fā)”。因此,在服務(wù)器的客戶連接線

16、程中,必須建立服務(wù)器與每個客戶的套接字。在套接字建立后,通過創(chuàng)建收發(fā)信息線程,在收發(fā)信息線程中實(shí)現(xiàn)信息的接收與發(fā)送。為實(shí)現(xiàn)信息的接收與發(fā)送,就必須在收發(fā)信息線程中建立套接字的輸入流和輸出流。因此,需要將客戶連接線程中建立的套接字作為參數(shù)傳遞到收發(fā)信息線程中。所以,為實(shí)現(xiàn)多客戶連接,就必須在上例中添加如下的客戶連接線程類(內(nèi)部類):class ConnectSocket extends Thread public void run() /將多用戶連接過程在run方法中實(shí)現(xiàn)while(true) /多個客戶連接循環(huán)trysocket = server.accept(); /等待客戶連接catch

17、(IOException e) jT1.append(用戶連接服務(wù)器出錯n);if (socket!=null)/創(chuàng)建收發(fā)信息線程對象 ReadMessageThread readThread=new ReadMessageThread(socket);/激活線程 readThread.start(); 客戶連接線程的實(shí)現(xiàn) 收發(fā)信息線程的實(shí)現(xiàn) 由于涉及到多個用戶與服務(wù)器的信息收發(fā),因此,在收發(fā)信息線程中,至少需要三個成員變量:套接字、輸入流、輸出流,用于構(gòu)建信息收發(fā)的通道。所以,對上例中的ReadMessageThread類應(yīng)做如下的更改:class ReadMessageThread ext

18、ends ThreadBufferedReader cin; /輸入流成員變量PrintStream cout; /輸出流成員變量Socket socket; /套接字成員變量/*構(gòu)造器方法,實(shí)現(xiàn)從用戶連接線程中獲得套接字, 并利用該套接字實(shí)現(xiàn)輸入流和輸出流的建立*/ReadMessageThread(Socket socket)this.socket=socket;try cin=new BufferedReader(new InputStreamReader(this.socket.getInputStream(); cout = new PrintStream(this.socket.g

19、etOutputStream(); catch(IOException e) jT1.append(輸入輸出流建立異常n);public void run()String str=;while(true)trystr = cin.readLine();cout.println(服務(wù)器反饋信息+str);catch (IOException e) jT1.append(輸入輸出異常n);if (str.equals(QUIT)trysocket.close();catch (IOException e) jT1.append(套接字關(guān)閉異常n);break; elsejT1.append(“從客

20、戶端讀入如下的信息:”+ str+n);收發(fā)信息線程的實(shí)現(xiàn) 多客戶-服務(wù)器信息交互系統(tǒng)-運(yùn)行與問題運(yùn)行.問題:真正系統(tǒng)有用戶信息,相互之間可以發(fā)送信息構(gòu)建真正的多客戶信息廣播系統(tǒng)演示:multiserver2/multiclient2多客戶信息廣播系統(tǒng)本節(jié)我們就來實(shí)現(xiàn)客戶之間通過服務(wù)器進(jìn)行信息廣播的功能。 “張三”發(fā)送信息到服務(wù)器,服務(wù)器將信息轉(zhuǎn)發(fā)到所有與之連接的客戶(“張三”、“李四”),通過這種形式,就可以實(shí)現(xiàn)客戶之間的信息廣播。在技術(shù)上,我們已經(jīng)實(shí)現(xiàn)了客戶-服務(wù)器之間信息的交互。因此,要實(shí)現(xiàn)上述功能,其關(guān)鍵是如何約定雙方的信息格式,讓服務(wù)器根據(jù)接收的信息來進(jìn)行不同的處理。多客戶信息廣播系

21、統(tǒng)-格式約定對服務(wù)器來說,其可能接收到的信息有:(1)客戶請求服務(wù)器的連接信息(2)客戶向服務(wù)器發(fā)送的聊天信息(3)客戶想服務(wù)器發(fā)送的斷開請求信息服務(wù)器在接收到上述信息后,應(yīng)做不同的處理。如果接收到的信息是客戶連接信息,則需要提取客戶的名稱,并更新連接客戶列表,并將連接客戶列表廣播到所有客戶端。如果接收到的信息是客戶聊天信息,則需要將信息轉(zhuǎn)發(fā)到每個客戶端。如果接收到的信息是斷開連接信息,則需要發(fā)送同意斷開連接信息到對應(yīng)的客戶端,并關(guān)閉對應(yīng)的連接套接字,更新連接用戶列表,并將連接客戶列表廣播到所有客戶端。對客戶端來說,其可能接收到的信息有:(1)服務(wù)器發(fā)送的連接客戶列表信息(2)服務(wù)器發(fā)送的聊天

22、信息(3)服務(wù)器發(fā)送的同意斷開連接信息??蛻舳嗽诮邮盏缴鲜鲂畔⒑螅瑧?yīng)做不同的處理。如果是連接客戶列表信息,則將其顯示在客戶端的連接客戶列表信息顯示處。如果是聊天信息,則將其顯示在客戶端的聊天信息顯示處。如果是同意斷開信息,則關(guān)閉對應(yīng)的連接套接字。多客戶信息廣播系統(tǒng)-格式約定依據(jù),我們知道,客戶與服務(wù)器之間需要有如下的信息格式約定:1客戶向服務(wù)器發(fā)送連接請求的信息格式PEOPLE:客戶名稱其中,PEOPLE是關(guān)鍵區(qū)分字,其后面緊跟客戶名稱,以分號分隔。2客戶向服務(wù)器發(fā)送的聊天信息的信息格式MSG:客戶名稱:聊天信息其中,MSG是關(guān)鍵區(qū)分字,其后面緊跟客戶的聊天信息,以分號分隔。3客戶向服務(wù)器發(fā)送

23、的請求斷開連接的信息格式QUIT其中,QUIT是關(guān)鍵區(qū)分字。4服務(wù)器向客戶端發(fā)送的連接客戶列表的信息格式PEOPLE:客戶名稱1:客戶名稱2:.:客戶名稱n其中,PEOPLE是關(guān)鍵區(qū)分字,其后面緊跟所有名稱,以分號分隔。5服務(wù)器向客戶端廣播的聊天信息的信息格式 MSG:客戶名稱:聊天信息6服務(wù)器向客戶端發(fā)送的同意斷開連接的信息格式QUIT多客戶信息廣播系統(tǒng)-預(yù)備知識(信息的分離、存儲與顯示 )服務(wù)器(或客戶端)在接收到相應(yīng)信息后,必須根據(jù)信息的種類,做相應(yīng)的處理。因此,如何對收到的信息進(jìn)行分離,是首先需要解決的問題。此外,對服務(wù)器來說,需要將連接用戶列表、聊天信息廣播到每一個客戶端,因此,必須

24、要將每一個客戶的名稱、與之對應(yīng)的套接字保存,并提供遍歷的方式,以實(shí)現(xiàn)上述功能。要實(shí)現(xiàn)將客戶列表信息顯示在客戶端,通常的做法可以用JTextArea來實(shí)現(xiàn),但如果要實(shí)現(xiàn)將信息發(fā)送到指定客戶,就需要選擇客戶名稱,這是JTextArea無法實(shí)現(xiàn)的。多客戶信息廣播系統(tǒng)-信息分離1字符串令StringTokenizer在JDK1.4中,系統(tǒng)在java.util包中,提供了一個字符串令StringTokenizer類,其主要作用是對字符串進(jìn)行信息分離。(1)構(gòu)造器方法public StringTokenizer(Stringstr, Stringdelim) 將字符串str按給定分隔符號delim進(jìn)行信息

25、分離,構(gòu)成字符串令對象。(2)成員方法public boolean hasMoreTokens() 如果字符串令還有元素,則返回真值。(3)成員方法public String nextToken() 返回字符串令的下一個元素。(4)成員方法public String nextToken(Stringdelim) 返回字符串令重新以按給定分隔符號delim進(jìn)行信息分離的下一個元素。多客戶信息廣播系統(tǒng)-用戶存儲在JDK1.4中,系統(tǒng)在java.util包中,提供了一個向量Vector類,其主要作用是可以存儲若干的元素(可以是任何類型),并提供若干方法,以實(shí)現(xiàn)對這些元素的遍歷。(1)構(gòu)造器方法pub

26、lic Vector() 構(gòu)造一個向量類對象,其可以存儲任意多個元素(依據(jù)機(jī)器的內(nèi)存空間)。(2)成員方法public int size() 返回向量類對象中存儲的元素個數(shù)。(3)成員方法public Object elementAt(int i) 返回向量類對象中第i元素。(4)成員方法public Object firstElement() 返回向量類對象中第1元素。(5)成員方法public Object lastElement() 返回向量類對象中最后1個元素。(6)成員方法public void removeElementAt(i) 移除向量類對象中第i元素。(7)成員方法publi

27、c void addElement(Object c) 將c添加到向量類對象。(8)成員方法public String toString() 將向量類中的每個元素以字符串形式返回。多客戶信息廣播系統(tǒng)-用戶顯示在JDK1.4中,系統(tǒng)在javax.swing包中,提供了一個下拉列表JList類,其主要作用是實(shí)現(xiàn)按條顯示信息,并能返回所選擇的信息內(nèi)容。(1)構(gòu)造器方法public JList() 構(gòu)造一個下拉列表類對象,其可以存儲任意多個元素(依據(jù)機(jī)器的內(nèi)存空間)。(2)成員方法public void setListData(Vector vs) 將向量vs的每個元素作為下拉列表的顯示項(xiàng)。(3)成員

28、方法public Object getSelectedValue() 返回被選擇的對象。多客戶信息廣播系統(tǒng)-服務(wù)器端功能結(jié)構(gòu) 1多線程機(jī)制在服務(wù)器端,由于需要建立多個用戶的連接,因此,需要有一個ConnectSocket線程,其主要工作流程如圖1所示: 服務(wù)器與客戶連接后,需要不斷進(jìn)行信息的收發(fā),因此,客戶與服務(wù)器進(jìn)行信息交互也需要用Client線程來實(shí)現(xiàn)。在Client的構(gòu)造器中,主要實(shí)現(xiàn)客戶與服務(wù)器的連接通道(輸入流和輸出流),并分離客戶的信息,并將連接信息顯示在服務(wù)器端。 Client接下來的工作就是不停掃描套接字端口,對讀入的信息做相應(yīng)的處理。其主要工作流程如圖2所示:多客戶信息廣播系

29、統(tǒng)-服務(wù)器端功能結(jié)構(gòu) 對服務(wù)器來說,必須將客戶信息保存,以實(shí)現(xiàn)服務(wù)器與每個客戶的信息交互。那么,對服務(wù)器來說,到底需要保存客戶的哪些信息呢?顯然,客戶名稱是需要保存的,此外,服務(wù)器與客戶的信息通道(輸入流和輸出流)也需要保存,這樣,才能實(shí)現(xiàn)服務(wù)器通過訪問客戶列表,實(shí)現(xiàn)向每個客戶發(fā)送消息。因此,我們可以將服務(wù)器客戶信息交互線程作為用戶列表信息保存起來??蛻暨B接信息的存儲多客戶信息廣播系統(tǒng)-服務(wù)器-客戶連接線程class ConnectSocket extends ThreadSocket socket; public void run() while(true) try socket=serve

30、r.accept();/等待客戶連接 catch(IOException e2) jT1.append( 客戶連接失敗n); /*客戶連接成功,定義并實(shí)例化一個Client線程,每一個線程對應(yīng)一個客戶連接*/ Client c=new Client(socket); /*將連接的客戶添加到客戶列表存儲clients中*/ clients.addElement(c); /*測該用戶名稱是否存在,如不存在,則啟動線程,實(shí)現(xiàn)客戶與服務(wù)器的信息交互通道*/ if(checkName(c) /啟動線程 c.start();/*向每個客戶端更新客戶列表信息*/ notifyRoom(); else dis

31、connect(c); 多客戶信息廣播系統(tǒng)-服務(wù)器-客戶端信息交互線程見教材多客戶信息廣播系統(tǒng)-客戶名檢測成員方法 該方法作為MultiServer1類的成員方法,主要功能是檢測登陸的客戶名是否已被其他已登陸的客戶所占用。由于用戶登陸成功后,將所有信息已保存在Client線程對象中。因此,我們可以比較新建立的Client線程對象的客戶名稱是否和已存在的Client線程對象的客戶名稱是否重復(fù)而返回boolean值,供調(diào)用該方法的程序段進(jìn)行處理。(見教材)多客戶信息廣播系統(tǒng)-客戶列表信息發(fā)送成員方法 該方法作為MultiServer1類的成員方法,主要功能是將已連接的客戶名稱發(fā)送到所有客戶端。(見

32、教材)多客戶信息廣播系統(tǒng)-息廣播成員方法 該方法作為MultiServer1類的成員方法,主要功能是將要發(fā)送的信息發(fā)送到所有客戶端。(見教材)多客戶信息廣播系統(tǒng)-斷開服務(wù)器-客戶連接方法 該方法作為MultiServer1類的成員方法,主要功能是斷開某一個特定的服務(wù)器客戶交互信息線程,并清除與之對應(yīng)的用戶列表信息。(見教材)多客戶信息廣播系統(tǒng)-客戶器端功能結(jié)構(gòu) 客戶端按鈕功能客戶端有3個按鈕,每個按鈕都響應(yīng)不同的功能,其主要工作流程如圖所示: 讀取服務(wù)器發(fā)送信息線程客戶端在讀取信息后,必須對信息的類型進(jìn)行分析,根據(jù)不同信息類型做相應(yīng)處理,其主要工作流程如圖5所示:多客戶信息廣播系統(tǒng)-讀取服務(wù)器發(fā)送信息線程ReadMessageThread類作為MultiClient類

溫馨提示

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

評論

0/150

提交評論