




已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
博學(xué)谷讓IT教學(xué)更簡單,讓IT學(xué)習(xí)更有效第十章 補(bǔ)充案例案例10-1 使用InetAddress類獲取與IP信息一、案例描述 1、 考核知識點(diǎn)編號:00110004名稱:InetAddress類2、 練習(xí)目標(biāo) 掌握InetAddress類的相關(guān)API 掌握如何使用InetAddress類中的方法獲取計(jì)算機(jī)的主機(jī)名和IP地址等信息。3、 需求分析InetAddress類中提供了一系列與IP地址相關(guān)的方法,利用這些方法可以獲取到指定計(jì)算機(jī)的主機(jī)名、IP地址以及連接狀態(tài)等信息。為了讓初學(xué)者掌握InetAddress類中常用方法的使用,本案例將針對如何通過InetAddress類中的方法獲取計(jì)算機(jī)的IP地址、主機(jī)名等功能進(jìn)行演示。4、 設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 編寫Example01類。2) 在main()方法中,通過InetAddress類的靜態(tài)方法getLocalHost()創(chuàng)建實(shí)例對象,并通過該對象完成獲取計(jì)算機(jī)主機(jī)名和計(jì)算機(jī)IP地址的操作。3) 分別將獲取到的主機(jī)名和IP地址輸出。二、案例實(shí)現(xiàn)import .InetAddress;import .UnknownHostException;public class Example01 public static void main(String args) throws UnknownHostException /獲取本機(jī)的IP地址InetAddress address = InetAddress.getLocalHost();/以字符串形式返回IP地址String ip = address.getHostAddress();/獲取此IP地址的主機(jī)名String name = address.getHostName();System.out.println(本機(jī)的ip地址是:+ip);System.out.println(本機(jī)的hostName是:+name);運(yùn)行結(jié)果如圖10-1所示。圖10-1 運(yùn)行結(jié)果三、案例總結(jié)1、InetAddress類用于封裝一個IP地址,并提供了一系列與IP地址相關(guān)的方法,其中,getByName(String host)方法表示獲取指定主機(jī)的IP地址,常用于獲取遠(yuǎn)程計(jì)算機(jī)的IP信息,isReachable(int timeout)方法表示判斷指定的時間內(nèi)IP地址是否可以到達(dá),常用于測試網(wǎng)絡(luò)是否通暢。2、InetAddress類的getHostName()方法是用來獲取IP地址的主機(jī)名,而為什么有的時候獲取到的不是主機(jī)名而是域名?案例10-2 UDP網(wǎng)絡(luò)程序一、案例描述 1、 考核知識點(diǎn)編號:00110006名稱:DatagramPacket類和DatagramSocket類2、 練習(xí)目標(biāo) 掌握DatagramPacket類和DatagramSocket類的作用 掌握如何使用DatagramPacket類和DatagramSocket類通過編寫簡單的UDP程序。3、 需求分析DatagramPacket用于封裝UDP通信中發(fā)送或者接收的數(shù)據(jù),DatagramSocket類用于發(fā)送和接收DatagramPacket數(shù)據(jù)包。為了讓初學(xué)者掌握這兩個類的作用,本案例將通過DatagramPacket類和DatagramSocket類實(shí)現(xiàn)簡單的數(shù)據(jù)通信,并通過觀察兩個命令行窗口中數(shù)據(jù)輸出的先后順序,從而掌握UDP網(wǎng)絡(luò)程序中接收端和發(fā)送端的執(zhí)行原理。4、 設(shè)計(jì)思路(實(shí)現(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類,觀察命令行輸出變化。二、案例實(shí)現(xiàn)UDP網(wǎng)絡(luò)程序中接受數(shù)據(jù)端,代碼如下:import java.io.IOException;import .DatagramPacket;import .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(接受數(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ù)據(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ù)打包String str = hello,udp,我來了;byte bys = str.getBytes();int length = bys.length;InetAddress address = InetAddress.getByName();int port = 12306;DatagramPacket dp = new DatagramPacket(bys, length, address, port);System.out.println(發(fā)送數(shù)據(jù)服務(wù)已打開);System.out.println(發(fā)送數(shù)據(jù)是:+str);/ 發(fā)送數(shù)據(jù)ds.send(dp);System.out.println(發(fā)送完畢,關(guān)閉服務(wù));/ 釋放資源ds.close();運(yùn)行接受端程序,運(yùn)行結(jié)果如圖10-2所示。圖10-2 運(yùn)行結(jié)果運(yùn)行發(fā)送端程序,運(yùn)行結(jié)果如圖10-3所示。圖10-3 運(yùn)行結(jié)果觀察接受端控制臺的輸出,運(yùn)行結(jié)果如圖10-4所示。圖10-4 運(yùn)行結(jié)果從圖10-2中可以看出,當(dāng)運(yùn)行ReceiveDemo類時,程序會在receive()方法處停頓,并一直處于停滯狀態(tài)。當(dāng)運(yùn)行SendDemo類時,ReceiveDemo類中的receive()方法接受到了數(shù)據(jù),并向下執(zhí)行直到程序結(jié)束。 三、案例總結(jié)1、 在創(chuàng)建發(fā)送端的DatagramSocket對象時,可以不指定端口號,而案例中指定端口號目的就是,為了每次運(yùn)行時接收端的getPort()方法返回值都是一致的,否則發(fā)送端的端口號由系統(tǒng)自動分配,接收端的getPort()方法的返回值每次都不同。2、 運(yùn)行例程ReceiveDemo,有時會出現(xiàn)如圖10-5所示的異常。圖10-5 運(yùn)行結(jié)果出現(xiàn)圖中所示的情況,是因?yàn)樵谝慌_計(jì)算機(jī)中,一個端口號上只能運(yùn)行一個程序,而我們編寫的UDP程序所使用的端口號已經(jīng)被其它的程序占用。遇到這種情況,可以在命令行窗口輸入netstat -anb命令來查看當(dāng)前計(jì)算機(jī)端口占用情況,具體如圖10-6所示。圖10-6 端口占用情況案例10-3 多線程的UDP網(wǎng)絡(luò)程序一、案例描述 1、 考核知識點(diǎn)編號:00110007名稱:UDP案例2、 練習(xí)目標(biāo) 通過編寫多線程的UDP網(wǎng)絡(luò)程序,掌握如何在單個窗口中實(shí)現(xiàn)接收與發(fā)送數(shù)據(jù)。3、 需求分析在上一個案例中,通過兩個命令行窗口輸出數(shù)據(jù)讓我們初步了解了單線程的UDP網(wǎng)絡(luò)程序,為了讓初學(xué)者更加直觀和深入的掌握網(wǎng)絡(luò)編程,本案例將整合多線程技術(shù),在同一個命令行窗口中同時實(shí)現(xiàn)接收和發(fā)送數(shù)據(jù)的功能。4、 設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 編寫數(shù)據(jù)接收類ReceiveThread,該類實(shí)現(xiàn)了Runnable接口,重寫run()方法實(shí)現(xiàn)不斷接受客戶端發(fā)送數(shù)據(jù)的功能。2) 編寫數(shù)據(jù)發(fā)送類SendThread,該類同樣實(shí)現(xiàn)了SendThread接口,重寫run()方法實(shí)現(xiàn)通過鍵盤錄入數(shù)據(jù),將數(shù)據(jù)向接收端發(fā)送的功能。3) 編寫測試類Example02,在main()方法中,同時啟動接收端和發(fā)送端程序。二、案例實(shí)現(xiàn)UDP網(wǎng)絡(luò)程序中接受數(shù)據(jù)端,代碼如下:import java.io.IOException;import .DatagramPacket;import .DatagramSocket;public class ReceiveThread implements Runnable public void run() 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();String s = new String(dp.getData(), 0, dp.getLength();System.out.println(接收端:從 + ip + 主機(jī)接收到的數(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 .DatagramSocket;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 bys = line.getBytes();DatagramPacket dp = new DatagramPacket(bys, bys.length,InetAddress.getByName(1), 10086);ds.send(dp);if (bye.equals(line) / 釋放資源br.close();ds.close();break;/ 釋放資源br.close();ds.close(); catch (IOException e) e.printStackTrace();編寫測試類Example02,代碼如下: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();運(yùn)行Example02,依次鍵入“hello itcast”和“bye”后,結(jié)果如圖10-7所示。圖10-7 運(yùn)行結(jié)果從圖10-7中可以看出,Example02類實(shí)現(xiàn)了在一個命令行窗口中同時發(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é)議,是因?yàn)閁DP排除了信息可靠傳遞機(jī)制,將安全和排序等功能移交給上層應(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、 考核知識點(diǎn)編號:00110008/00110009名稱:ServerSocket類/Socket類2、 練習(xí)目標(biāo) 通過編寫簡單的TCP程序,掌握ServerSocket、Socket類的具體用法。3、 需求分析ServerSocket用于負(fù)責(zé)監(jiān)聽某臺計(jì)算機(jī)的某個端口號接收來自客戶端的請求,是網(wǎng)絡(luò)程序中的服務(wù)器端,Socket用于根據(jù)指定的IP地址和端口號向ServerSocket端交互,是網(wǎng)絡(luò)程序中的客戶端。為了讓初學(xué)者掌握這兩個類的作用,本案例將通過ServerSocket類和Socket類實(shí)現(xiàn)簡單的數(shù)據(jù)通信,并通過觀察兩個命令行窗口中數(shù)據(jù)輸出的先后順序,從而增加對TCP網(wǎng)絡(luò)程序中客戶端和服務(wù)端的執(zhí)行原理。4、 設(shè)計(jì)思路(實(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類,觀察命令行輸出變化。二、案例實(shí)現(xiàn)TCP網(wǎng)絡(luò)程序中服務(wù)端,代碼如下:import java.io.IOException;import java.io.InputStream;import .ServerSocket;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();byte 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 static void main(String args) throws IOException / 創(chuàng)建客戶端的Socket對象,建立連接Socket s = new Socket(1, 10010);System.out.println(客戶端已打開,等待發(fā)送數(shù)據(jù)。);/ 獲取輸出流,寫數(shù)據(jù)即可OutputStream os = s.getOutputStream();os.write(hello,tcp,我來了.getBytes();/ 釋放資源System.out.println(發(fā)送完畢,關(guān)閉客戶端服務(wù)。);s.close();首先開啟服務(wù)端程序,運(yùn)行結(jié)果如圖10-8所示。圖10-8 運(yùn)行結(jié)果然后開啟客戶端程序,運(yùn)行結(jié)果如圖10-9所示。圖10-9 運(yùn)行結(jié)果此時,再觀察服務(wù)端控制臺的輸出,運(yùn)行結(jié)果如圖10-10所示。圖10-10 運(yùn)行結(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)了他們都能實(shí)現(xiàn)數(shù)據(jù)的交互,那么他們有什么區(qū)別呢? UDP和TCP協(xié)議的主要區(qū)別是兩者在如何實(shí)現(xiàn)信息的可靠傳遞方面不同。TCP協(xié)議中包含了專門的傳遞保證機(jī)制,當(dāng)數(shù)據(jù)接收方收到發(fā)送方傳來的信息時,會自動向發(fā)送方發(fā)出確認(rèn)消息;發(fā)送方只有在接收到該確認(rèn)消息之后才繼續(xù)傳送其它信息,否則將一直等待直到收到確認(rèn)信息為止。與TCP不同,UDP協(xié)議并不提供數(shù)據(jù)傳送的保證機(jī)制。如果在從發(fā)送方到接收方的傳遞過程中出現(xiàn)數(shù)據(jù)報的丟失,協(xié)議本身并不能做出任何檢測或提示。因此,通常人們把UDP協(xié)議稱為不可靠的傳輸協(xié)議。3、除了數(shù)據(jù)的安全性和完整性以外,TCP和UDP還有以下幾點(diǎn)不同之處。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ò)程序上傳圖片一、案例描述 1、 考核知識點(diǎn)編號:00110011名稱:TCP案例文件上傳2、 練習(xí)目標(biāo) 掌握如何使用TCP協(xié)議完成文件的網(wǎng)絡(luò)傳輸功能。3、 需求分析由于TCP網(wǎng)絡(luò)程序能夠保證傳輸數(shù)據(jù)的完整性和安全性,所以大部分的服務(wù)器都會采用TCP協(xié)議來實(shí)現(xiàn)文件上傳的功能。為了讓初學(xué)者掌握如何使用TCP協(xié)議完成文件上傳功能,本案例將通過使用TCP網(wǎng)絡(luò)協(xié)議,實(shí)現(xiàn)圖片上傳的功能。4、 設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 編寫服務(wù)器類PicUploadServer,該類包含一個Socket類型的私有屬性,并提供了該屬性的有參構(gòu)造方法。PicUploadServer類實(shí)現(xiàn)Runnable接口,重寫run()方法,在run()方法內(nèi)讀取客戶端上傳的圖片,并將圖片存入服務(wù)器指定文件夾中。2) 編寫客戶端類PicUpLoadClient,該類實(shí)現(xiàn)了讀取指定圖片,向指定端口發(fā)送圖片數(shù)據(jù)的功能。3) 編寫測試類Example03,在main()方法中,通過指定的端口號創(chuàng)建ServerSocket對象,并編寫死循環(huán),在死循環(huán)中,通過ServerSocket對象獲取Socket對象,并開啟線程服務(wù)。二、案例實(shí)現(xiàn)TCP網(wǎng)絡(luò)程序中服務(wù)端,代碼如下:import java.util.*;import java.io.*;import .*;class PicUploadServer implements Runnable/包含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;/讀取客戶端的字節(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
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年市場調(diào)研與分析能力考試試卷及答案
- 農(nóng)村數(shù)字金融生態(tài)-洞察及研究
- 2025年美術(shù)教育基礎(chǔ)與創(chuàng)新實(shí)踐的考試試卷及答案
- 2025年計(jì)算機(jī)程序設(shè)計(jì)考試試卷及答案
- 2025年城市環(huán)境管理與保護(hù)專業(yè)能力測評試題及答案
- 2025年電子信息工程師資格考試試卷及答案
- 講故事比賽演講稿
- 2024年度浙江省二級造價工程師之建設(shè)工程造價管理基礎(chǔ)知識綜合檢測試卷A卷含答案
- 2024年度浙江省二級造價工程師之建設(shè)工程造價管理基礎(chǔ)知識題庫練習(xí)試卷B卷附答案
- 早期矯治培訓(xùn)課件
- 2024廣東省勞動合同范本范本下載
- 水利信息化水質(zhì)監(jiān)測系統(tǒng)單元工程質(zhì)量驗(yàn)收評定表、檢查記錄
- 客戶月結(jié)協(xié)議合同模板
- 2024年重慶十八中小升初數(shù)學(xué)試卷
- 天津市城市道路工程施工及驗(yàn)收標(biāo)準(zhǔn)
- 咨詢服務(wù)合同樣本模板
- 小學(xué)三年級奧數(shù)題庫100道及答案(完整版)
- DL∕T 1432.4-2017 變電設(shè)備在線監(jiān)測裝置檢驗(yàn)規(guī)范 第4部分:氣體絕緣金屬封閉開關(guān)設(shè)備局部放電特高頻在線監(jiān)測裝置
- 會計(jì)法課件完整版本
- 2024版工程總承包聯(lián)合體協(xié)議書
- 小兒靜脈留置針穿刺技巧與維護(hù)
評論
0/150
提交評論