19-Java網(wǎng)絡(luò)編程_第1頁
19-Java網(wǎng)絡(luò)編程_第2頁
19-Java網(wǎng)絡(luò)編程_第3頁
19-Java網(wǎng)絡(luò)編程_第4頁
19-Java網(wǎng)絡(luò)編程_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Java編程精要編程精要 Socket網(wǎng)絡(luò)編程網(wǎng)絡(luò)編程福建 廈門2014年6月本章學(xué)習(xí)內(nèi)容n網(wǎng)絡(luò)基礎(chǔ)nURLnJava網(wǎng)絡(luò)流技術(shù)nSocket通信技術(shù)計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)知識(shí)n什么是計(jì)算機(jī)網(wǎng)絡(luò)把分布在不同的地理區(qū)域的計(jì)算機(jī)與專門的外部設(shè)備用通信線路互聯(lián)成一個(gè)規(guī)模大,功能強(qiáng)的網(wǎng)絡(luò)系統(tǒng),從而使眾多的計(jì)算機(jī)可以方便地互相傳遞信息,共享硬件、軟件、數(shù)據(jù)信息等資源n計(jì)算機(jī)網(wǎng)絡(luò)的主要功能使用遠(yuǎn)程資源共享信息、程序和數(shù)據(jù)分布處理網(wǎng)絡(luò)通信協(xié)議/接口n網(wǎng)絡(luò)通信協(xié)議計(jì)算機(jī)網(wǎng)絡(luò)中實(shí)現(xiàn)通信必須有一些約定即通信協(xié)議,對速率、傳輸代碼、代碼結(jié)構(gòu)、傳輸控制步驟、出錯(cuò)控制等制定標(biāo)準(zhǔn)。 n網(wǎng)絡(luò)通信結(jié)構(gòu)為了使兩個(gè)結(jié)點(diǎn)之間能進(jìn)行對話,必

2、須在它們之間建立通信工具(即接口),使彼此之間 能進(jìn)行信息交換。n接口包括兩部分:硬件裝置:實(shí)現(xiàn)結(jié)點(diǎn)之間的信息傳送 軟件裝置:規(guī)定雙方進(jìn)行通信的約定協(xié)議分層思想n為什么要分層由于節(jié)點(diǎn)之間聯(lián)系很復(fù)雜,在制定協(xié)議時(shí),把復(fù)雜成分分解成一些簡單的成分,再將它們復(fù)合起來。最常用的復(fù)合方式是層次方式,即同層間可以通信、上一層可以調(diào)用下一層,而與下一層不發(fā)生關(guān)系n通信協(xié)議的分層規(guī)定把用戶應(yīng)用程序作為最高層,把物理通信作為最低層,將其間的協(xié)議處理分為若干層,規(guī)定每層的處理任務(wù),也規(guī)定每層的接口標(biāo)準(zhǔn)OSI的七層模型數(shù)據(jù)的封裝與拆封n封裝:發(fā)送方數(shù)據(jù)在網(wǎng)絡(luò)模型的各層傳送過程中加入頭尾的過程。信封:郵編地址等n拆封

3、:接受方收到數(shù)據(jù)后去除相應(yīng)的頭尾過程物理介質(zhì)物理介質(zhì)第第7層層第第6層層第第5層層第第4層層第第3層層第第2層層第第1層層第第7層層第第6層層第第5層層第第4層層第第3層層第第2層層第第1層層應(yīng)用層應(yīng)用層表示層表示層會(huì)話層會(huì)話層傳輸層傳輸層網(wǎng)絡(luò)層網(wǎng)絡(luò)層數(shù)據(jù)鏈路層數(shù)據(jù)鏈路層物理層物理層TCP/IP協(xié)議nTCP協(xié)議:為一種可靠的端對端協(xié)議:重發(fā)一切沒有收到的數(shù)據(jù),進(jìn)行數(shù)據(jù)內(nèi)容準(zhǔn)確性檢查并保證分組的正確順序。TCP協(xié)議位于OSI參考模型的傳輸層nIP協(xié)議:是網(wǎng)絡(luò)上的計(jì)算機(jī)進(jìn)行連接的基礎(chǔ),是不可靠的,無論傳送正確與否都不進(jìn)行檢驗(yàn)、不回送確認(rèn)、不保證分組的正確順序。IP協(xié)議位于OSI參考模型的網(wǎng)絡(luò)層TC

4、P/IP協(xié)議nTCP/IP協(xié)議是Internet上不同系統(tǒng)之間互聯(lián)的一組協(xié)議。它為分散和不同類型的硬件提供了一個(gè)通用的編程接口。TCP/IP 協(xié)議使Internet盡可能成為一個(gè)分散、無序的網(wǎng)絡(luò)。TCP/IP通常被看成一個(gè)4層模型:應(yīng)用層、傳輸層、網(wǎng)絡(luò)層以及數(shù)據(jù)鏈路層+物理層。nhttp協(xié)議nftp協(xié)議IP地址/域名/端口nIP地址TCP/IP使用IP地址來標(biāo)識(shí)源地址和目的地址IP地址格式:55目前版本是第四版(Version4)n域名(Domain Address)便于記憶的字符串形式:與IP地址間存在映射關(guān)系。域名服務(wù)器將負(fù)責(zé)解析IP地址/域名/端口n端口(Por

5、t)邏輯意義上的數(shù)據(jù)傳輸通道、或者說模擬通道。tcp/IP協(xié)議規(guī)定,每臺(tái)計(jì)算機(jī)擁有65536個(gè)這種邏輯通信端口端口號(hào):用于標(biāo)識(shí)這些端口的整數(shù)編號(hào),065536端口n端口是一種抽象的軟件結(jié)構(gòu)(包括一些數(shù)據(jù)結(jié)構(gòu)和I/O緩沖區(qū))。應(yīng)用程序通過系統(tǒng)調(diào)用與某端口建立連接(binding)后,傳輸層傳給該端口的數(shù)據(jù)都被相應(yīng)的進(jìn)程所接收,相應(yīng)進(jìn)程發(fā)給傳輸層的數(shù)據(jù)都通過該端口輸出n端口用一個(gè)整數(shù)型標(biāo)識(shí)符來表示,即端口號(hào)。端口號(hào)跟協(xié)議相關(guān),TCP/IP傳輸層的兩個(gè)協(xié)議TCP和UDP是完全獨(dú)立的兩個(gè)軟件模塊,因此各自的端口號(hào)也相互獨(dú)立,端口通常稱為協(xié)議端口(protocol port) ,簡稱端口n端口使用一個(gè)1

6、6位的數(shù)字來表示,它的范圍是 0-65535,1024以下的端口號(hào)保留給預(yù)定義的服務(wù)。例如:http使用80端口,ftp使用21IP地址/域名有關(guān)的類nJ包中定義了相關(guān)的類nJ.InetAddressnJ.Inet4AddressnJ.Inet6AddressJava網(wǎng)絡(luò)編程概述nJava語言最初開發(fā)的目的是為了控制家電設(shè)備網(wǎng)絡(luò)nJava語言的設(shè)計(jì)主旨之一就是連接機(jī)器,因此其對網(wǎng)絡(luò)通信具有很強(qiáng)的支持能力nJ包能夠讓Java程序通過網(wǎng)絡(luò)進(jìn)行通信;結(jié)合IO流,通過網(wǎng)絡(luò)讀寫文件幾乎與讀寫本地磁盤一樣容易Java網(wǎng)絡(luò)流技術(shù)n在Java技術(shù)中,萬維網(wǎng)上的文本文檔被視為可訪問的資源,包括HTML文件、XM

7、L文件以及其它類型的純文本文檔nJava網(wǎng)絡(luò)程序經(jīng)常會(huì)與Web文檔進(jìn)行大量交互n加載網(wǎng)絡(luò)文檔并讀取內(nèi)容的方法大體可描述為:通過URL建立連接,然后由該連接建立輸入流閱讀器,最后使用輸入流閱讀器建立緩沖輸入流閱讀器Java網(wǎng)絡(luò)流技術(shù)n加載網(wǎng)絡(luò)文檔并讀取內(nèi)容的步驟如下:1.創(chuàng)建一個(gè)網(wǎng)絡(luò)地址URL的對象,它指向網(wǎng)絡(luò)資源2.創(chuàng)建一個(gè)HttpURLConnection對象,它能夠加載URL并連接到相應(yīng)站點(diǎn)3.使用HttpURLConnection對象的getConten()方法來創(chuàng)建一個(gè)InputStreamReader對象,用于讀取來自URL的數(shù)據(jù)流4.使用InputStreamReader對象的ge

8、tConten()方法創(chuàng)建一個(gè)BufferedReader對象,該對象能夠高效地從輸入流中讀取數(shù)據(jù)Java網(wǎng)絡(luò)流技術(shù)nURL類共有4個(gè)構(gòu)造方法,常用的有以下2個(gè):URL(String addr):使用完整的網(wǎng)絡(luò)地址(如:http:/)來創(chuàng)建一個(gè)URL對象URL(URL url, String path):將URL作為基本地址,將path作為相對路徑來創(chuàng)建一個(gè)URL對象Java網(wǎng)絡(luò)流技術(shù)n使用網(wǎng)絡(luò)流技術(shù)讀取http:/(或任何其它網(wǎng)站)地址的數(shù)據(jù),并寫入磁盤文件中n以下進(jìn)行技術(shù)動(dòng)作分解技術(shù)動(dòng)作分解-1n創(chuàng)建URL對象,并通過其對網(wǎng)絡(luò)資源進(jìn)行連接,addr為完整的網(wǎng)絡(luò)地址/用地址用地址addr創(chuàng)建

9、創(chuàng)建URL對象對象URL page = new URL(addr); /創(chuàng)建創(chuàng)建HTTP URL連接連接HttpURLConnection conn = (HttpURLConnection)page.openConnection(); conn.connect(); /進(jìn)行連接進(jìn)行連接技術(shù)動(dòng)作分解-2n使用getContent()方法建立輸入流(InputStreamReader),并將該輸入流包裝為緩沖流(BufferedReader)/建立輸入流建立輸入流InputStreamReader dataIn = new InputStreamReader(InputStream)conn.g

10、etContent();/建立緩沖流建立緩沖流BufferedReader bfrWeb = new BufferedReader(dataIn); 技術(shù)動(dòng)作分解-3n建立文件輸出流(FileWriter)以及輸出緩沖流(BufferedWriter),path為文件路徑FileWriter fw = new FileWriter(path);BufferedWriter bwFile = new BufferedWriter(fw);技術(shù)動(dòng)作分解-4n逐行讀取數(shù)據(jù),并寫入磁盤文件String data;data = bfrWeb.readLine();while(data != null)

11、bwFile.write(data); bwFile.newLine(); data = bfrWeb.readLine();技術(shù)動(dòng)作分解-5n將IO流逐個(gè)關(guān)閉,注意順序:后打開的先關(guān)閉bwFile.close();fw.close();bfrWeb.close();dataIn.close();編程練習(xí)n編寫程序,實(shí)現(xiàn)對網(wǎng)絡(luò)文檔的讀取,并存入磁盤文件n在完成上一個(gè)要求的基礎(chǔ)上,將其實(shí)現(xiàn)為圖形用戶界面Socket通信技術(shù)n兩個(gè)進(jìn)程間可以通過一個(gè)雙向的網(wǎng)絡(luò)通信連接實(shí)現(xiàn)數(shù)據(jù)交換,這種通信鏈路的端點(diǎn)被稱為“套接字”(Socket)nSocket通信技術(shù),可以方便地建立可靠的、雙向的、持續(xù)的、點(diǎn)對點(diǎn)通

12、信連接nSocket通常用來實(shí)現(xiàn)Client-Server連接n建立連接時(shí)所需的尋址信息包括:遠(yuǎn)程計(jì)算機(jī)的機(jī)器名或IP地址試圖連接的端口號(hào)(Port number)nJ包中定義的兩個(gè)類Socket和ServletSocket,分別用來實(shí)現(xiàn)雙向鏈接的client和servler端Socket通信技術(shù)n在Socket通信模型中,服務(wù)器端使用ServerSocket等待客戶端的連接n每一個(gè)客戶端使用一個(gè)Socket類對象表示Socket通信技術(shù)nServerSocket類主要用在服務(wù)器端程序,用于接受客戶端的連接請求,其常用方法如下:方法原型方法原型說明說明public ServerSocket(i

13、nt port) throws IOException構(gòu)造方法,創(chuàng)建構(gòu)造方法,創(chuàng)建ServerSocket實(shí)實(shí)例,并指定監(jiān)聽端口例,并指定監(jiān)聽端口(port)public Socket accept() throws IOException等待客戶端連接,此方法連接之等待客戶端連接,此方法連接之前一直阻塞前一直阻塞public InetAddress getInetAddress()返回服務(wù)器的返回服務(wù)器的IP地址地址public boolean isClosed()判斷判斷ServerSocket是都關(guān)閉是都關(guān)閉public void close() throws IOException關(guān)閉

14、關(guān)閉ServerSocketSocket通信技術(shù)n每一個(gè)Socket類對象表示一個(gè)客戶端,其常用的方法如下:方法原型方法原型說明說明public Socket(String host, int port) throws UnknownHostException, IOException構(gòu)造方法,指定要連接服務(wù)構(gòu)造方法,指定要連接服務(wù)器的主機(jī)名稱及連接端口器的主機(jī)名稱及連接端口public InputStream getInputStream() throws IOException返回此返回此Socket的輸入流的輸入流public OutputStream getOutputStream()

15、 throws IOException返回此返回此Socket的輸出流的輸出流public boolean isClosed()判斷此判斷此Socket是都關(guān)閉是都關(guān)閉public void close() throws IOException關(guān)閉此關(guān)閉此SocketSocket編程基本步驟n1.建立網(wǎng)絡(luò)連接n2.創(chuàng)建Socketn3.打開連接到Socket的輸入/輸出流n4.通過已打開的I/O流進(jìn)行數(shù)據(jù)的讀寫操作n5.關(guān)閉已打開的I/O流n6.關(guān)閉Socket服務(wù)器端程序n調(diào)用ServerSocket(int port)創(chuàng)建一個(gè)服務(wù)器端套接字,并綁定到指定端口上n調(diào)用accept(),監(jiān)聽連

16、接請求,如果客戶端請求連接,則接受連接,返回通信套接字n調(diào)用Socket類的getOutputStream()和getInputStream獲取輸出流和輸入流,開始網(wǎng)絡(luò)數(shù)據(jù)的發(fā)送和接收n最后關(guān)閉通信套接字客戶端程序n調(diào)用Socket()創(chuàng)建一個(gè)流套接字,并連接到服務(wù)器端n調(diào)用Socket類的getOutputStream()和getInputStream獲取輸出流和輸入流,開始網(wǎng)絡(luò)數(shù)據(jù)的發(fā)送和接收n最后關(guān)閉通信套接字Socket通信模型ServerServerSocket s (port #)s.accept()等待連接等待連接SocketOutputStreamInputStreamSock

17、et.close()ClientSocket(InetAddress,port#)主動(dòng)發(fā)起連接主動(dòng)發(fā)起連接OutputStreamInputStreamSocket.close()Socke通信技術(shù)n服務(wù)器端示例:public void listen() throws IOException ServerSocket serv = new ServerSocket(8888); Socket c = serv.accept(); OutputStream os = c.getOutputStream(); DataOutputStream dos = new DataOutputStream(

18、os); dos.writeUTF(Hi, I get you information.); dos.writeUTF(Your IP: +c.getInetAddress(); dos.writeUTF(Your port: +c.getPort(); dos.writeUTF(Over); dos.close(); os.close(); c.close(); serv.close();Socke通信技術(shù)n客戶端示例:public void sendInfo() throws UnknownHostException, IOException Socket c = new Socket(1

19、, 8888); InputStream is = c.getInputStream(); DataInputStream dis = new DataInputStream(is); String content = dis.readUTF(); while(content.equals(Over) = false) System.out.println(content); content = dis.readUTF(); dis.close(); is.close(); c.close();數(shù)據(jù)操作流nDataInputStream與DataOutpuStream稱為數(shù)據(jù)操

20、作流,能夠?qū)nputStream與OutputStream包裝為平臺(tái)無關(guān)的IO流,從是實(shí)現(xiàn)對基本數(shù)據(jù)類型進(jìn)行讀寫nreadUTF()與wirteUTF()方法是采用UTF-8編碼對數(shù)據(jù)進(jìn)行讀寫的方法nUTF-8編碼是針對Unicode編碼設(shè)計(jì)的可變長度編碼,在網(wǎng)絡(luò)流中使用這種格式的編碼能夠取得較高的效率與穩(wěn)定性,并兼容中文漢字DataInputStreamDataInputStream類類DataInputStream類可以輸入任何類型的數(shù)據(jù),但它不可以單獨(dú)使用,需要要配合其它字節(jié)輸入流一起使用DataInputStream類的構(gòu)造方法只有一種方式:如:InputStream is = c.

21、getInputStream();DataInputStream dis = new DataInputStream(is);構(gòu)構(gòu) 造造 方方 法法說說 明明DataInputStream(InputStream in)利用其它的字節(jié)輸入流創(chuàng)建數(shù)利用其它的字節(jié)輸入流創(chuàng)建數(shù)據(jù)輸入流對象據(jù)輸入流對象DataInputStreamDataInputStream類的常用方法類的常用方法方方 法法 原原 型型說說 明明final boolean readBoolean() throws IOException從數(shù)據(jù)輸入流中讀取一個(gè)從數(shù)據(jù)輸入流中讀取一個(gè)boolean型數(shù)據(jù)型數(shù)據(jù)final char re

22、adChar() throws IOException從數(shù)據(jù)輸入流中讀取一個(gè)從數(shù)據(jù)輸入流中讀取一個(gè)char型數(shù)據(jù)型數(shù)據(jù)final int readInt() throws IOException從數(shù)據(jù)輸入流中讀取一個(gè)從數(shù)據(jù)輸入流中讀取一個(gè)int型數(shù)據(jù)型數(shù)據(jù)final long readLong() throws IOException從數(shù)據(jù)輸入流中讀取一個(gè)從數(shù)據(jù)輸入流中讀取一個(gè)long型數(shù)據(jù)型數(shù)據(jù)final float readFloat() throws IOException從數(shù)據(jù)輸入流中讀取一個(gè)從數(shù)據(jù)輸入流中讀取一個(gè)float型數(shù)據(jù)型數(shù)據(jù)final double readDouble()

23、 throws IOException從數(shù)據(jù)輸入流中讀取一個(gè)從數(shù)據(jù)輸入流中讀取一個(gè)double型數(shù)據(jù)型數(shù)據(jù)DataOutputStreamDataOutputStream類類DataOutputStream類可以輸出任何類型的數(shù)據(jù),同樣也需要配合其他字節(jié)輸出流一起使用;DataOutputStream類的構(gòu)造方法如下:如:OutputStream os = c.getOutputStream();DataOutputStream dos = new DataOutputStream(os);構(gòu)構(gòu) 造造 方方 法法說說 明明DataOutputStream(OutputStream out)利用

24、其它的字節(jié)輸出流創(chuàng)利用其它的字節(jié)輸出流創(chuàng)建數(shù)據(jù)輸出流對象建數(shù)據(jù)輸出流對象DataOutputStreamDataOutputStream類的常用方法類的常用方法方方 法法 原原 型型說說 明明final void writeBoolean(boolean v) throws IOException往數(shù)據(jù)輸出流中寫入一個(gè)往數(shù)據(jù)輸出流中寫入一個(gè)boolean型數(shù)據(jù)型數(shù)據(jù)final void writeChar(char v) throws IOException往數(shù)據(jù)輸出流中寫入一個(gè)往數(shù)據(jù)輸出流中寫入一個(gè)char型數(shù)據(jù)型數(shù)據(jù)final void writeInt(int v) throws IOException往數(shù)據(jù)輸出流中寫

溫馨提示

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

評(píng)論

0/150

提交評(píng)論