第10章 網(wǎng)絡(luò)編程_補充案例_第1頁
第10章 網(wǎng)絡(luò)編程_補充案例_第2頁
第10章 網(wǎng)絡(luò)編程_補充案例_第3頁
第10章 網(wǎng)絡(luò)編程_補充案例_第4頁
第10章 網(wǎng)絡(luò)編程_補充案例_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、-作者xxxx-日期xxxx第10章 網(wǎng)絡(luò)編程_補充案例【精品文檔】第十章 補充案例案例10-1 使用InetAddress類獲取與IP信息一、案例描述 1、 考核知識點編號:00110004名稱:InetAddress類2、 練習(xí)目標(biāo)Ø 掌握InetAddress類的相關(guān)APIØ 掌握如何使用InetAddress類中的方法獲取計算機的主機名和IP地址等信息。3、 需求分析InetAddress類中提供了一系列與IP地址相關(guān)的方法,利用這些方法可以獲取到指定計算機的主機名、IP地址以及連接狀態(tài)等信息。為了讓初學(xué)者掌握InetAddress類中常用方法的使用,本案例將針對如

2、何通過InetAddress類中的方法獲取計算機的IP地址、主機名等功能進(jìn)行演示。4、 設(shè)計思路(實現(xiàn)原理)1) 編寫Example01類。2) 在main()方法中,通過InetAddress類的靜態(tài)方法getLocalHost()創(chuàng)建實例對象,并通過該對象完成獲取計算機主機名和計算機IP地址的操作。3) 分別將獲取到的主機名和IP地址輸出。二、案例實現(xiàn)import .InetAddress;import .UnknownHostException;public class Example01 public static void main(String args) throws Unkno

3、wnHostException /獲取本機的IP地址InetAddress address = InetAddress.getLocalHost();/以字符串形式返回IP地址String ip = address.getHostAddress();/獲取此IP地址的主機名String name = address.getHostName();System.out.println("本機的ip地址是:"+ip);System.out.println("本機的hostName是:"+name);運行結(jié)果如圖10-1所示。圖10-1 運行結(jié)果三、案例總結(jié)1、

4、InetAddress類用于封裝一個IP地址,并提供了一系列與IP地址相關(guān)的方法,其中,getByName(String host)方法表示獲取指定主機的IP地址,常用于獲取遠(yuǎn)程計算機的IP信息,isReachable(int timeout)方法表示判斷指定的時間內(nèi)IP地址是否可以到達(dá),常用于測試網(wǎng)絡(luò)是否通暢。2、InetAddress類的getHostName()方法是用來獲取IP地址的主機名,而為什么有的時候獲取到的不是主機名而是域名?案例10-2 UDP網(wǎng)絡(luò)程序一、案例描述 1、 考核知識點編號:00110006名稱:DatagramPacket類和DatagramSocket類2、

5、練習(xí)目標(biāo)Ø 掌握DatagramPacket類和DatagramSocket類的作用Ø 掌握如何使用DatagramPacket類和DatagramSocket類通過編寫簡單的UDP程序。3、 需求分析DatagramPacket用于封裝UDP通信中發(fā)送或者接收的數(shù)據(jù),DatagramSocket類用于發(fā)送和接收DatagramPacket數(shù)據(jù)包。為了讓初學(xué)者掌握這兩個類的作用,本案例將通過DatagramPacket類和DatagramSocket類實現(xiàn)簡單的數(shù)據(jù)通信,并通過觀察兩個命令行窗口中數(shù)據(jù)輸出的先后順序,從而掌握UDP網(wǎng)絡(luò)程序中接收端和發(fā)送端的執(zhí)行原理。4、 設(shè)

6、計思路(實現(xiàn)原理)1) 編寫數(shù)據(jù)接收類ReceiveDemo,在ReceiveDemo類中創(chuàng)建接收端的Socket服務(wù)對象,并依次編寫創(chuàng)建數(shù)據(jù)包、調(diào)用接收方法、解析數(shù)據(jù)包并向命令行輸出內(nèi)容,釋放資源等操作。2) 編寫數(shù)據(jù)發(fā)送類SendDemo,在SendDemo類中創(chuàng)建發(fā)送端的Socket服務(wù)對象,并依次編寫創(chuàng)建數(shù)據(jù)包,打包數(shù)據(jù)、發(fā)送數(shù)據(jù)、釋放資源等操作。3) 依次執(zhí)行ReceiveDemo和SendDemo類,觀察命令行輸出變化。二、案例實現(xiàn)UDP網(wǎng)絡(luò)程序中接受數(shù)據(jù)端,代碼如下:import java.io.IOException;import .DatagramPacket;import

7、.DatagramSocket;import .InetAddress;public class ReceiveDemo public static void main(String args) throws IOException / 創(chuàng)建接收端Socket服務(wù)對象DatagramSocket ds = new DatagramSocket(12306);/ 創(chuàng)建數(shù)據(jù)包(接收容器)byte bys = new byte1024;DatagramPacket dp = new DatagramPacket(bys, bys.length);System.out.println("接受

8、數(shù)據(jù)服務(wù)已打開,等待接受數(shù)據(jù)");/ 調(diào)用接收方法ds.receive(dp);/ 解析數(shù)據(jù)包,把數(shù)據(jù)顯示在控制臺InetAddress address = dp.getAddress();String ip = address.getHostAddress();byte bys2 = dp.getData();int length = dp.getLength();String s = new String(bys2, 0, length);System.out.println(ip + "*" + s);System.out.println("接受數(shù)

9、據(jù)完畢,接受數(shù)據(jù)服務(wù)關(guān)閉");/ 釋放資源ds.close();UDP網(wǎng)絡(luò)程序中發(fā)送數(shù)據(jù)端,代碼如下:import java.io.IOException;import .DatagramPacket;import .DatagramSocket;import .InetAddress;public class SendDemo public static void main(String args) throws IOException / 創(chuàng)建發(fā)送端Socket服務(wù)對象DatagramSocket ds = new DatagramSocket();/ 創(chuàng)建數(shù)據(jù),并把數(shù)據(jù)打包St

10、ring str = "hello,udp,我來了"byte bys = str.getBytes();int length = bys.length;InetAddress address = InetAddress.getByName("127.0.0.1");int port = 12306;DatagramPacket dp = new DatagramPacket(bys, length, address, port);System.out.println("發(fā)送數(shù)據(jù)服務(wù)已打開");System.out.println(&q

11、uot;發(fā)送數(shù)據(jù)是:"+str);/ 發(fā)送數(shù)據(jù)ds.send(dp);System.out.println("發(fā)送完畢,關(guān)閉服務(wù)");/ 釋放資源ds.close();運行接受端程序,運行結(jié)果如圖10-2所示。圖10-2 運行結(jié)果運行發(fā)送端程序,運行結(jié)果如圖10-3所示。圖10-3 運行結(jié)果觀察接受端控制臺的輸出,運行結(jié)果如圖10-4所示。圖10-4 運行結(jié)果從圖10-2中可以看出,當(dāng)運行ReceiveDemo類時,程序會在receive()方法處停頓,并一直處于停滯狀態(tài)。當(dāng)運行SendDemo類時,ReceiveDemo類中的receive()方法接受到了數(shù)據(jù),

12、并向下執(zhí)行直到程序結(jié)束。 三、案例總結(jié)1、 在創(chuàng)建發(fā)送端的DatagramSocket對象時,可以不指定端口號,而案例中指定端口號目的就是,為了每次運行時接收端的getPort()方法返回值都是一致的,否則發(fā)送端的端口號由系統(tǒng)自動分配,接收端的getPort()方法的返回值每次都不同。2、 運行例程ReceiveDemo,有時會出現(xiàn)如圖10-5所示的異常。圖10-5 運行結(jié)果出現(xiàn)圖中所示的情況,是因為在一臺計算機中,一個端口號上只能運行一個程序,而我們編寫的UDP程序所使用的端口號已經(jīng)被其它的程序占用。遇到這種情況,可以在命令行窗口輸入"netstat -anb"命令來查看

13、當(dāng)前計算機端口占用情況,具體如圖10-6所示。圖10-6 端口占用情況案例10-3 多線程的UDP網(wǎng)絡(luò)程序一、案例描述 1、 考核知識點編號:00110007名稱:UDP案例2、 練習(xí)目標(biāo)Ø 通過編寫多線程的UDP網(wǎng)絡(luò)程序,掌握如何在單個窗口中實現(xiàn)接收與發(fā)送數(shù)據(jù)。3、 需求分析在上一個案例中,通過兩個命令行窗口輸出數(shù)據(jù)讓我們初步了解了單線程的UDP網(wǎng)絡(luò)程序,為了讓初學(xué)者更加直觀和深入的掌握網(wǎng)絡(luò)編程,本案例將整合多線程技術(shù),在同一個命令行窗口中同時實現(xiàn)接收和發(fā)送數(shù)據(jù)的功能。4、 設(shè)計思路(實現(xiàn)原理)1) 編寫數(shù)據(jù)接收類ReceiveThread,該類實現(xiàn)了Runnable接口,重寫ru

14、n()方法實現(xiàn)不斷接受客戶端發(fā)送數(shù)據(jù)的功能。2) 編寫數(shù)據(jù)發(fā)送類SendThread,該類同樣實現(xiàn)了SendThread接口,重寫run()方法實現(xiàn)通過鍵盤錄入數(shù)據(jù),將數(shù)據(jù)向接收端發(fā)送的功能。3) 編寫測試類Example02,在main()方法中,同時啟動接收端和發(fā)送端程序。二、案例實現(xiàn)UDP網(wǎng)絡(luò)程序中接受數(shù)據(jù)端,代碼如下:import java.io.IOException;import .DatagramPacket;import .DatagramSocket;public class ReceiveThread implements Runnable public void run(

15、) try / 創(chuàng)建接收端Socket對象DatagramSocket ds = new DatagramSocket(10086);/ 創(chuàng)建數(shù)據(jù)包while (true) byte bys = new byte1024;DatagramPacket dp = new DatagramPacket(bys, bys.length);/接收數(shù)據(jù)ds.receive(dp);/ 解析數(shù)據(jù)String ip = dp.getAddress().getHostAddress();tLength();System.out.println("接收端:從" + ip + " 主

16、機接收到的數(shù)據(jù)是: " + s);if ("bye".equals(s) System.out.println("*聊天室關(guān)閉*");ds.close();break; catch (IOException e) e.printStackTrace();UDP網(wǎng)絡(luò)程序中發(fā)送數(shù)據(jù)端,代碼如下:import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import .DatagramPacket;import .Datagram

17、Socket;import .InetAddress;public class SendThread implements Runnable public void run() try / 創(chuàng)建發(fā)送端Socket對象DatagramSocket ds = new DatagramSocket();/ 封裝鍵盤錄入BufferedReader br = new BufferedReader(new InputStreamReader(System.in);/ 創(chuàng)建數(shù)據(jù),并打包String line = null;while (line = br.readLine() != null) byte

18、bys = line.getBytes();DatagramPacket dp = new DatagramPacket(bys, bys.length,InetAddress.getByName("172.16.26.21"), 10086);ds.send(dp);if ("bye".equals(line) / 釋放資源br.close();ds.close();break;/ 釋放資源br.close();ds.close(); catch (IOException e) e.printStackTrace();編寫測試類Example02,代碼

19、如下:public class Example02 public static void main(String args) SendThread st = new SendThread();ReceiveThread rt = new ReceiveThread();Thread t1 = new Thread(st);Thread t2 = new Thread(rt); t1.start();t2.start();運行Example02,依次鍵入“hello itcast”和“bye”后,結(jié)果如圖10-7所示。圖10-7 運行結(jié)果從圖10-7中可以看出,Example02類實現(xiàn)了在一個命

20、令行窗口中同時發(fā)送和接收數(shù)據(jù)的功能。并且當(dāng)發(fā)送端發(fā)送“bye”時,程序結(jié)束。三、案例總結(jié)1、 在網(wǎng)絡(luò)程序中,為了保證程序的穩(wěn)定性,服務(wù)器一般不會輕易關(guān)閉,所以在編寫服務(wù)端時,通常不會編寫關(guān)閉服務(wù)端的代碼。2、UDP之所以是一種不可靠的網(wǎng)絡(luò)協(xié)議,是因為UDP排除了信息可靠傳遞機制,將安全和排序等功能移交給上層應(yīng)用來完成,極大降低了執(zhí)行時間,使速度得到了保證。思考:既然UDP一直被業(yè)內(nèi)稱為不可靠的網(wǎng)絡(luò)協(xié)議。但是,自1980年發(fā)布以來,UDP協(xié)議仍然繼續(xù)在主流應(yīng)用中發(fā)揮著作用。那么,請想一想身邊有哪些應(yīng)用程序使用的是UDP協(xié)議。案例10-4 TCP網(wǎng)絡(luò)程序一、案例描述 1、 考核知識點編號:0011

21、0008/00110009名稱:ServerSocket類/Socket類2、 練習(xí)目標(biāo)Ø 通過編寫簡單的TCP程序,掌握ServerSocket、Socket類的具體用法。3、 需求分析ServerSocket用于負(fù)責(zé)監(jiān)聽某臺計算機的某個端口號接收來自客戶端的請求,是網(wǎng)絡(luò)程序中的服務(wù)器端,Socket用于根據(jù)指定的IP地址和端口號向ServerSocket端交互,是網(wǎng)絡(luò)程序中的客戶端。為了讓初學(xué)者掌握這兩個類的作用,本案例將通過ServerSocket類和Socket類實現(xiàn)簡單的數(shù)據(jù)通信,并通過觀察兩個命令行窗口中數(shù)據(jù)輸出的先后順序,從而增加對TCP網(wǎng)絡(luò)程序中客戶端和服務(wù)端的執(zhí)行原

22、理。4、 設(shè)計思路(實現(xiàn)原理)1) 編寫服務(wù)器端類ServerDemo,在ServerDemo類中創(chuàng)建服務(wù)器端ServerSocket對象,并依次編寫監(jiān)聽連接、獲取輸入流,打印讀取數(shù)據(jù),釋放資源等操作。2) 編寫客戶端類ClientDemo,在ClientDemo類中創(chuàng)建客戶端Socket對象,并分別編寫建立連接、獲取輸出流,釋放資源等步驟。3) 依次執(zhí)行ServerDemo和ClientDemo類,觀察命令行輸出變化。二、案例實現(xiàn)TCP網(wǎng)絡(luò)程序中服務(wù)端,代碼如下:import java.io.IOException;import java.io.InputStream;import .Ser

23、verSocket;import .Socket;public class ServerDemo public static void main(String args) throws IOException / 創(chuàng)建服務(wù)器端Socket對象ServerSocket ss = new ServerSocket(10010);System.out.println("服務(wù)端已開啟,等待客戶端發(fā)送數(shù)據(jù)。");/ 監(jiān)聽連接Socket s = ss.accept();/阻塞/ 獲取輸入流,讀取數(shù)據(jù),并顯示InputStream is = s.getInputStream();byt

24、e bys = new byte1024;int len = is.read(bys);/阻塞String client = new String(bys, 0, len);System.out.println(client);/ 釋放資源System.out.println("已接收客戶端發(fā)送的數(shù)據(jù),服務(wù)端關(guān)閉。");s.close();TCP網(wǎng)絡(luò)程序中客戶端,代碼如下:import java.io.IOException;import java.io.OutputStream;import .Socket;public class ClientDemo public s

25、tatic void main(String args) throws IOException / 創(chuàng)建客戶端的Socket對象,建立連接Socket s = new Socket("172.16.26.21", 10010);System.out.println("客戶端已打開,等待發(fā)送數(shù)據(jù)。");/ 獲取輸出流,寫數(shù)據(jù)即可OutputStream os = s.getOutputStream();os.write("hello,tcp,我來了".getBytes();/ 釋放資源System.out.println("發(fā)

26、送完畢,關(guān)閉客戶端服務(wù)。");s.close();首先開啟服務(wù)端程序,運行結(jié)果如圖10-8所示。圖10-8 運行結(jié)果然后開啟客戶端程序,運行結(jié)果如圖10-9所示。圖10-9 運行結(jié)果此時,再觀察服務(wù)端控制臺的輸出,運行結(jié)果如圖10-10所示。圖10-10 運行結(jié)果三、案例總結(jié)1、在使用TCP協(xié)議編寫網(wǎng)絡(luò)程序時,服務(wù)端和客戶端的端口號必須保持一致,否則會出現(xiàn)下列錯誤。圖10-112、通過學(xué)習(xí)UDP網(wǎng)絡(luò)程序和TCP網(wǎng)絡(luò)程序,會發(fā)現(xiàn)了他們都能實現(xiàn)數(shù)據(jù)的交互,那么他們有什么區(qū)別呢? UDP和TCP協(xié)議的主要區(qū)別是兩者在如何實現(xiàn)信息的可靠傳遞方面不同。TCP協(xié)議中包含了專門的傳遞保證機制,當(dāng)數(shù)

27、據(jù)接收方收到發(fā)送方傳來的信息時,會自動向發(fā)送方發(fā)出確認(rèn)消息;發(fā)送方只有在接收到該確認(rèn)消息之后才繼續(xù)傳送其它信息,否則將一直等待直到收到確認(rèn)信息為止。與TCP不同,UDP協(xié)議并不提供數(shù)據(jù)傳送的保證機制。如果在從發(fā)送方到接收方的傳遞過程中出現(xiàn)數(shù)據(jù)報的丟失,協(xié)議本身并不能做出任何檢測或提示。因此,通常人們把UDP協(xié)議稱為不可靠的傳輸協(xié)議。3、除了數(shù)據(jù)的安全性和完整性以外,TCP和UDP還有以下幾點不同之處。l 有序數(shù)據(jù)傳輸l 重發(fā)丟失的數(shù)據(jù)包l 舍棄重復(fù)的數(shù)據(jù)包l 無錯誤數(shù)據(jù)傳輸l 阻塞/流量控制l 面向連接(確認(rèn)有創(chuàng)建三方交握,連接已創(chuàng)建才作傳輸。)案例10-5 使用TCP網(wǎng)絡(luò)程序上傳圖片一、案例

28、描述 1、 考核知識點編號:00110011名稱:TCP案例文件上傳2、 練習(xí)目標(biāo)Ø 掌握如何使用TCP協(xié)議完成文件的網(wǎng)絡(luò)傳輸功能。3、 需求分析由于TCP網(wǎng)絡(luò)程序能夠保證傳輸數(shù)據(jù)的完整性和安全性,所以大部分的服務(wù)器都會采用TCP協(xié)議來實現(xiàn)文件上傳的功能。為了讓初學(xué)者掌握如何使用TCP協(xié)議完成文件上傳功能,本案例將通過使用TCP網(wǎng)絡(luò)協(xié)議,實現(xiàn)圖片上傳的功能。4、 設(shè)計思路(實現(xiàn)原理)1) 編寫服務(wù)器類PicUploadServer,該類包含一個Socket類型的私有屬性,并提供了該屬性的有參構(gòu)造方法。PicUploadServer類實現(xiàn)Runnable接口,重寫run()方法,在ru

29、n()方法內(nèi)讀取客戶端上傳的圖片,并將圖片存入服務(wù)器指定文件夾中。2) 編寫客戶端類PicUpLoadClient,該類實現(xiàn)了讀取指定圖片,向指定端口發(fā)送圖片數(shù)據(jù)的功能。3) 編寫測試類Example03,在main()方法中,通過指定的端口號創(chuàng)建ServerSocket對象,并編寫死循環(huán),在死循環(huán)中,通過ServerSocket對象獲取Socket對象,并開啟線程服務(wù)。二、案例實現(xiàn)TCP網(wǎng)絡(luò)程序中服務(wù)端,代碼如下:import java.util.*;import java.io.*;import .*;class PicUploadServer implements Runnable/包含

30、Socket類型的私有屬性private Socket s ;/包含Socket對象的有參構(gòu)造函數(shù)PicUploadServer (Socket s)this.s = s;public void run()tryFile dir = new File("d:upload");if(!dir.exists()dir.mkdirs();String filename = dir+File.separator+System.currentTimeMillis()+"itcast"+new Random().nextInt(100000)+".jpg&

31、quot;/讀取客戶端的字節(jié)數(shù)據(jù)InputStream in = s.getInputStream();byte bytes = new byte1024;int len = 0 ;/數(shù)據(jù)的目的FileOutputStream fos = new FileOutputStream(filename);while(len = in.read(bytes)!=-1)fos.write(bytes, 0, len);/回寫上傳成功OutputStream out = s.getOutputStream();out.write("上傳成功".getBytes();System.out.println("服務(wù)器已接收到文件");fos.close();s.close();catch(Exception e)e.printStackTrace();throw new RuntimeException("上傳失敗");TCP網(wǎng)絡(luò)程序中客戶端,代碼如下:import java.io.*;import .*;public class PicUpLoadClient public static void main(String args)throws Exception Socket

溫馨提示

  • 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

提交評論