版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、1,Java面向?qū)ο蟪绦蛟O(shè)計(jì),第10章 Java網(wǎng)絡(luò)編程,2,本章主要內(nèi)容,了解常見的網(wǎng)絡(luò)協(xié)議 理解端口和套接字 掌握InetAddress類 掌握ServerSocket類 學(xué)習(xí)編寫TCP、UDP程序,3,網(wǎng)絡(luò)編程概述,網(wǎng)絡(luò)編程是指編寫程序完成兩臺或多臺計(jì)算機(jī)之間信息的通信。 計(jì)算機(jī)之間如果要通過網(wǎng)絡(luò)通信,必須遵守一定的規(guī)矩,這個規(guī)矩就是各種網(wǎng)絡(luò)協(xié)議。 最有名的協(xié)議就是TCP/IP協(xié)議。TCP協(xié)議解決了信息可靠傳輸?shù)膯栴},而IP協(xié)議解決了網(wǎng)絡(luò)計(jì)算機(jī)定位的問題。 一臺主機(jī)都需要有一個唯一的標(biāo)記,即IP地址。例如:。 DNS(域名服務(wù)器)實(shí)現(xiàn)了域名與IP地址之間的映射。例如
2、:的IP地址是6。,4,使用InetAddress類實(shí)現(xiàn)網(wǎng)絡(luò)定位,演示使用InetAddress類,5,使用URL類訪問網(wǎng)絡(luò)資源,構(gòu)造方法: URL(String host) URL baidu = new URL(“”); URL(URL url, String relative) URL url = new URL(baidu, “s?wd=java”) 。 URL(String protocol, String host, int port, String file) URL url = new URL(“http”, “”, 80, “”)。 通過URL訪問網(wǎng)絡(luò)
3、資源的方法需要3步: 1. 創(chuàng)建URL對象。 2. 使用URL對象的openStream( )方法獲取一個InputStream對象。 3. 從此InputStream讀入即可。,try URL bd = new URL( BufferedReader r = new BufferedReader( new InputStreamReader(bd.openStream(); String line = null; while (null != (line = r.readLine() System.out.println(line); r.close(); catch (MalformedU
4、RLException e) e.printStackTrace(); catch (IOException e) e.printStackTrace(); ,6,Socket,套接字(Socket ):計(jì)算機(jī)之間相互通訊的一種方式,表示一個系統(tǒng)的IP地址和端口號的結(jié)合。 Socket編程包括TCP網(wǎng)絡(luò)編程和UDP網(wǎng)絡(luò)編程。 利用Socket編寫通信程序時,需要區(qū)分服務(wù)器端編程和客戶端編程,兩者的功能和編寫方法不一樣。對于服務(wù)器端編程來說,服務(wù)器端需要有一個監(jiān)聽進(jìn)程,該進(jìn)程綁定一個端口負(fù)責(zé)監(jiān)聽客戶端的連接請求??蛻舳藙?chuàng)建一個Socket,并請求與服務(wù)器建立連接。服務(wù)器在接收到連接請求后,建立一
5、個新的Socket并綁定一個新的端口與客戶建立連接。服務(wù)器繼續(xù)在原端口監(jiān)聽,等待新的請求。,7,TCP與UDP,TCP協(xié)議是一種面向連接的協(xié)議,該協(xié)議在兩臺計(jì)算機(jī)之間建立一條可靠的邏輯連接線路,能夠自動處理網(wǎng)絡(luò)上經(jīng)常發(fā)生的各種錯誤。 UDP協(xié)議是面向無連接的協(xié)議。該協(xié)議將需要傳輸?shù)男畔⒎植鸪梢粋€個獨(dú)立的數(shù)據(jù)包,為每一個數(shù)據(jù)包填寫上目的地址,然后將它們送到網(wǎng)絡(luò)上。UDP協(xié)議是一個不可靠的協(xié)議,數(shù)據(jù)包可能會發(fā)生丟失、錯誤、亂序等情況,但它的效率非常高。 端口并不是一個物理上的概念,而是一個邏輯上的連接裝置,任何一個網(wǎng)絡(luò)連接必須要使用一個端口。端口可以是一個065535之間的整數(shù),1024以下的數(shù)字
6、是保留的每一臺主機(jī)只有一條到網(wǎng)絡(luò)的物理連接,當(dāng)訪問一臺提供了多種服務(wù)的服務(wù)器時,客戶端只需要使用不同的端口就可以確定連接到服務(wù)器的哪項(xiàng)服務(wù)上。,8,TCP網(wǎng)絡(luò)編程,創(chuàng)建TCP Socket需要的四個信息: 本地系統(tǒng)的IP 本地應(yīng)用程序使用的TCP端口號 遠(yuǎn)程系統(tǒng)的IP 遠(yuǎn)程應(yīng)用程序相應(yīng)的TCP端口號 ServerSocket和Socket兩個類用于建立一個雙邊的通信。 服務(wù)器端:創(chuàng)建ServerSocket類的對象用于偵聽客戶端的Socket連接,如果沒有連接,它將一直等待。 客戶端:創(chuàng)建Socket類的對象連接到一個服務(wù)器端。,9,Socket TCP通信模型,圖10.2是客戶端與服務(wù)器端通
7、信的工作流程。,Server端,/占用服務(wù)器某個端口監(jiān)聽 ServerSocket ss = new ServerSocket (PORT);,/等待連接 Socket s = ss.accept();,/輸入流 s.getInputStream();,/輸出流 s.getOutputStream();,/關(guān)閉socket s.close(); ss.close();,Client端,/試圖連接 Socket s = new Socket(IP, PORT);,/輸入流 s.getInputStream();,/輸出流 s.getOutputStream();,/關(guān)閉socket s.clos
8、e();,10,服務(wù)器端與客戶端簡單通信實(shí)例,/服務(wù)器端 ServerSocket ss = null; BufferedReader in = null; BufferedWriter out = null; try ss = new ServerSocket(8888); System.out.println(開始監(jiān)聽,端口號:8888.); Socket s = null; try s = ss.accept(); in = new BufferedReader(new InputStreamReader(s.getInputStream(); out = new BufferedWri
9、ter(new OutputStreamWriter(s.getOutputStream(); String str = in.readLine();/讀取客戶端的數(shù)據(jù) System.out.println(服務(wù)器接收到數(shù)據(jù): + str); finally s.close(); catch (IOException e) e.printStackTrace(); finally try ss.close(); catch (IOException e) e.printStackTrace(); ,11,服務(wù)器端與客戶端簡單通信實(shí)例,/客戶端 Socket s = null; Buffered
10、Reader in = null; BufferedWriter out = null; try s = new Socket(, 8888); in = new BufferedReader(new InputStreamReader(s.getInputStream(); out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream(); Scanner input = new Scanner(System.in); out.write(input.nextLine();/向服務(wù)器端發(fā)送數(shù)據(jù) out.f
11、lush(); catch (UnknownHostException e) e.printStackTrace(); catch (IOException e) e.printStackTrace(); finally try s.close(); catch (IOException e) e.printStackTrace(); ,12,服務(wù)器同時為多個客戶端服務(wù),對Server類做了修訂,在建立連接之后,不再是直接與客戶端交互,而是把得到的Socket交給一個ServerThread線程,由ServerThread線程負(fù)責(zé)和客戶端交互。 為了模擬多客戶端連接的效果,對Client類做了
12、修改,與服務(wù)器建立連接后也不再直接與服務(wù)器交互,而是交給一個線程來負(fù)責(zé),并且同時運(yùn)行多個線程。,13,服務(wù)器端,/服務(wù)器端 public class MultiServer static final int PORT = 8080; public static void main(String args) throws IOException ServerSocket s = new ServerSocket(PORT); System.out.println(Server Started); try while (true) Socket socket = s.accept( ); try
13、new ServerThread(socket); catch (IOException e) socket.close( ); finally s.close( ); ,/服務(wù)器端線程 class ServerThread extends Thread private Socket socket; private BufferedReader in; private PrintWriter out; public ServerThread(Socket s) throws IOException socket = s; in = new BufferedReader( new InputSt
14、reamReader(socket.getInputStream( ); out = new PrintWriter( new BufferedWriter(new OutputStreamWriter( socket.getOutputStream( ), true); start( ); public void run( ) ,14,客戶端,/客戶端 public class MultiClient static final int MAX_THREADS = 40; public static void main(String args) throws IOException, Inte
15、rruptedException while (true) if (ClientThread.threadCount( ) MAX_THREADS) new ClientThread(“”, 8888); Thread.currentThread( ).sleep(100); ,/客戶端線程 class ClientThread extends Thread private Socket socket; private BufferedReader in; private PrintWriter out; public ClientThread(String ip, int
16、port) threadcount+; try socket = new Socket(ip, port); in = new BufferedReader( new InputStreamReader(socket.getInputStream( ); out = new PrintWriter( new BufferedWriter(new OutputStreamWriter( socket.getOutputStream( ), true); start( ); catch (IOException e) try socket.close(); catch(IOException e2) public void run( ) ,15,UDP網(wǎng)絡(luò)編程,接收端: 調(diào)用DatagramSocket(int port)創(chuàng)建一個套接字socket,并綁定到指定端口上;調(diào)用DatagramPacket構(gòu)造方法創(chuàng)建一個緩沖區(qū)來接收UDP包 ;調(diào)用DatagramSocket類的receive方法,接收UDP包,如果此時還沒有數(shù)據(jù)可供接收,rec
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年長沙商貿(mào)旅游職業(yè)技術(shù)學(xué)院單招職業(yè)技能考試模擬試題帶答案解析
- 2026年鄭州鐵路職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試備考題庫帶答案解析
- 2026年宿州職業(yè)技術(shù)學(xué)院單招職業(yè)技能筆試備考試題帶答案解析
- 2026年九江職業(yè)技術(shù)學(xué)院單招職業(yè)技能考試模擬試題附答案詳解
- 2026年南京機(jī)電職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性考試模擬試題帶答案解析
- 2025年衛(wèi)生院藥師筆試內(nèi)容題目及答案
- 安全網(wǎng)上培訓(xùn)活動總結(jié)課件
- 2026 年高職音樂教育(聲樂基礎(chǔ))試題及答案
- Unit3WarandpeaceStartingoutUnderstandingideas課件-高中英語外研版選擇性()-1
- 2026 年高職醫(yī)學(xué)影像技術(shù)類(影像診斷學(xué)基礎(chǔ))試題及答案
- 智慧產(chǎn)業(yè)園倉儲項(xiàng)目可行性研究報告-商業(yè)計(jì)劃書
- 四川省森林資源規(guī)劃設(shè)計(jì)調(diào)查技術(shù)細(xì)則
- 廣東省建筑裝飾裝修工程質(zhì)量評價標(biāo)準(zhǔn)
- 銀行外包服務(wù)管理應(yīng)急預(yù)案
- 樓板回頂施工方案
- DB13T 5885-2024地表基質(zhì)調(diào)查規(guī)范(1∶50 000)
- 2025年度演出合同知識產(chǎn)權(quán)保護(hù)范本
- 區(qū)塊鏈智能合約開發(fā)實(shí)戰(zhàn)教程
- 2025年校長考試題庫及答案
- 《煤礦開采基本概念》課件
- 口腔進(jìn)修申請書
評論
0/150
提交評論