Java程序設(shè)計(jì)教程(第三版)課件 項(xiàng)目十一 Java網(wǎng)絡(luò)編程_第1頁(yè)
Java程序設(shè)計(jì)教程(第三版)課件 項(xiàng)目十一 Java網(wǎng)絡(luò)編程_第2頁(yè)
Java程序設(shè)計(jì)教程(第三版)課件 項(xiàng)目十一 Java網(wǎng)絡(luò)編程_第3頁(yè)
Java程序設(shè)計(jì)教程(第三版)課件 項(xiàng)目十一 Java網(wǎng)絡(luò)編程_第4頁(yè)
Java程序設(shè)計(jì)教程(第三版)課件 項(xiàng)目十一 Java網(wǎng)絡(luò)編程_第5頁(yè)
已閱讀5頁(yè),還剩43頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

項(xiàng)目十一Java網(wǎng)編程【項(xiàng)目描述】

網(wǎng)絡(luò)編程技術(shù)是當(dāng)前一種主流的編程技術(shù),隨著互聯(lián)網(wǎng)的發(fā)展,網(wǎng)絡(luò)編程技術(shù)在實(shí)際開(kāi)發(fā)中大量地應(yīng)用到。本項(xiàng)目介紹了網(wǎng)絡(luò)編程的基礎(chǔ)知識(shí),演示了TCP和UDP兩種網(wǎng)絡(luò)通訊方式在Java語(yǔ)言中的實(shí)現(xiàn)。

【任務(wù)分解】本項(xiàng)目可分解為以下四個(gè)任務(wù):1、網(wǎng)絡(luò)編程概述。2、TCP網(wǎng)絡(luò)編程。3、UDP網(wǎng)絡(luò)編程。4、多線程與網(wǎng)絡(luò)編程的綜合應(yīng)用。任務(wù)一

網(wǎng)絡(luò)編程概述

【任務(wù)描述】

任務(wù)11-1:InetAddress類(lèi)的應(yīng)用:分別使用域名和IP創(chuàng)建InetAddress類(lèi)的對(duì)象,并調(diào)用類(lèi)中相關(guān)的方法獲取對(duì)象的域名和IP。

【必備知識(shí)】1.計(jì)算機(jī)網(wǎng)絡(luò)的幾個(gè)術(shù)語(yǔ)(1)IP地址:為了能夠方便的識(shí)別網(wǎng)絡(luò)上的每個(gè)設(shè)備,網(wǎng)絡(luò)中的每個(gè)設(shè)備都會(huì)有一個(gè)唯一的數(shù)字標(biāo)識(shí),這個(gè)數(shù)字標(biāo)識(shí)就是IP地址。(2)域名:由于IP地址不容易記憶,為了方便記憶,使用域名(DomainName),例如。一個(gè)IP地址可以對(duì)應(yīng)多個(gè)域名,一個(gè)域名只能對(duì)應(yīng)一個(gè)IP地址。(3)端口:在同一個(gè)計(jì)算機(jī)中每個(gè)程序?qū)?yīng)唯一的端口(port),一個(gè)計(jì)算機(jī)可以同時(shí)運(yùn)行多個(gè)程序。2.網(wǎng)絡(luò)編程概述(1)網(wǎng)絡(luò)編程概念:網(wǎng)絡(luò)編程就是兩個(gè)或多個(gè)程序之間的數(shù)據(jù)交換。Java中有專(zhuān)門(mén)的API實(shí)現(xiàn)發(fā)送和接受數(shù)據(jù)功能,我們只需調(diào)用即可。(2)客戶(hù)端和服務(wù)器:網(wǎng)絡(luò)通訊基于“請(qǐng)求--響應(yīng)”模型。在網(wǎng)絡(luò)通訊中,主動(dòng)發(fā)起通訊的程序被稱(chēng)作客戶(hù)端程序,簡(jiǎn)稱(chēng)客戶(hù)端(Client),而在通訊中等待連接的程序被稱(chēng)作服務(wù)器端程序,簡(jiǎn)稱(chēng)服務(wù)器(Server)。常見(jiàn)的網(wǎng)絡(luò)編程結(jié)構(gòu)有C/S和B/S。其中C/S結(jié)構(gòu)是“客戶(hù)端/服務(wù)器(Client/Server)”結(jié)構(gòu)。而B(niǎo)/S是“瀏覽器/服務(wù)器(Browser/Server)”,B/S結(jié)構(gòu)不使用專(zhuān)用的客戶(hù)端,而使用通用的客戶(hù)端(如瀏覽器)。3.網(wǎng)絡(luò)通訊方式在現(xiàn)有的網(wǎng)絡(luò)中,網(wǎng)絡(luò)通訊方式主要有兩種:TCP(傳輸控制協(xié)議)方式和UDP(用戶(hù)數(shù)據(jù)報(bào)協(xié)議)方式。4.包網(wǎng)絡(luò)編程有關(guān)的基本API位于包中,該包中包含了基本的網(wǎng)絡(luò)編程實(shí)現(xiàn),該包中既包含基礎(chǔ)的網(wǎng)絡(luò)編程類(lèi),也包含封裝后的專(zhuān)門(mén)處理WEB相關(guān)業(yè)務(wù)的處理類(lèi)。解題思路】 任務(wù)11-1:1.聲明InetAddress對(duì)象inet1、inet2、inet3。使用域名創(chuàng)建對(duì)象,并輸出該對(duì)象。2.使用IP創(chuàng)建對(duì)象,并輸出該對(duì)象。3.調(diào)用InetAddress類(lèi)的getLocalHost()方法獲得本機(jī)地址對(duì)象,并輸出。4.利用getHostName(),獲得對(duì)象中存儲(chǔ)的域名。5.利用getHostAddress(),獲得對(duì)象中存儲(chǔ)的IP?!救蝿?wù)透析】任務(wù)11-1源代碼:參見(jiàn)InetAddressDemo.java【課堂提問(wèn)】★在同一個(gè)計(jì)算機(jī)中,同一個(gè)端口可以分配給兩個(gè)不同的應(yīng)用程序嗎?★IP地址和域名的區(qū)別與聯(lián)系?【現(xiàn)場(chǎng)演練】把任務(wù)11-1代碼中的域名改為谷歌、新浪或其他的網(wǎng)址,看看得到怎樣的運(yùn)行結(jié)果。12.2 URL

在WWW上,每一信息資源都有統(tǒng)一的且唯一的地址,該地址就叫URL(UniformResourceLocator),它是WWW的統(tǒng)一資源定位標(biāo)志。URL由4部分組成:資源類(lèi)型、存放資源的主機(jī)域名、資源文件名和端口。例如,http://:80/top.html,其中http表示HTTP協(xié)議,是清華大學(xué)的主機(jī)域名,top.html為資源文件名,80為HTTP協(xié)議的缺省端口號(hào)。協(xié)議名和端口號(hào)之間是有一定的聯(lián)系的,如HTTP協(xié)議的缺省端口號(hào)是80,F(xiàn)TP協(xié)議的缺省端口號(hào)是21等。所以,一般情況下URL地址可以只包含有傳輸協(xié)議、主機(jī)名和文件名。任務(wù)二TCP網(wǎng)絡(luò)編程【任務(wù)描述】任務(wù)11-2:實(shí)現(xiàn)TCP方式網(wǎng)絡(luò)編程,實(shí)現(xiàn)的功能是客戶(hù)端向服務(wù)器端發(fā)送問(wèn)候信息,并將服務(wù)器端的反饋顯示到控制臺(tái)。要求分別演示在客戶(hù)端和服務(wù)器端的實(shí)現(xiàn)步驟?!颈貍渲R(shí)】1.TCP網(wǎng)絡(luò)編程TCP方式是可靠性、雙向性、持續(xù)性、點(diǎn)對(duì)點(diǎn)傳輸,在通訊的過(guò)程中保持連接。Java中使用Socket完成TCP程序的開(kāi)發(fā),Socket是指“套接字”,指在兩臺(tái)計(jì)算機(jī)上運(yùn)行的兩個(gè)程序之間的一個(gè)雙向通信的連接點(diǎn),每一端稱(chēng)為一個(gè)Socket。服務(wù)器端使用ServerSocket,客戶(hù)端使用Socket,每一個(gè)Socket代表一個(gè)客戶(hù)端。Socket所要完成的通信就是基于連接的通信,建立連接所需的程序分別運(yùn)行在客戶(hù)端和服務(wù)器端。Socket類(lèi)與ServerSocket類(lèi)構(gòu)造方法功能說(shuō)明ServerSocket(intport)在指定的端口創(chuàng)建一個(gè)ServerSocket對(duì)象

ServerSocket(intport,intcount)在指定的端口創(chuàng)建一個(gè)ServerSocket對(duì)象并說(shuō)明服務(wù)器所能支持的最大鏈接數(shù)

Socket(InetAddressaddress,intport)使用指定地址和端口創(chuàng)建一個(gè)Socket對(duì)象

Socket(InetAddressaddress,intport,booleanstream)使用指定地址和端口創(chuàng)建一個(gè)Socket對(duì)象(若布爾數(shù)值為true,則是采用流式通信方式)Socket(Stringhost,intport)使用指定主機(jī)和端口創(chuàng)建一個(gè)Socket對(duì)象Socket(Stringhost,intport,booleanstream)使用指定主機(jī)和端口創(chuàng)建一個(gè)Socket對(duì)象(若布爾數(shù)值為true,則是采用流式通信方式)2.TCP客戶(hù)端編程步驟客戶(hù)端的網(wǎng)絡(luò)編程步驟一般由3個(gè)步驟組成:(1)建立網(wǎng)絡(luò)連接。(2)數(shù)據(jù)交換。(3)關(guān)閉網(wǎng)絡(luò)連接。3.TCP服務(wù)器端編程步驟服務(wù)器端的網(wǎng)絡(luò)編程步驟一般由4個(gè)步驟組成:(1)監(jiān)聽(tīng)端口:創(chuàng)建一個(gè)ServerSocket對(duì)象就是創(chuàng)建了一個(gè)監(jiān)聽(tīng)服務(wù),例如,要?jiǎng)?chuàng)建一個(gè)指定端口的ServerSocket對(duì)象:ServerSocketss=newServerSocket(9999);(2)獲得連接:當(dāng)客戶(hù)端連接到服務(wù)器端時(shí),服務(wù)器端就獲得一個(gè)連接,這個(gè)連接包含客戶(hù)端的信息,如客戶(hù)端IP地址等。(3)數(shù)據(jù)交換:服務(wù)器端的數(shù)據(jù)交換步驟是首先接收客戶(hù)端發(fā)送過(guò)來(lái)的數(shù)據(jù),然后進(jìn)行邏輯處理,再把處理以后的結(jié)果數(shù)據(jù)發(fā)送給客戶(hù)端。(4)關(guān)閉連接:當(dāng)服務(wù)器程序關(guān)閉時(shí),需要關(guān)閉服務(wù)器端,服務(wù)器監(jiān)聽(tīng)的端口以及占用的內(nèi)存可以釋放出來(lái)?!窘忸}思路】

任務(wù)11-2:客戶(hù)端實(shí)現(xiàn)步驟為:1.首先要建立連接。2.進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)交換。3.數(shù)據(jù)交換完成,關(guān)閉網(wǎng)絡(luò)連接,釋放網(wǎng)絡(luò)連接所占用的各種資源。用close()方法關(guān)閉網(wǎng)絡(luò)連接。服務(wù)器端實(shí)現(xiàn)的步驟為:

1.監(jiān)聽(tīng)端口。

2.獲得連接。實(shí)現(xiàn)獲得連接的代碼是:

Socketsocket=ss.accept();accept()表示接收客戶(hù)端連接,該方法是一個(gè)阻塞方法,也就是當(dāng)沒(méi)有連接到達(dá)時(shí),程序?qū)⒆枞钡竭B接到達(dá)時(shí)才執(zhí)行該行代碼。

3.關(guān)閉服務(wù)器端連接。完成服務(wù)器端通信后,要關(guān)閉連接,用close()方法。獲得連接后,后續(xù)的編程步驟和客戶(hù)端類(lèi)似?!救蝿?wù)透析】

任務(wù)11-2:1.客戶(hù)端代碼為:SocketClientDemo11_2.javapackagetask11_2;importjava.io.*;import.*;publicclassSocketClientDemo11_2{ publicstaticvoidmain(String[]args){ Socketsocket=null; InputStreamis=null; OutputStreamos=null; Stringdata="你好!來(lái)自客戶(hù)端的問(wèn)候";//要發(fā)送的內(nèi)容 try{ socket=newSocket("localhost",8800);//指定連接主機(jī)及端口 //發(fā)送數(shù)據(jù) os=socket.getOutputStream(); os.write(data.getBytes()); //接收數(shù)據(jù) is=socket.getInputStream(); byte[]b=newbyte[1024];

intn=is.read(b); //輸出反饋數(shù)據(jù) System.out.println("服務(wù)器反饋:"+newString(b,0,n)); }catch(Exceptione){ e.printStackTrace(); }finally{ try{ //關(guān)閉流和連接 is.close(); os.close(); socket.close(); }catch(Exceptione){ e.printStackTrace(); } } }}在該任務(wù)案例中,Socket類(lèi)代表客戶(hù)端連接,在客戶(hù)端連接建立了一個(gè)連接到IP地址為localhost(本機(jī))端口號(hào)碼為8800的TCP類(lèi)型的網(wǎng)絡(luò)連接,然后獲得連接的輸出流對(duì)象,將需要發(fā)送的字符串data轉(zhuǎn)換為byte數(shù)組寫(xiě)入到輸出流中,由系統(tǒng)將輸出流中的數(shù)據(jù)發(fā)送出去,如果需要強(qiáng)制發(fā)送,可以調(diào)用輸出流對(duì)象的flush()方法實(shí)現(xiàn)。2.服務(wù)器端代碼:SocketServerDemo11_2.javapackagetask11_2;importjava.io.*;import.*;publicclassSocketServerDemo11_2{ publicstaticvoidmain(String[]args){ ServerSocketserverSocket=null; Socketsocket=null; OutputStreamos=null; InputStreamis=null; try{ //服務(wù)器在8800端口上進(jìn)行監(jiān)聽(tīng) serverSocket=newServerSocket(8800); System.out.println("服務(wù)器端已經(jīng)啟動(dòng)了,等待客戶(hù)端的連接..."); //接收客戶(hù)端連接 socket=serverSocket.accept(); //獲得客戶(hù)端發(fā)送的信息

is=socket.getInputStream(); byte[]b=newbyte[1024]; intn=is.read(b); //輸出 System.out.println("客戶(hù)端發(fā)送過(guò)來(lái)的內(nèi)容是:"+newString(b,0,n)); //向客戶(hù)端發(fā)送反饋內(nèi)容 os=socket.getOutputStream(); os.write(b,0,n); }catch(Exceptione){ e.printStackTrace(); }finally{ try{ //關(guān)閉流和連接 os.close(); is.close(); socket.close(); serverSocket.close(); }catch(Exceptione){ e.printStackTrace(); } } }}

在本任務(wù)案例中,ServerSocket類(lèi)代表服務(wù)器端連接,在服務(wù)器端中建立了一個(gè)監(jiān)聽(tīng)當(dāng)前計(jì)算機(jī)8800號(hào)端口的服務(wù)器端Socket連接,然后獲得客戶(hù)端發(fā)送過(guò)來(lái)的連接,如果有連接到達(dá)時(shí),讀取連接中發(fā)送過(guò)來(lái)的內(nèi)容,并將發(fā)送的內(nèi)容在控制臺(tái)進(jìn)行輸出,輸出完成以后將客戶(hù)端發(fā)送的內(nèi)容再反饋給客戶(hù)端。最后關(guān)閉流和連接對(duì)象,程序結(jié)束。

圖11.2任務(wù)11-2服務(wù)器端程序的運(yùn)行結(jié)果圖11.3任務(wù)11-2客戶(hù)端程序的運(yùn)行結(jié)果【課堂提問(wèn)】★TCP網(wǎng)絡(luò)編程方式中,主要是利用哪兩個(gè)類(lèi)來(lái)實(shí)現(xiàn)的?★簡(jiǎn)單說(shuō)說(shuō)在TCP網(wǎng)絡(luò)編程中,客戶(hù)端和服務(wù)器端各自的編程步驟。【現(xiàn)場(chǎng)演練】任務(wù)11-2是實(shí)現(xiàn)在同一部計(jì)算機(jī)中進(jìn)行發(fā)送和接收信息的,請(qǐng)修改源代碼,完成在兩部計(jì)算機(jī)之間收發(fā)信息。任務(wù)三UDP網(wǎng)絡(luò)編程【任務(wù)描述】任務(wù)11-3:該任務(wù)的功能是實(shí)現(xiàn)將客戶(hù)端程序的系統(tǒng)時(shí)間發(fā)送給服務(wù)器端,服務(wù)器端接收到時(shí)間以后,向客戶(hù)端反饋?zhàn)址癏elloJava”??蛻?hù)端程序的輸出結(jié)果為:服務(wù)器端反饋為:“HelloJava”?!颈貍渲R(shí)】1.UDP網(wǎng)絡(luò)編程UDP通信是一種無(wú)連接的數(shù)據(jù)報(bào)通信,采用數(shù)據(jù)報(bào)通信協(xié)議UDP(UserDatagramProtocol)。按照這個(gè)協(xié)議,兩個(gè)系統(tǒng)在進(jìn)行通信時(shí),不要建立連接,優(yōu)點(diǎn)是它發(fā)送數(shù)據(jù)的速度很快,而缺點(diǎn)是數(shù)據(jù)較易丟失,例如我們使用的紅外線數(shù)據(jù)傳輸就是采用UDP的傳輸協(xié)議。DatagramSocket常用的方法:DatagramPacket常用的方法:2.UDP客戶(hù)端編程步驟UDP客戶(hù)端編程由4個(gè)步驟組成,分別是:建立連接、發(fā)送數(shù)據(jù)、接收數(shù)據(jù)和關(guān)閉連接。(1)建立連接。(2)發(fā)送數(shù)據(jù)。(3)接收數(shù)據(jù)。(4)關(guān)閉連接。3.UDP服務(wù)器端編程步驟

(1)建立一個(gè)連接。(2)接收客戶(hù)端發(fā)送過(guò)來(lái)的數(shù)據(jù)。(3)對(duì)從客戶(hù)端接收到的數(shù)據(jù)進(jìn)行邏輯處理,然后將處理結(jié)果發(fā)送回客戶(hù)端。(4)關(guān)閉服務(wù)器端連接?!窘忸}思路】 任務(wù)11-3:

請(qǐng)參照必備知識(shí)中介紹的UDP客戶(hù)端編程步驟和UDP服務(wù)器端編程步驟

實(shí)現(xiàn)?!救蝿?wù)透析】任務(wù)11-3:

1.客戶(hù)端源代碼:請(qǐng)參見(jiàn)UDPClientDemo11_3.java2.服務(wù)器端源代碼:請(qǐng)參見(jiàn)UDPServerDemo11_3.java【課堂提問(wèn)】★UDP方式的編程主要由哪兩個(gè)類(lèi)實(shí)現(xiàn)的?★TCP和UDP兩種網(wǎng)絡(luò)編程方式最主要的區(qū)別是什么?【現(xiàn)場(chǎng)演練】將任務(wù)11-3修改為在兩部計(jì)算機(jī)之間收發(fā)信息,編譯并運(yùn)行程序代碼,觀察程序的輸出結(jié)果。任務(wù)四多線程與網(wǎng)絡(luò)編程的綜合應(yīng)用【任務(wù)描述】任務(wù)11-4:完成一個(gè)猜數(shù)字的控制臺(tái)小

溫馨提示

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

評(píng)論

0/150

提交評(píng)論