《Java面向?qū)ο蟪绦蛟O(shè)計(jì)(第3版)》課件:chapter13 網(wǎng)絡(luò)技術(shù)和應(yīng)用開發(fā)_第1頁
《Java面向?qū)ο蟪绦蛟O(shè)計(jì)(第3版)》課件:chapter13 網(wǎng)絡(luò)技術(shù)和應(yīng)用開發(fā)_第2頁
《Java面向?qū)ο蟪绦蛟O(shè)計(jì)(第3版)》課件:chapter13 網(wǎng)絡(luò)技術(shù)和應(yīng)用開發(fā)_第3頁
《Java面向?qū)ο蟪绦蛟O(shè)計(jì)(第3版)》課件:chapter13 網(wǎng)絡(luò)技術(shù)和應(yīng)用開發(fā)_第4頁
《Java面向?qū)ο蟪绦蛟O(shè)計(jì)(第3版)》課件:chapter13 網(wǎng)絡(luò)技術(shù)和應(yīng)用開發(fā)_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第第1313章章 網(wǎng)絡(luò)技術(shù)和應(yīng)用開發(fā)網(wǎng)絡(luò)技術(shù)和應(yīng)用開發(fā)2教學(xué)目標(biāo)教學(xué)目標(biāo)n13.1 Java網(wǎng)絡(luò)技術(shù)概述n13.2 URL與網(wǎng)絡(luò)應(yīng)用n13.2.1 URL類n13.2.2 用applet訪問URL資源n13.2.3 Web瀏覽器的設(shè)計(jì)n13.2.4 URLConnection類n13.3 基于流套接字的客戶/服務(wù)器通信n13.3.1 InetAddress類n13.3.2 Socket類n13.3.3 ServerSocket類n13.3.4 基于流套接字的客戶/服務(wù)器的通信過程n13.3.5多線程實(shí)現(xiàn)多用戶網(wǎng)上聊天3教學(xué)目標(biāo)教學(xué)目標(biāo)(續(xù)續(xù))n13.4 基于數(shù)據(jù)報(bào)套接字方式的客戶/服務(wù)器通信n

2、13.4.1 DatagramPacket類n13.4.2 DatagramSocket類n13.4.3基于數(shù)據(jù)報(bào)套接字的客戶/服務(wù)器的通信應(yīng)用實(shí)例413.1 Java13.1 Java網(wǎng)絡(luò)技術(shù)概述網(wǎng)絡(luò)技術(shù)概述nJava提供兩種網(wǎng)絡(luò)支持機(jī)制:n URL的類n用于訪問Internet網(wǎng)上資源的應(yīng)用n Socket通信的類n基于TCP/IP協(xié)議中傳輸層接口Socketn針對(duì)Client/Server模型的網(wǎng)絡(luò)應(yīng)用n以及實(shí)現(xiàn)某些特殊協(xié)議的網(wǎng)絡(luò)應(yīng)用。n網(wǎng)絡(luò)通信包:包含有網(wǎng)絡(luò)通信所需要的類和接口 513.1 Java13.1 Java網(wǎng)絡(luò)技術(shù)概述網(wǎng)絡(luò)技術(shù)概述n基于流套接字(stream sockets

3、)的網(wǎng)絡(luò)通信n應(yīng)用程序?qū)⒕W(wǎng)絡(luò)通訊看做是數(shù)據(jù)流;n面向連接的網(wǎng)絡(luò)服務(wù)n用于傳送的協(xié)議是TCP(Transmission Control Protocol)協(xié)議。n基于數(shù)據(jù)報(bào)套接字(datagram sockets)的網(wǎng)絡(luò)通信n程序?qū)⒁獋鬟f的數(shù)據(jù)打包分成一個(gè)個(gè)小的數(shù)據(jù)包。n服務(wù)主機(jī)跟客戶機(jī)是無連接的n傳送的協(xié)議是UDP(User Datagram Protocol)協(xié)議。 613.2 13.2 URLURL與網(wǎng)絡(luò)應(yīng)用與網(wǎng)絡(luò)應(yīng)用 n URL(Uniform Resource Locator):URL(Uniform Resource Locator):n用于表示用于表示InternetInterne

4、t上的網(wǎng)絡(luò)資源上的網(wǎng)絡(luò)資源; ;n利用利用URLURL對(duì)象中提供的方法,可直接讀寫網(wǎng)絡(luò)中的數(shù)對(duì)象中提供的方法,可直接讀寫網(wǎng)絡(luò)中的數(shù)據(jù)。據(jù)。n 一個(gè)一個(gè)URLURL組成組成: :協(xié)議名、主機(jī)名、端口號(hào)、路徑文件(文件協(xié)議名、主機(jī)名、端口號(hào)、路徑文件(文件路徑及文件名)。路徑及文件名)。 例如,例如, http:/:80/home/homepage.htmhttp:/:80/home/homepage.htm 表示表示: : 協(xié)議協(xié)議:http:http, 主機(jī)地址主機(jī)地址: : 端口號(hào)端口號(hào):80:80, 路徑文件路徑文件:/:/home/homepage.htmhome/homepage.ht

5、m。713.2.1 13.2.1 URLURL類類 nJava將URL封裝成URL類.n創(chuàng)建URL對(duì)象的構(gòu)造方法: (1)URL(String spec) 用指定的一個(gè)String來創(chuàng)建一個(gè)URL對(duì)象; (2)URL(String protocol,String host,int port,String file): 用指定的協(xié)議、主機(jī)名、端口號(hào)、路徑文件來創(chuàng)建一個(gè)URL對(duì)象 (3)URL(String protocol, String host, String file) 用指定的協(xié)議、主機(jī)名、路徑及文件名來創(chuàng)建URL對(duì)象; (4)URL( URL context, String spec)

6、 用已存在的URL對(duì)象來創(chuàng)建URL對(duì)象。 813.2.1 13.2.1 URLURL類類n獲取URL對(duì)象屬性的常用方法:v String getProtocol():獲取URL傳輸?shù)膮f(xié)議;v String getHost():獲取URL的機(jī)器名稱;v int getPort():獲取URL的端口號(hào);v String getFile():獲取URL的文件名,包括路徑和文件名;v Obect getContent():獲取URL的內(nèi)容;v InputStram openStream():打開與URL的連接,返回一個(gè)輸入流,通過這個(gè)輸入流讀取數(shù)據(jù);v URLConnection openConnec

7、tion():返回與URL進(jìn)行連接的URLConnection對(duì)象;913.2.1 13.2.1 URLURL類類n例例13-1 URL13-1 URL對(duì)象的創(chuàng)建及使用。對(duì)象的創(chuàng)建及使用。10 import . import . * *; ;public class Myurlpublic class Myurl public static void main(String args public static void main(String args)try try URL urlURL url=new URL=new URL (http:/:80/home/homepage.htm (h

8、ttp:/:80/home/homepage.htm););System.out.printlnSystem.out.println(the Protocol: “(the Protocol: “ +url.getProtocol +url.getProtocol();();System.out.println(the hostname: +url.getHostSystem.out.println(the hostname: +url.getHost();();System.out.println(the port: +url.getPortSystem.out.println(the po

9、rt: +url.getPort();();System.out.println(the file: +url.getFileSystem.out.println(the file: +url.getFile();();System. out. println(url.toStringSystem. out. println(url.toString();(); catch(MalformedURLException catch(MalformedURLException e) e) System.out.printlnSystem.out.println(e);(e); 1113.2.2 1

10、3.2.2 用用AppletApplet訪問訪問URLURL資源資源 n例例13-213-2利用利用AppletApplet顯示顯示網(wǎng)絡(luò)上其他網(wǎng)絡(luò)上其他HTML文檔。文檔。 在IE瀏覽器執(zhí)行showdoc.htm文件執(zhí)行后,將在新的IE窗口中顯示163網(wǎng)站的內(nèi)容。n利用applet的AppletContect接口中的方法showDocument(),將使執(zhí)行Applet的瀏覽器顯示指定的URL資源。 showDocument(URL url,String target) target:指定顯示URL內(nèi)容的窗體. Target值為 “_bank” 表示在新開的窗體URL資源。12/showdoc

11、showdoc.java.javaimport javaximport javax.swing.swing.* *; ; import java.awtimport java.awt. .* *; ; import .import .* *; ; public class showdoc extends JApplet public class showdoc extends JApplet URL docurURL docur= null; = null; public void paint(Graphics g) public void paint(Graphics g) try try

12、docurdocur=new URL(http:/); =new URL(http:/); catch (MalformedURLExceptioncatch (MalformedURLException e) e) System.out.println(Can opeSystem.out.println(Can ope the URL ); the URL ); if (docur != null) if (docur != null) getAppletContext().showDocument(docurgetAppletContext().showDocument(docur,_bl

13、ank); ,_blank); 13/ showdoc.htm/ showdoc.htmapplet code = showdoc5001413.2.3 Web13.2.3 Web瀏覽器的設(shè)計(jì)瀏覽器的設(shè)計(jì)n用application實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Web瀏覽器。n使用swing GUI組件JEditorPane,顯示W(wǎng)eb服務(wù)器上的文件內(nèi)容。nJEditorPane組件能顯示無格式或帶格式的HTML文本。nJEditorPane的方法setPage(URL url),將下載由url定位的文檔并顯示在JEditorPane組件中。n用戶在窗體頂部的JTextField中輸入U(xiǎn)RL后,將URL的HTM

14、L格式的文本,在JEditorPane中顯示。1513.2.3 Web13.2.3 Web瀏覽器的設(shè)計(jì)瀏覽器的設(shè)計(jì) 1613.2.3 Web13.2.3 Web瀏覽器的設(shè)計(jì)瀏覽器的設(shè)計(jì)n如果JEditorPane含有的HTML文檔中含有超鏈接,當(dāng)用戶單擊其中一個(gè)超鏈接時(shí),則JEditorPane產(chǎn)生事件HyperlinkEvent(javax.swing.event包中),并通知所有已注冊(cè)的HyperlinkListener對(duì)象。nHyperlinkListener接口的方法hyperlinkUpdate()n處理超鏈接事件HyperlinkEvent:n在JEditorPane中顯示超鏈接的

15、Web網(wǎng)頁。1713.2.3 Web13.2.3 Web瀏覽器的設(shè)計(jì)瀏覽器的設(shè)計(jì) wcontentsArea.addHyperlinkListener( new HyperlinkListener() / if user clicked hyperlink, go to specified page public void hyperlinkUpdate( HyperlinkEvent event ) if ( event.getEventType() = HyperlinkEvent.EventType.ACTIVATED ) getThePage( event.getURL().toStr

16、ing() ); ); nHyperlinkEvent類中包含一個(gè)嵌套內(nèi)部類EventType,此內(nèi)部類聲明的三個(gè)靜態(tài)常量:nACTIVED(表示用戶單擊一個(gè)超鏈接以改變Web網(wǎng)頁)nENTERED(表示用戶把鼠標(biāo)移到一個(gè)超鏈接上)nEXITED(表示用戶把鼠標(biāo)移離一個(gè)超鏈接)。1813.2.3 Web13.2.3 Web瀏覽器的設(shè)計(jì)瀏覽器的設(shè)計(jì)n例例13-313-3用用JavaJava的應(yīng)用程序?qū)崿F(xiàn)一個(gè)簡(jiǎn)單的的應(yīng)用程序?qū)崿F(xiàn)一個(gè)簡(jiǎn)單的WebWeb瀏瀏覽器。覽器。 假定用戶在窗體頂部的JTextField中輸入google的Web地址后,將在JEditorPane中顯示google的Web頁面。

17、用戶單擊其中一個(gè)超鏈接“高級(jí)搜索”,將顯示超鏈接“高級(jí)搜索”的Web網(wǎng)頁 1913.2.4 URLConnection13.2.4 URLConnection類類nURLConnectionURLConnection是一個(gè)抽象類,它提供了與是一個(gè)抽象類,它提供了與URLURL資資源的雙向通信(讀寫操作)。源的雙向通信(讀寫操作)。nURLConnectionURLConnection對(duì)象的構(gòu)造對(duì)象的構(gòu)造: : 通過調(diào)用通過調(diào)用URLURL對(duì)象的對(duì)象的方法方法: : URLConnection openConnection() 來得到一個(gè)來得到一個(gè)URLounechonURLounechon對(duì)象

18、,但這并未建立與對(duì)象,但這并未建立與指定的指定的URLURL的連接,還必須調(diào)用的連接,還必須調(diào)用URLConnectionURLConnection對(duì)對(duì)象的象的connect()connect()方法建立連接。方法建立連接。2013.2.4 URLConnection13.2.4 URLConnection類類nURLConnectionURLConnection對(duì)象的常用方法:對(duì)象的常用方法: void connect():void connect():打開到此打開到此 URL URL 引用的資源的通信鏈接。引用的資源的通信鏈接。 int getContentLengthint getCon

19、tentLength()():獲得文件的長(zhǎng)度;:獲得文件的長(zhǎng)度; String getContentTypeString getContentType()():獲得文件的類型;:獲得文件的類型; long getDatelong getDate()():獲得文件創(chuàng)建的時(shí)間;:獲得文件創(chuàng)建的時(shí)間; long getLastModifiedlong getLastModified()() / /獲得文件最后修改的時(shí)間;獲得文件最后修改的時(shí)間; InputStream getInputStreamInputStream getInputStream()() :獲得輸入流,以便讀:獲得輸入流,以便讀取

20、文件的數(shù)據(jù);取文件的數(shù)據(jù); OutputStream getOutputStreamOutputStream getOutputStream()() :獲得輸出流,以便:獲得輸出流,以便寫文件。寫文件。 2113.2.4 URLConnection13.2.4 URLConnection類類n例例13-4 13-4 從從WebWeb服務(wù)器上將服務(wù)器上將URLURL文件下載到本機(jī),文件下載到本機(jī),并將文件的信息顯示到屏幕。并將文件的信息顯示到屏幕。 該程序運(yùn)行后,將文件http:/:80/home/homepage.htm 下載到本機(jī)的當(dāng)前文件夾下,并在屏幕上輸出文件homepage.htm內(nèi)容

21、。 2213.3 13.3 基于流套接字的客戶基于流套接字的客戶/ /服務(wù)器通信服務(wù)器通信 n基于流套接字的數(shù)據(jù)傳遞方式:n在兩個(gè)網(wǎng)絡(luò)應(yīng)用程序(服務(wù)器應(yīng)用和客戶機(jī)應(yīng)用)之間發(fā)送和接收信息時(shí),需要建立一個(gè)可靠的連接。nJava中與流套接字相關(guān)的類:nInetAddress對(duì)象描繪了32位或128位IP地址nServerSocket對(duì)象用在服務(wù)器應(yīng)用中nSocket對(duì)象是建立網(wǎng)絡(luò)連接時(shí)使用的 23nInternet上通過IP地址或域名標(biāo)識(shí)主機(jī),而類InetAddress用來表示與Internet地址的相關(guān)的操作。nInetAddress類沒有構(gòu)造方法,要?jiǎng)?chuàng)建該類的實(shí)例對(duì)象,通過該類的靜態(tài)方法獲得該

22、對(duì)象。13.3.1 13.3.1 InetAddressInetAddress類類 2413.3.1 13.3.1 InetAddressInetAddress類類nInetAddress類的常用一組靜態(tài)方法: InetAddress getLocalHost():獲得本地機(jī)的 InetAddress對(duì)象。 InetAddress getByName(Stung host):獲得由host指定的InetAddress對(duì)象,host是計(jì)算機(jī)的域名。 InetAddressgetAllmyName(String host):在Web中,可以用相同的名字代表一組計(jì)算機(jī)獲得具有相同名字的一組InetA

23、ddress對(duì)象。 2513.3.1 13.3.1 InetAddressInetAddress類類nInetAddrss對(duì)象的常用一組方法: byte getAddress():得到IP地址; String getHostName():得到主機(jī)名字; String toString():得到主機(jī)名和IP地址的字符串。2613.3.1 13.3.1 InetAddressInetAddress類類n例例13-5 13-5 InetAddressInetAddress類的應(yīng)用類的應(yīng)用. . 程序運(yùn)行的機(jī)器已經(jīng)與Internet網(wǎng)連接好,程序運(yùn)行后的輸出結(jié)果: 27import .import .

24、* *; ;class InternetAddressclass InternetAddress public static void main(String args public static void main(String args) trytry InetAddress iads; InetAddress iads; iads= InetAddress.getByName iads= InetAddress.getByName( );( ); System.out.println System.out.println(hostname=+(hostname=+ iads.getHos

25、tName iads.getHostName();(); System.out.println(iads.toString System.out.println(iads.toString() );() ); catch(Exception e) catch(Exception e) System.out.printlnSystem.out.println(e);(e); 2813.3.2 Socket13.3.2 Socket類類 nSocket是建立網(wǎng)絡(luò)連接時(shí)使用的n在連接成功時(shí),客戶和服務(wù)器應(yīng)用程序兩端都會(huì)產(chǎn)生一個(gè)Socket實(shí)例,操作這個(gè)實(shí)例,完成所需的會(huì)話。n當(dāng)客戶程序需要與服務(wù)器程

26、序通訊的時(shí)候,客戶程序在客戶機(jī)要?jiǎng)?chuàng)建一個(gè)Socket對(duì)象。nSocket類的常用構(gòu)造方法:(1)Socket(InetAddress addr, int port) (2)Socket(String host, int port) 兩個(gè)構(gòu)造方法都創(chuàng)建了一個(gè)用于連接服務(wù)器主機(jī)和指定端口的客戶端流套接字。 2913.3.2 13.3.2 SocketSocket類類n在創(chuàng)建了一個(gè)Socket對(duì)象,應(yīng)用程序n通過調(diào)用Socket對(duì)象的getInputStream()方法:獲得輸入流,以讀取對(duì)方傳送來的信息;n通過調(diào)用Socket對(duì)象的 getOutputStream()方法獲得輸出流,向?qū)Ψ桨l(fā)送消息

27、。n在讀寫活動(dòng)完成之后,調(diào)用close()方法關(guān)閉流和流套接字。n例如: 創(chuàng)建了一個(gè)服務(wù)器應(yīng)用的主機(jī)地址為,端口號(hào)為50000的客戶端Socket對(duì)象,然后從這個(gè)新創(chuàng)建的Socket對(duì)象中讀取輸入流和輸出流,最后再關(guān)閉Socket對(duì)象和流。3013.3.2 13.3.2 SocketSocket類類Socket s = new Socket (,50000);InputStream inputstream = s.getInputStream ();OutputStream outputstream = s.getOnputStream ()

28、;. / Read or write from the inputstream/outputstreaminputstream.close ();outputstream.close ();connection.close ();3113.3.3 13.3.3 ServerSocketServerSocket類類n服務(wù)器程序需要?jiǎng)?chuàng)建一個(gè)ServerSocket對(duì)象,用于在指定端口上監(jiān)聽客戶端連接請(qǐng)求。nServerSocket類的構(gòu)造方法:(1)ServerSocket(intServerSocket(int port) port) 在指定端口上創(chuàng)建一個(gè)ServerSocket對(duì)象。服務(wù)器應(yīng)用

29、使用ServerSocket監(jiān)聽指定的端口,端口建議使用大于1024。 (2)ServerSocket(int port,int queueLength) Server在指定端口上監(jiān)聽客戶端連接請(qǐng)求,并指定允許連接的客戶最大數(shù)目。 3213.3.3 13.3.3 ServerSocketServerSocket類類n創(chuàng)建一個(gè)ServerSocket對(duì)象后,接下來服務(wù)程序進(jìn)入無限循環(huán)之中.3313.3.4 13.3.4 基于流套接字的客戶基于流套接字的客戶/ /服務(wù)器的通信過程服務(wù)器的通信過程 傳送數(shù)據(jù)連接成功請(qǐng)求連接(1)為客戶機(jī)創(chuàng)建Socket對(duì)象注冊(cè)服務(wù)器地址和端口,請(qǐng)求連接連接成功時(shí)建立

30、Socket連接對(duì)象(2)用Socket連接創(chuàng)建流對(duì)象:OutputStream和 InputStream(4)關(guān)閉連接,關(guān)閉Stream(3)通過流進(jìn)行通信數(shù)據(jù)處理用InputStream對(duì)象發(fā)送數(shù)據(jù)用OutputStream接受數(shù)據(jù)創(chuàng)建ServerSocket對(duì)象對(duì)象(1)創(chuàng)建ServerSocket對(duì)象注冊(cè)服務(wù)器端口和允許連接的用戶最大數(shù)服務(wù)器端應(yīng)用(2)ServerSocket對(duì)象.accept()監(jiān)聽來自客戶端的連接連接成功時(shí)建立Socket連接對(duì)象(3)用Socket連接創(chuàng)建流對(duì)象:OutputStream和 InputStream(4)通過流進(jìn)行通信數(shù)據(jù)處理用InputStrea

31、m對(duì)象發(fā)送數(shù)據(jù)用OutputStream接受數(shù)據(jù)創(chuàng)建ServerSocket對(duì)象對(duì)象(5)關(guān)閉連接,關(guān)閉Stream客戶端應(yīng)用3413.3.4 13.3.4 基于流套接字的客戶基于流套接字的客戶/ /服務(wù)器的通信過程服務(wù)器的通信過程n例子說明如何建立服務(wù)器的應(yīng)用和客戶機(jī)的應(yīng)用。 例13-7 客戶端的應(yīng)用.運(yùn)行輸出結(jié)果:例13-6 服務(wù)器端的應(yīng)用. 運(yùn)行輸出結(jié)果:3513.3.5 13.3.5 多線程實(shí)現(xiàn)多用戶網(wǎng)上聊天多線程實(shí)現(xiàn)多用戶網(wǎng)上聊天 n實(shí)現(xiàn)多用戶網(wǎng)上能同時(shí)聊天,由于存在單個(gè)服務(wù)器程序與多個(gè)客戶程序通訊的可能,要求:l 服務(wù)器程序響應(yīng)客戶程序不應(yīng)該花很多時(shí)間,否則客戶程序在得到服務(wù)前有可

32、能花很多時(shí)間來等待通訊的建立l 還有,服務(wù)程序和客戶程序的會(huì)話有可能是很長(zhǎng)的(與電話類似)n為了加快對(duì)客戶程序連接請(qǐng)求的響應(yīng),典型的方法:n服務(wù)器主機(jī)在響應(yīng)每一個(gè)客戶連接請(qǐng)求時(shí)運(yùn)行一個(gè)后臺(tái)通信服務(wù)線程,n這個(gè)后臺(tái)線程處理和客戶程序之間的通訊。n又由于在服務(wù)器主機(jī)上創(chuàng)建每一個(gè)后臺(tái)通信服務(wù)線程,都需要花費(fèi)一定的主機(jī)資源,因此對(duì)允許與服務(wù)器連接的客戶數(shù)應(yīng)有一個(gè)限制。3613.3.5 13.3.5 多線程實(shí)現(xiàn)多用戶網(wǎng)上聊天多線程實(shí)現(xiàn)多用戶網(wǎng)上聊天 例例13-8 13-8 服務(wù)器聊天程序的實(shí)現(xiàn)服務(wù)器聊天程序的實(shí)現(xiàn). .nChatServerChatServer.java.java聲明了一個(gè)外部類聲明了一

33、個(gè)外部類ChatServer ChatServer 和一個(gè)內(nèi)部類和一個(gè)內(nèi)部類CommunicationThreadCommunicationThread。n在在ChatServerChatServer類的類的main()main()方法方法: :創(chuàng)建了一個(gè)創(chuàng)建了一個(gè)ChatServerChatServer對(duì)象,對(duì)象,并通過調(diào)用構(gòu)造方法來創(chuàng)建并通過調(diào)用構(gòu)造方法來創(chuàng)建ServerSocketServerSocket對(duì)象,以監(jiān)聽端口對(duì)象,以監(jiān)聽端口5000050000上的連接請(qǐng)求,如果連接成功上的連接請(qǐng)求,如果連接成功, , ChatServerChatServer進(jìn)入一個(gè)無進(jìn)入一個(gè)無限循環(huán)中,交替

34、調(diào)用限循環(huán)中,交替調(diào)用ServerSocketServerSocket的的accept() accept() 方法來等待連方法來等待連接請(qǐng)求,同時(shí)啟動(dòng)后臺(tái)線程處理連接(接請(qǐng)求,同時(shí)啟動(dòng)后臺(tái)線程處理連接(accept()accept()返回的請(qǐng)求)。返回的請(qǐng)求)。n后臺(tái)線程由后臺(tái)線程由CommunicationThreadCommunicationThread繼承的繼承的start()start()方法開始,并方法開始,并執(zhí)行執(zhí)行CommunicationThreadCommunicationThread的的run()run()方法中的代碼。方法中的代碼。 一旦一旦run()run()方法運(yùn)行,

35、線程將向當(dāng)前連接的客戶應(yīng)用發(fā)送用戶號(hào)方法運(yùn)行,線程將向當(dāng)前連接的客戶應(yīng)用發(fā)送用戶號(hào)clientIDclientID,接著循環(huán)讀此用戶發(fā)送來的聊天信息,接著循環(huán)讀此用戶發(fā)送來的聊天信息, ,并轉(zhuǎn)發(fā)給當(dāng)并轉(zhuǎn)發(fā)給當(dāng)前參與聊天的各個(gè)用戶,直到此用戶發(fā)出信息前參與聊天的各個(gè)用戶,直到此用戶發(fā)出信息“stop chat”stop chat”為止。為止。n運(yùn)行運(yùn)行ChatChatServerServer.class.class后,就可以運(yùn)行多個(gè)后,就可以運(yùn)行多個(gè)ChatClientChatClient程序。程序。 3713.3.5 13.3.5 多線程實(shí)現(xiàn)多用戶網(wǎng)上聊天多線程實(shí)現(xiàn)多用戶網(wǎng)上聊天 例例13-9

36、 13-9 客戶端聊天程序的實(shí)現(xiàn)客戶端聊天程序的實(shí)現(xiàn). .n客戶端聊天程序是一個(gè)客戶端聊天程序是一個(gè)AppletApplet。功能:。功能:n提供客戶聊天界面,用于輸入信息和顯示信息;提供客戶聊天界面,用于輸入信息和顯示信息;n接受通過服務(wù)器轉(zhuǎn)發(fā)的其它客戶聊天信息并顯示。接受通過服務(wù)器轉(zhuǎn)發(fā)的其它客戶聊天信息并顯示。n兩個(gè)客戶端聊天程序的界面兩個(gè)客戶端聊天程序的界面: : 3813.4 13.4 基于數(shù)據(jù)報(bào)套接字方式的客戶基于數(shù)據(jù)報(bào)套接字方式的客戶/ /服務(wù)器通信服務(wù)器通信 n數(shù)據(jù)報(bào)套接字:n無連接的的數(shù)據(jù)傳遞方式。n它的傳輸速度快,n但不能保證所有數(shù)據(jù)都能到達(dá)目的地,所以一般用于非重要的數(shù)據(jù)傳

37、輸。n與數(shù)據(jù)報(bào)套接字相關(guān)的有三個(gè)類,位于包。nDatagramPacket類:用來創(chuàng)建數(shù)據(jù)包nDatagramSocket:用于發(fā)送和接收數(shù)據(jù)包的套接字nMulticastSocket:描繪了能進(jìn)行多點(diǎn)傳送的套接字,3913.4.1 13.4.1 DatagramPacketDatagramPacket類類n使用數(shù)據(jù)報(bào)方式首先將數(shù)據(jù)打包. DategramPacket類用來創(chuàng)建數(shù)據(jù)包。 數(shù)據(jù)包分有兩種:n要發(fā)送數(shù)據(jù)的數(shù)據(jù)包,該數(shù)據(jù)包有要到達(dá)的目的地址;n用來接收數(shù)據(jù)的數(shù)據(jù)包。 (1)要?jiǎng)?chuàng)建接受數(shù)據(jù)包,使用DatagramPackett類的構(gòu)造方法: DatagramPacket(byte ib

38、uft,int ilength) ibuf:接受數(shù)據(jù)包的存儲(chǔ)數(shù)據(jù)的緩沖區(qū), ilength:從傳遞過來的數(shù)據(jù)包中讀取的字節(jié)數(shù)。4013.4.1 13.4.1 DatagramPacketDatagramPacket類類(2)要?jiǎng)?chuàng)建發(fā)送數(shù)據(jù)包,使用DatagramPacket類的構(gòu)造方法: DatagramPacket(byt ibuf,int ilength,InetAddrss iaddr,int port) ibuf:要發(fā)送數(shù)據(jù)的緩沖區(qū); ilength:發(fā)送數(shù)據(jù)的字節(jié)數(shù); iaddr:數(shù)據(jù)包要傳遞到的目標(biāo)地址; iport:目標(biāo)地址的程序接受數(shù)據(jù)包的端口號(hào)。4113.4.1 13.4.1

39、 DatagramPacketDatagramPacket類類nDatagramPacket數(shù)據(jù)包對(duì)象的操作方法,以獲取數(shù)據(jù)包的信息:(1)netAddrss getAddrss() 獲得數(shù)據(jù)包要發(fā)送的目標(biāo)地址(2)bytegetData() 獲得數(shù)據(jù)包中的數(shù)據(jù)(3)public int getLength() 獲得數(shù)據(jù)包中數(shù)據(jù)的長(zhǎng)度(4)int getPOrt( ) 獲得數(shù)據(jù)包中的目標(biāo)地址的主機(jī)端口號(hào) 4213.4.2 13.4.2 DatagramSocketDatagramSocket類類 n發(fā)送和接收數(shù)據(jù)包,需要發(fā)送和接收數(shù)據(jù)包的DatagramSocket對(duì)象,用DatagramSo

40、cket類構(gòu)造此對(duì)象。nDatagramSocket類的構(gòu)造方法如下:(1)Datagramsocket(): 用本地機(jī)上任何一個(gè)可用的端口,創(chuàng)建一個(gè)發(fā)送或接收數(shù)據(jù)包的套接字。(2)DatagramSocket(int port) 用一個(gè)指定的端口,創(chuàng)建一個(gè)發(fā)送/接受數(shù)據(jù)包的套接字。 4313.4.2 13.4.2 DatagramSocketDatagramSocket類類nDatagramSocket對(duì)象的方法: (1) void receive(Datagrampacket p) :接收數(shù)據(jù)包。(2) void send(DatagramPacket p):發(fā)送數(shù)據(jù)包。 (3) int

41、getLocalPort( ):得到本地機(jī)的端口。4413.4.3 13.4.3 基于數(shù)據(jù)報(bào)基于數(shù)據(jù)報(bào)套接字的套接字的客戶客戶/ /服務(wù)器的通信應(yīng)用實(shí)例服務(wù)器的通信應(yīng)用實(shí)例n基于數(shù)據(jù)報(bào)套接字的方式下,服務(wù)器應(yīng)用程序和客戶機(jī)應(yīng)用程序之間發(fā)送和接收信息。完成的功能:n在客戶端應(yīng)用程序中,用戶在文本框中輸入一行信息,按下回車鍵后,會(huì)將此行信息發(fā)送到服務(wù)器上。n服務(wù)器接受到此信息后,將此信心在服務(wù)器的GUI界面上顯示,并完成將此行信息發(fā)回到客戶機(jī)上。n客戶即收到此信息后,即將此信息顯示。 45例例13-1013-10服務(wù)器應(yīng)用程序的實(shí)現(xiàn)服務(wù)器應(yīng)用程序的實(shí)現(xiàn). . Server.java中完成:n構(gòu)造方法:n建立了GUI界面,顯示接收到的數(shù)據(jù)包,n建立了的服務(wù)器套接字DatagramSocket對(duì)象,并將服務(wù)器套接字綁定在端口5000上。n方法waitForPackets(),用無限循環(huán)等待客戶發(fā)送過來的數(shù)據(jù)分組。n建立一個(gè)接收數(shù)據(jù)包DatagramPacket對(duì)象,n用socket的方法receive等待數(shù)據(jù)包到達(dá)服務(wù)器,此方法的調(diào)用一直阻塞,直到分組到來,則將分組存儲(chǔ)到receivePacket中

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論