Java程序設(shè)計教程課件 第8章 網(wǎng)絡(luò)通信程序設(shè)計_第1頁
Java程序設(shè)計教程課件 第8章 網(wǎng)絡(luò)通信程序設(shè)計_第2頁
Java程序設(shè)計教程課件 第8章 網(wǎng)絡(luò)通信程序設(shè)計_第3頁
Java程序設(shè)計教程課件 第8章 網(wǎng)絡(luò)通信程序設(shè)計_第4頁
Java程序設(shè)計教程課件 第8章 網(wǎng)絡(luò)通信程序設(shè)計_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第8章

網(wǎng)絡(luò)通信程序設(shè)計

教學(xué)導(dǎo)航教學(xué)目標(biāo)了解網(wǎng)絡(luò)通信的基本概念和Java網(wǎng)絡(luò)通信的支持機制了解基于TCP的通信、基于UDP的通信和基于URL的通信的實現(xiàn)方法掌握服務(wù)器端與客戶端套接字的創(chuàng)建與連接方法學(xué)會設(shè)計基于TCP單向通信的網(wǎng)絡(luò)應(yīng)用程序?qū)W會設(shè)計基于TCP雙向通信的網(wǎng)絡(luò)應(yīng)用程序?qū)W會設(shè)計基于TCP多客戶端與服務(wù)器通信的網(wǎng)絡(luò)應(yīng)用程序教學(xué)重點服務(wù)器端與客戶端套接字的創(chuàng)建及連接方法基于TCP雙向通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計基于TCP多客戶端與服務(wù)器通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計

身臨其境

在線客服與客戶互動交流的界面如圖8-1所示,客服可以通過該界面與客戶進行實時互動交流。石頭剪子布小游戲的操作界面如圖8-2所示,單擊【重新開始】按鈕,可以重新開始玩石頭剪子布小游戲。

圖8-1

在線客服與客戶互動交流的界面

圖8-2

石頭剪子布小游戲的操作界面

前導(dǎo)知識【知識8-1】認(rèn)知網(wǎng)絡(luò)通信的基本概念在進行網(wǎng)絡(luò)編程之前,有必要了解網(wǎng)絡(luò)通信的基本概念,主要包括IP地址、端口、協(xié)議(其中TCP/IP和UDP為兩項重要協(xié)議,單獨介紹)等。為了實現(xiàn)兩臺計算機通信,必須有一條網(wǎng)絡(luò)線路連接兩臺計算機,如圖8-3所示。服務(wù)器是指提供信息的計算機或者程序,客戶端是指請求信息的計算機或程序,網(wǎng)絡(luò)用于連接服務(wù)器與客戶端,實現(xiàn)相互通信。圖8-3

客戶端、服務(wù)器和網(wǎng)絡(luò)

前導(dǎo)知識【知識8-1】認(rèn)知網(wǎng)絡(luò)通信的基本概念(1)IP地址互聯(lián)網(wǎng)中連接了無數(shù)的服務(wù)器和客戶端,但它們并不是處于無序狀態(tài),而是每一臺主機都有唯一的地址,作為該主機在互聯(lián)網(wǎng)中的唯一標(biāo)志,這個地址稱為網(wǎng)際協(xié)議(InternetProtocol,IP)地址。IP地址是一種在Internet上給主機編址的方式。IP地址由4個十進制數(shù)組成,每個數(shù)的取值范圍是0~255,各數(shù)之間用一個點號“.”分隔,如。(2)端口端口(Port)是計算機數(shù)據(jù)I/O的接口。例如,個人計算機上都有的串行口,它是I/O設(shè)備上的一個物理接口。計算機接入通信網(wǎng)絡(luò)或Internet時也需要一個端口,但這個端口不是物理端口,而是一個由16位數(shù)標(biāo)識的邏輯端口,即一個假想的連接裝置,且這個端口是TCP/IP的一部分,通過這個端口可以進行數(shù)據(jù)I/O。端口號是一個16位的二進制數(shù),其范圍是0~65535。在實際應(yīng)用中,計算機中的1~1024端口被保留為系統(tǒng)使用,在Java程序中不應(yīng)使用這些保留端口,而應(yīng)該使用1025~65535端口中的一個來進行通信,以免發(fā)生端口沖突。如圖8-4所示,HTTP服務(wù)器一般使用80端口,F(xiàn)TP服務(wù)器一般使用21端口,客戶端1通過80端口才可以連接到服務(wù)器系統(tǒng)的HTTP服務(wù)器,而客戶端2通過21端口才可以連接到服務(wù)器系統(tǒng)的FTP服務(wù)器。圖8-4

端口示意

前導(dǎo)知識【知識8-1】認(rèn)知網(wǎng)絡(luò)通信的基本概念(3)協(xié)議為了保證兩臺以上的計算機之間能正確通信,必須有某種計算機都遵守的規(guī)則和約定,將這種規(guī)則和約定稱為協(xié)議(Protocol)。協(xié)議是描述數(shù)據(jù)交換時必須遵循的規(guī)則和數(shù)據(jù)格式。網(wǎng)絡(luò)協(xié)議規(guī)定了在網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)類型,并規(guī)定了怎樣解釋這些數(shù)據(jù)類型和怎樣請求傳輸這些數(shù)據(jù)。在Internet中控制復(fù)雜服務(wù)的協(xié)議有很多,其中較為常用的協(xié)議有FTP(文件傳送協(xié)議,端口號為21)、HTTP(超文本傳送協(xié)議,端口號為80)、SMTP(簡單郵件傳送協(xié)議,端口號為25)、POPv3(郵局協(xié)議第3版,端口號為110)。(4)TCP/IP傳輸控制協(xié)議(TransmissionControlProtocol,TCP)是一種基于連接的傳輸層協(xié)議,它為兩臺計算機提供了點對點的可靠數(shù)據(jù)流,保證從連接的一個端點發(fā)送的數(shù)據(jù)能夠以正確的順序到達(dá)連接的另一個端點。TCP與IP一起使用時,將兩者合稱為TCP/IP。TCP負(fù)責(zé)數(shù)據(jù)或文件的分組與重組,IP負(fù)責(zé)發(fā)送與接收數(shù)據(jù)或文件。數(shù)據(jù)或文件在網(wǎng)絡(luò)中傳輸時會被分成許多塊,將這些塊稱為包(Packet)。TCP是可靠的、面向連接的協(xié)議,非常適用于可靠性要求比較高的場合。(5)UDP用戶數(shù)據(jù)報協(xié)議(UserDatagramProtocol,UDP)是應(yīng)用層提供的一種簡單、高效的用戶數(shù)據(jù)傳輸服務(wù),但是它并不對連接狀態(tài)與數(shù)據(jù)損失做檢查。UDP從一個應(yīng)用程序向另一個應(yīng)用程序發(fā)送獨立的數(shù)據(jù)報(對應(yīng)TCP中的包),但并不保證這些數(shù)據(jù)報一定能到達(dá)另一個應(yīng)用程序,并且這些數(shù)據(jù)報的傳輸順序不可靠,即后發(fā)送的數(shù)據(jù)報可能先到達(dá)目的地。因此,使用UDP時,任何必需的可靠性都必須由應(yīng)用層自身提供。UDP適用于對通信可靠性要求較低且對通信性能要求較高的應(yīng)用,如域名服務(wù)(DomainNameService,DNS)、路由信息協(xié)議(RoutingInformationProtocol,RIP)、普通文件傳送協(xié)議(TrivialFileTransferProtocol,TFTP)等應(yīng)用層協(xié)議都建立在UDP的基礎(chǔ)上。

前導(dǎo)知識【知識8-2】認(rèn)知Java網(wǎng)絡(luò)通信的支持機制Java提供了強大的網(wǎng)絡(luò)支持功能,Java程序網(wǎng)絡(luò)通信功能的實現(xiàn)位于應(yīng)用層,Java的網(wǎng)絡(luò)編程API隱藏了網(wǎng)絡(luò)通信編程的一些煩瑣細(xì)節(jié),為用戶提供了與平臺無關(guān)的使用接口,使程序員不需要關(guān)心傳輸層中TCP/UDP的實現(xiàn)細(xì)節(jié)就能夠?qū)崿F(xiàn)網(wǎng)絡(luò)編程。Java支持網(wǎng)絡(luò)通信的類位于包中,其中URL類、URLConnection類、Socket類和ServerSocket類使用TCP實現(xiàn)網(wǎng)絡(luò)通信,DatagramPacket類、DatagramSocket類、MulticastSocket類使用UDP實現(xiàn)網(wǎng)絡(luò)通信。生活中,我們通常將可以用來插插頭的裝置稱為插座,其一般用于連接電器與電源,與此類似,網(wǎng)絡(luò)程序中的套接字(Socket)用于將應(yīng)用程序與端口連接起來。套接字是一個軟件實現(xiàn),是一個假想的連接裝置,如圖8-5所示。

圖8-5

套接字

前導(dǎo)知識【知識8-2】認(rèn)知Java網(wǎng)絡(luò)通信的支持機制Java主要提供了兩種網(wǎng)絡(luò)支持機制。(1)基于URL的通信編程Java支持使用統(tǒng)一資源定位符(UniformResourceLocator,URL)訪問網(wǎng)絡(luò)資源,這種方法適用于訪問Internet,尤其是WWW上的資源。Java提供了使用URL訪問網(wǎng)絡(luò)資源的類,使用戶不需要考慮URL中各種協(xié)議的處理過程,就可以獲得URL資源。(2)基于套接字的通信編程套接字表示應(yīng)用程序與網(wǎng)絡(luò)之間的接口,套接字通信過程是基于TCP/IP中的傳輸層接口套接字實現(xiàn)的。Java提供了對應(yīng)套接字機制的一組類,并支持流和數(shù)據(jù)報兩種通信過程,程序設(shè)計者只需創(chuàng)建Socket類對象,即可使用套接字。在使用基于TCP的雙向通信時,網(wǎng)絡(luò)中的兩個應(yīng)用程序之間必須先建立一個連接,這個連接的兩個端點稱為套接字。從應(yīng)用編程的角度來看,應(yīng)用程序可以將一個輸入流或輸出流綁定到某一個套接字上,讀寫這些I/O流即可實現(xiàn)基于TCP的通信。如圖8-6所示,如果要向套接字的輸出流寫數(shù)據(jù),則只需另一方從套接字的輸入流中讀取數(shù)據(jù)。圖8-6

套接字流

前導(dǎo)知識【知識8-2】認(rèn)知Java網(wǎng)絡(luò)通信的支持機制套接字通信機制有兩種:基于TCP的通信機制和基于UDP的通信機制。在基于TCP的通信機制中,通信雙方在開始時必須進行一次連接過程,通過建立一條通信鏈路提供可靠的字節(jié)流服務(wù)。在基于UDP的通信機制中,通信雙方不存在連接過程,一次網(wǎng)絡(luò)I/O以一個數(shù)據(jù)報形式進行,且每次網(wǎng)絡(luò)I/O可以和不同主機的不同進程同時進行?;赨DP的通信機制的開銷較小,但提供的數(shù)據(jù)傳輸服務(wù)不可靠,不能保證數(shù)據(jù)報一定能到達(dá)目的地。Java同時支持基于TCP和基于UDP的這兩種通信機制,并且在這兩種機制中都采用了套接字表示通信過程中的端點。在基于TCP的通信機制中,包中的Socket類和ServerSocket類分別表示連接的客戶端和服務(wù)器端;在基于UDP的通信機制中,DatagramSocket類表示發(fā)送和接收數(shù)據(jù)包的端點。當(dāng)不同計算機中的兩個程序要進行網(wǎng)絡(luò)通信時,無論是哪一種機制都需要知道遠(yuǎn)程主機的地址或主機名,以及端口號,且網(wǎng)絡(luò)通信中的服務(wù)器端必須運行程序等待連接或等待接收數(shù)據(jù)報。

前導(dǎo)知識【知識8-3】認(rèn)知基于TCP的通信(1)客戶端編程模式Socket類提供了以下重載的構(gòu)造方法在客戶端程序中創(chuàng)建Socket類的實例對象。①Socket(Stringhost,intport)。②Socket(InetAddressaddress,intport)。③Socket(Stringhost,intport,InetAddresslocalAddress,intlocalPort)。④Socket(InetAddressaddress,intport,InetAddresslocalAddress,intlocalPort)。上述Socket類的構(gòu)造方法中各個參數(shù)的含義如下:host表示服務(wù)器主機名;port表示服務(wù)器的端口號;address表示服務(wù)器的IP地址;localAddress表示本地主機的IP地址;localPort表示本地主機的端口號?;赥CP通信的客戶端編程模式的基本流程如下。①

客戶端程序通過指定的主機名(或者InetAddress的實例對象)和端口號構(gòu)造一個套接字。②

調(diào)用Socket類的getInputStream()方法和getOutputStream()方法分別打開與該套接字關(guān)聯(lián)的輸入流和輸出流,依照服務(wù)程序約定的協(xié)議讀取輸入流中的數(shù)據(jù)或?qū)?shù)據(jù)寫入輸出流。③

依次關(guān)閉I/O流和套接字。

前導(dǎo)知識【知識8-3】認(rèn)知基于TCP的通信(2)服務(wù)器端編程模式ServerSocket類也提供了多種重載的構(gòu)造方法以在程序中創(chuàng)建ServerSocket類的實例對象。①ServerSocket(intport):創(chuàng)建一個服務(wù)器套接字,并將其綁定到指定端口上。②ServerSocket(intport,intbacklog):首先創(chuàng)建一個服務(wù)器套接字,然后將其綁定到指定的端口上,并指出連接請求隊列的最大長度。在ServerSocket類中最重要的方法是accept(),該方法可以建立并返回一個已與客戶端程序連接的套接字?;赥CP通信的服務(wù)器端編程模式的基本流程如下。①

服務(wù)器端程序通過指定的監(jiān)聽端口創(chuàng)建一個ServerSocket類的實例對象,然后調(diào)用該對象的accept()方法。②

調(diào)用accept()方法程序會發(fā)生阻塞,直至有一個客戶端程序發(fā)送連接請求到服務(wù)器端程序監(jiān)聽的端口。服務(wù)器端程序接收到連接請求后,將分配一個新端口號建立與客戶端程序的連接并返回該連接的一個套接字。③

服務(wù)器端程序可以調(diào)用該套接字的getInputStream()方法和getOutputStream()方法獲取與客戶端程序的連接關(guān)聯(lián)的輸入流和輸出流,并依照預(yù)先約定的協(xié)議讀取輸入流中的數(shù)據(jù)或?qū)?shù)據(jù)寫入輸出流。④

完成所有的通信后,服務(wù)器端程序依次關(guān)閉所有的輸入流、輸出流、已建立連接的套接字以及用于監(jiān)聽的套接字。

前導(dǎo)知識【知識8-4】認(rèn)知基于UDP的通信UDP是傳輸層的無連接通信協(xié)議,數(shù)據(jù)報是一種在網(wǎng)絡(luò)中獨立傳播的包含地址信息的消息。UDP采用數(shù)據(jù)報進行通信。數(shù)據(jù)報是否可以到達(dá)目的地,以什么順序到達(dá)目的地,到達(dá)目的地時內(nèi)容是否依然正確等是未經(jīng)校驗的。因而UDP是一種不可靠的點對點通信,適用于對通信性能要求較高但對通信可靠性要求較低的應(yīng)用。包為實現(xiàn)UDP通信提供了兩個類:DatagramSocket類和DatagramPacket類。其中,DatagramSocket類對象代表一個被傳送的UDP數(shù)據(jù)報,DatagramSocket類封裝了被傳送數(shù)據(jù)報的內(nèi)容、源主機和端口號、目的主機和端口號等信息,且支持該UDP套接字發(fā)送和接收UDP數(shù)據(jù)報;DatagramPacket類對象代表一個用于傳送UDP數(shù)據(jù)報的UDP套接字?;赨DP的通信是將數(shù)據(jù)報從一個發(fā)送方傳輸給單個接收方。在基于UDP實現(xiàn)客戶端/服務(wù)器通信時,無論是在客戶端還是服務(wù)器端,首先都要創(chuàng)建一個DatagramSocket對象,用來表示數(shù)據(jù)報通信的端點,然后使用DatagramPacket對象封裝數(shù)據(jù)報。UDP套接字面向一個個獨立的數(shù)據(jù)報,既可用于發(fā)送UDP數(shù)據(jù)報,又可用于接收UDP數(shù)據(jù)報。在創(chuàng)建DatagramSocket類的實例對象時,可以通過不同形式的構(gòu)造方法指定UDP套接字綁定的主機地址和端口號。

前導(dǎo)知識【知識8-4】認(rèn)知基于UDP的通信DatagramSocket類常用的構(gòu)造方法如下。①DatagramSocket():與本機任何可用的端口綁定。②DatagramSocket(intport):與指定的端口綁定。③DatagramSocket(intport,InetAddressaddress):與指定本機地址的端口綁定。DatagramPacket類既可以描述客戶端程序發(fā)送的UDP數(shù)據(jù)報,又可以描述服務(wù)器端程序接收的UDP數(shù)據(jù)報。DatagramPacket類常用的構(gòu)造方法如下。①DatagramPacket(byte[]buf,intlength)。②DatagramPacket(byte[]buf,intoffset,intlength)。③DatagramPacket(byte[]buf,intlength,InetAddressaddress,intport)。④DatagramPacket(byte[]buf,intoffset,intlength,InetAddressaddress,intport)。

前導(dǎo)知識【知識8-5】認(rèn)知基于URL的通信URL表示Internet上一個資源的引用或地址,Java網(wǎng)絡(luò)應(yīng)用程序也是使用URL來定位要訪問的Internet上的資源的。(1)熟悉URL地址URL地址使Java網(wǎng)絡(luò)應(yīng)用程序能夠在通信雙方之間以某種方式建立連接,從而完成相應(yīng)的操作。一個完整的URL的語法格式如下。<通信協(xié)議>://<主機名>:<端口號>/<文件名>①

通信協(xié)議:數(shù)據(jù)交換使用的協(xié)議,常用的有HTTP、FTP等。②

主機名:資源所在的計算機,它有兩種表示方法,即IP地址和域名。③

端口號:該計算機上的某個特定服務(wù),其有效范圍是0~65535。④

文件名:該資源在目的計算機上的位置,即路徑。(2)創(chuàng)建URL對象在包中定義的URL類提供了最簡單的網(wǎng)絡(luò)編程接口,只需使用一次方法調(diào)用即可下載URL對象指定的網(wǎng)絡(luò)資源的內(nèi)容。使用URL對象下載網(wǎng)絡(luò)資源內(nèi)容之前必須創(chuàng)建一個URL類的實例對象,URL類提供的重載形式的構(gòu)造方法如下。①publicURL(Stringprotocol,Stringhost,intport,Stringfile)。②publicURL(Stringprotocol,Stringhost,Stringfile)。③publicURL(Stringspec)。④publicURL(URLcontext,Stringspec)。

前導(dǎo)知識【知識8-5】認(rèn)知基于URL的通信(3)獲取URL對象的狀態(tài)URL類提供的獲取URL對象狀態(tài)的方法如表8-1所示,可以從一個字符串描述的URL地址中提取協(xié)議名、主機名、端口號和文件名等信息。(4)使用URL類的openStream()方法讀取URL地址標(biāo)識的資源內(nèi)容創(chuàng)建一個URL對象以后,可以通過URL類的openStream()方法獲取一個綁定到該URL地址資源的輸入流(java.io.InputStream)對象,并通過讀取該輸入流訪問整個資源的內(nèi)容。(5)使用URLConnection類的openConnection()方法實現(xiàn)對URL資源的讀/寫操作訪問一個指定的URL數(shù)據(jù),除了使用URL類的openStream()方法實現(xiàn)讀操作之外,還可以通過URLConnection類提供的openConnection()方法在應(yīng)用程序與URL之間創(chuàng)建一個連接,從而實現(xiàn)對URL所表示資源的讀/寫操作。URLConnection類提供多個進行連接設(shè)置和操作的方法,其中獲取連接上I/O流的方法如下,通過返回的I/O流可以實現(xiàn)對URL數(shù)據(jù)的讀/寫。①InputStreamgetInputStream()。②OutputStreamgetOutputStream()。方法名稱功能說明getProtocol()獲取該URL中的協(xié)議名getHost()獲取該URL中的主機名getPort()獲取該URL中的端口號,如果沒有設(shè)置端口,則返回-1getFile()獲取該URL中的文件名getRef()獲取該URL中文件的相對位置表8-1

URL類提供的獲取URL對象狀態(tài)的方法8.1服務(wù)器端與客戶端套接字的創(chuàng)建及連接8.2基于TCP單向通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計8.4基于TCP雙向通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計學(xué)習(xí)要點8.3基于TCP多客戶端與服務(wù)器通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計8.5基于UDP客戶端相互通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計任務(wù)8-1-1

創(chuàng)建并連接套接字【任務(wù)描述】編寫程序并完成以下任務(wù)。按事先指定的端口號創(chuàng)建服務(wù)器套接字。按待連接服務(wù)器的IP地址和端口號創(chuàng)建客戶端套接字,與服務(wù)器套接字連接,若與服務(wù)器套接字連接成功,則輸出提示信息。首先啟動服務(wù)器端的程序,然后啟動客戶端的程序。服務(wù)器端程序啟動成功后,監(jiān)聽客戶端的連接請求,若檢測到客戶端的連接請求,則創(chuàng)建新的套接字,并使其與客戶端套接字連接,而服務(wù)器繼續(xù)等待其他客戶端的連接請求??蛻舳藙?chuàng)建套接字后,將馬上向指定的IP地址及端口進行連接嘗試。服務(wù)器套接字與客戶端套接字連接成功后,就可以獲取套接字的輸入輸出流,進行數(shù)據(jù)交換。但本任務(wù)暫不要求進行數(shù)據(jù)交換。InetAddress類是與IP地址相關(guān)的類,利用此類可以獲取并輸出主機名、主機IP地址和本機的IP地址。任務(wù)8-1-1

創(chuàng)建并連接套接字【知識8-6】認(rèn)知創(chuàng)建并連接套接字的方法1.InetAddress類在基于TCP的網(wǎng)絡(luò)通信中,Java應(yīng)用程序需要直接使用IP地址或域名指定運行在Internet上的某一臺主機。包中定義的InetAddress類是一個IP地址或域名的抽象類。在創(chuàng)建InetAddress類的一個實例對象時,可以使用字符串表示的域名,也可以使用字節(jié)數(shù)組表示的IP地址。InetAddress類沒有提供普通的構(gòu)造方法,而是提供了用于獲取InetAddress實例對象的靜態(tài)方法。InetAddress類的常用方法如下。①publicsynchronizedstaticInetAddressgetLocalHost():返回本地主機的IntetAddress對象。②publicstaticInetAddressgetByName(Stringhost):獲取與參數(shù)host對應(yīng)的IntetAddress對象。③publicStringgetHostAddress():返回表示主機IP地址的字符串。④publicStringgetHostName():返回表示主機名的字符串。以上方法都會拋出UnknownHostException異常,這個異常會在主機不存在或網(wǎng)絡(luò)連接錯誤時發(fā)生,必須進行相應(yīng)的異常處理。任務(wù)8-1-1

創(chuàng)建并連接套接字【知識8-6】認(rèn)知創(chuàng)建并連接套接字的方法2.ServerSocket類ServerSocket類用于表示服務(wù)器套接字,通過指定的端口來等待套接字的連接。服務(wù)器套接字一次只與一個套接字進行連接,如果有多臺客戶端同時提出連接請求,則服務(wù)器套接字會將請求連接的客戶端套接字存入隊列中,并從隊列中取出一個套接字,使其與服務(wù)器套接字連接。所以隊列的大小即服務(wù)器可同時接收的連接請求數(shù)。如圖8-7所示,先按事先指定的端口號創(chuàng)建服務(wù)器套接字。服務(wù)器套接字等待客戶端的連接請求,并創(chuàng)建新的套接字使其與客戶端套接字連接,而本身繼續(xù)等待其他客戶端的連接請求。圖8-7

服務(wù)器套接字任務(wù)8-1-1

創(chuàng)建并連接套接字【知識8-6】認(rèn)知創(chuàng)建并連接套接字的方法(1)ServerSocket類的常用構(gòu)造方法如下。①publicServerSocket(intport)throwsIOException:使用指定的端口號創(chuàng)建服務(wù)器套接字。②publicServerSocket(intport,intbacklog)throwsIOException:使用指定的端口號和隊列大小創(chuàng)建服務(wù)器套接字。③publicServerSocket(intport,intbacklog,InetAddressbindAddr)throwsIOException:使用指定的端口號、隊列大小和IP地址創(chuàng)建服務(wù)器套接字。(2)ServerSocket類的常用方法如下。①publicSocketaccept()throwsIOException:等待客戶端的連接請求,若連接,則創(chuàng)建一個套接字,并將其返回。②publicvoidclose()throwsIOException:關(guān)閉服務(wù)器套接字。③publicbooleanisClosed():若服務(wù)器套接字成功關(guān)閉,則返回true,否則返回false。④publicInetAddressgetInetAddress():獲取服務(wù)器的IP地址和域名。⑤publicintgetLocalPort():獲取服務(wù)器套接字等待的端口號。⑥publicbooleanisBound():若服務(wù)器套接字已經(jīng)與某個套接字地址綁定,則返回true,否則返回false。任務(wù)8-1-1

創(chuàng)建并連接套接字【知識8-6】認(rèn)知創(chuàng)建并連接套接字的方法3.Socket類Socket類用于表示套接字,使用Socket類時,需要指定待連接服務(wù)器的IP地址及端口號??蛻舳藙?chuàng)建套接字以后,將馬上與指定的IP地址及端口號進行連接嘗試。服務(wù)器套接字會創(chuàng)建新的套接字,使其與客戶端套接字連接。服務(wù)器套接字與客戶端套接字成功連接后,就可以獲取套接字的輸入輸出流,進行數(shù)據(jù)交換了。(1)Socket類的常用構(gòu)造方法如下。①publicSocket(Stringhost,intport)throwsUnknownHostException,IOException:創(chuàng)建連接指定主機與端口號的服務(wù)器套接字。②publicSocket(InetAddressaddress,intport)throwsIOException:創(chuàng)建連接指定IP地址和端口號的服務(wù)器套接字。(2)Socket類的常用方法如下。①publicInetAddressgetInetAddress():獲取被連接的服務(wù)器地址。②publicintgetPort():獲取端口號。③publicInetAddressgetLocalAddress():獲取本地地址。④publicintgetLocalPort():獲取本地端口號。⑤publicInputStreamgetInputStream()throwsIOException:獲取套接字的輸入流。⑥publicOutputStreamgetOutputStream()throwsIOException:獲取套接字的輸出流。⑦publicsynchronizedvoidclose()throwsIOException:關(guān)閉套接字。⑧publicbooleanisClosed():判斷套接字是否關(guān)閉。⑨publicbooleanisConnected():若套接字被連接,則返回true,否則返回false。8.1服務(wù)器端與客戶端套接字的創(chuàng)建及連接8.2基于TCP單向通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計8.4基于TCP雙向通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計學(xué)習(xí)要點8.3基于TCP多客戶端與服務(wù)器通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計8.5基于UDP客戶端相互通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計任務(wù)8-1-2

實現(xiàn)單客戶端向服務(wù)器發(fā)送字符串【任務(wù)描述】編寫一個單向通信的Java程序,實現(xiàn)客戶端向服務(wù)器發(fā)送字符串的功能,即實現(xiàn)單向通信功能。只要求客戶端向服務(wù)器發(fā)送字符串,不要求服務(wù)器向客戶端發(fā)送任何信息??蛻舳颂捉幼峙c服務(wù)器套接字連接成功后,通信程序會通過客戶端套接字的輸出流發(fā)送數(shù)據(jù),并使用服務(wù)器套接字的輸入流接收數(shù)據(jù)。任務(wù)8-1-2

實現(xiàn)單客戶端向服務(wù)器發(fā)送字符串【知識8-7】認(rèn)知單客戶端向服務(wù)器發(fā)送字符串的實現(xiàn)方法圖8-10所示為客戶端到服務(wù)器的數(shù)據(jù)流,客戶端套接字與服務(wù)器套接字成功連接后,程序會通過客戶端套接字的輸出流發(fā)送數(shù)據(jù),并使用服務(wù)器套接字的輸入流接收數(shù)據(jù)。在輸入輸出操作中,常用的類有PrintWriter類、getOutputStream類、getInputStream類和BufferedReader類。其中,PrintWriter類具有自動刷新功能,能保證數(shù)據(jù)按時輸出。服務(wù)器端程序從與客戶端連接的套接字中讀取字符串,并將其輸出到屏幕上。服務(wù)器將反復(fù)進行以下過程。①等待客戶端連接請求。②連接客戶端。③接收并讀取字符串。④斷開與客戶端的連接。⑤返回至步驟①??蛻舳颂捉幼质紫纫晒B接服務(wù)器,然后使用其輸出流向服務(wù)器發(fā)送數(shù)據(jù)。

圖8-10

客戶端到服務(wù)器的數(shù)據(jù)流8.1服務(wù)器端與客戶端套接字的創(chuàng)建及連接8.2基于TCP單向通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計8.4基于TCP雙向通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計學(xué)習(xí)要點8.3基于TCP多客戶端與服務(wù)器通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計8.5基于UDP客戶端相互通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計任務(wù)8-1-3

實現(xiàn)單客戶端和服務(wù)器相互通信【任務(wù)描述】編寫一個雙向通信的Java程序,實現(xiàn)客戶端與服務(wù)器的相互通信。當(dāng)客戶端向服務(wù)器發(fā)送文件名并請求返回文件內(nèi)容時,服務(wù)器將請求的文件內(nèi)容回送給客戶端。【知識8-8】認(rèn)知單客戶端和服務(wù)器互相通信的實現(xiàn)方法客戶端與服務(wù)器雙向通信的過程如圖8-11所示。這里使用DataInputStream類和DataOutputStream類代替BufferedReader類和PrintWriter類,使用getInputStream類的readUTF()方法讀取數(shù)據(jù),使用getOutputStream類的writeUTF()方法寫入數(shù)據(jù)。圖8-11

客戶端與服務(wù)器雙向通信的過程8.1服務(wù)器端與客戶端套接字的創(chuàng)建及連接8.2基于TCP單向通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計8.4基于TCP雙向通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計學(xué)習(xí)要點8.3基于TCP多客戶端與服務(wù)器通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計8.5基于UDP客戶端相互通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計任務(wù)8-2

通過多客戶端與服務(wù)器通信設(shè)計石頭剪子布游戲【任務(wù)描述】編寫多客戶端與服務(wù)器通信的Java程序,實現(xiàn)石頭剪子布游戲,具體要求如下。(1)服務(wù)器收到客戶端的連接請求時,會創(chuàng)建新的套接字,并使之與提出連接請求的客戶端連接,并啟動負(fù)責(zé)數(shù)據(jù)交換的線程與客戶端實現(xiàn)數(shù)據(jù)交換。(2)使用一個Vector對象作為套接字管理器,負(fù)責(zé)管理套接字的個數(shù)及連接狀態(tài),套接字管理器將與客戶端連接的套接字添加到列表中,在客戶端斷開連接后,再將對應(yīng)的套接字從列表中刪除,以保證客戶端連接數(shù)與列表中添加的套接字?jǐn)?shù)一致。(3)使用線程實現(xiàn)客戶端與服務(wù)器的通信,客戶端從石頭、剪子、布中做出選擇并完成“單擊”動作后,客戶端將向服務(wù)器發(fā)送信息,并等待服務(wù)器的應(yīng)答。服務(wù)器的線程收到客戶端發(fā)送的選擇信息后,向客戶端傳送0~2的整型隨機數(shù)。客戶端收到服務(wù)器的應(yīng)答后,將比較客戶端與服務(wù)器的選擇,并將結(jié)果顯示在屏幕上。(4)各個客戶端之間不需要進行通信。游戲規(guī)則如下:布優(yōu)先于石頭,石頭優(yōu)先于剪子,剪子優(yōu)先于布。任務(wù)8-2

通過多客戶端與服務(wù)器通信設(shè)計石頭剪子布游戲【知識8-9】多客戶端與服務(wù)器互相通信的實現(xiàn)方法多客戶端與服務(wù)器的通信如圖8-12所示。每個客戶端都與服務(wù)器的一個套接字進行連接,但是各個客戶端之間并不進行通信。服務(wù)器收到客戶端的連接請求時,會創(chuàng)建新的套接字,并使之與提出連接請求的客戶端連接,然后啟動線程與客戶端進行數(shù)據(jù)交換。套接字管理器使用Vector對象管理套接字的個數(shù)及連接狀態(tài)。圖8-12

多客戶端與服務(wù)器的通信8.1服務(wù)器端與客戶端套接字的創(chuàng)建及連接8.2基于TCP單向通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計8.4基于TCP雙向通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計學(xué)習(xí)要點8.3基于TCP多客戶端與服務(wù)器通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計8.5基于UDP客戶端相互通信的網(wǎng)絡(luò)應(yīng)用程序設(shè)計任務(wù)8-3

設(shè)計基于UDP的聊天程序【任務(wù)描述】編寫基于UDP的聊天程序,該程序不分服務(wù)器和客戶端,在兩臺主機上運行的程序基本相同。如果用1臺計算機測試,則需使用不同的端口。UDP通信不同于流式通信方式,它是建立在IP上的無連接協(xié)議,使用數(shù)據(jù)報傳輸信息,雖然傳輸信息的可靠性無法保證,但開銷小、傳輸速度快。使用UDP也可以實現(xiàn)客戶端/服務(wù)器程序,UDP的套接字編程不提供監(jiān)聽功能,也就是說,通信雙方更為平等,面對的接口是完全一樣的。為了使用UDP實現(xiàn)客戶端/服務(wù)器結(jié)構(gòu),可以使用DatagramSocket類中的receive()方法實現(xiàn)類似監(jiān)聽的功能。Java提供了對UDP通信的支持,包提供了DatagramSocket和DatagramPacket兩個類來支持?jǐn)?shù)據(jù)報通信,DatagramSocket類用于在程序之間傳送數(shù)據(jù)報的通信連接,DatagramPacket類用于表示一個數(shù)據(jù)報。用數(shù)據(jù)報方式實現(xiàn)數(shù)據(jù)通信時,無論是客戶端還是服務(wù)器,都要先建立一個DatagramSocket對象,用來接收或發(fā)送數(shù)據(jù),再使用DatagramPacket類對象作為傳輸數(shù)據(jù)的載體。任務(wù)8-3

設(shè)計基于UDP的聊天程序【知識8-10】認(rèn)知DatagramSocket類的構(gòu)造方法DatagramSocket類的構(gòu)造方法如下。(1)DatagramSocket():創(chuàng)建與本地主機某個可用端口相連的DatagramSocket對象。(2)DatagramSocket(intport):創(chuàng)建與指定端口相連的DatagramSocket對象。(3)DatagramSocket(intport,

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論