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

下載本文檔

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

文檔簡(jiǎn)介

1、慧學(xué)國(guó)際科技發(fā)展(深圳)有限公司網(wǎng)絡(luò)編程JavaEE開(kāi)發(fā)工程師Java 高級(jí)編程 網(wǎng)絡(luò)概念及通信協(xié)議分層思想 TCP/IP協(xié)議 Java對(duì)網(wǎng)絡(luò)編程的支持 TCP、UDP通信協(xié)議的Java實(shí)現(xiàn)Contents目錄網(wǎng)絡(luò)編程基本概念TCP/IP(Transmission Control Protocol傳輸控制協(xié)議/Internet Protocol網(wǎng)間協(xié)議)是Internet的主要協(xié)議,定義了計(jì)算機(jī)和外設(shè)進(jìn)行通信所使用的規(guī)則。TCP/IP網(wǎng)絡(luò)參考模型包括五個(gè)層次:應(yīng)用層、傳輸層、網(wǎng)絡(luò)層、鏈路層、物理層。 應(yīng)用層表示層會(huì)話層傳輸層網(wǎng)絡(luò)層數(shù)據(jù)鏈路層物理層在TCP/IP網(wǎng)絡(luò)中,不同的機(jī)器之間進(jìn)行通信時(shí),

2、數(shù)據(jù)的傳輸是由傳輸層傳輸層控制的,這包括數(shù)據(jù)要發(fā)往的目標(biāo)機(jī)器及應(yīng)用程序、數(shù)據(jù)的質(zhì)量控制等。 TCP/IP網(wǎng)絡(luò)中最常用的傳輸協(xié)議就是TCPTCP(Transport Control Protocol)和UDPUDP(User Datagram Protocol)。網(wǎng)絡(luò)編程基本概念 一臺(tái)機(jī)器通常只通過(guò)一條鏈路連接到網(wǎng)絡(luò)上,即它只有一個(gè)IP地址,但一臺(tái)機(jī)器中往往有很多應(yīng)用程序需要進(jìn)行網(wǎng)絡(luò)通信,如何區(qū)分呢? 端口號(hào)是一個(gè)標(biāo)記機(jī)器的邏輯通信信道邏輯通信信道的正整數(shù),端口 號(hào)不是物理實(shí)體。IP地址和端口號(hào)組成了所謂的SocketSocket,Socket是網(wǎng)絡(luò)上運(yùn)行的程序之間雙向通信鏈路的最后終結(jié)點(diǎn),它是

3、TCP和UDP的基礎(chǔ)。網(wǎng)絡(luò)編程基本概念網(wǎng)絡(luò)服務(wù)網(wǎng)絡(luò)服務(wù)httpftp其他服務(wù)23telnet端口端口2180客戶程序客戶程序SocketIP,port網(wǎng)絡(luò)編程基本構(gòu)圖 端口號(hào)是用一個(gè)16位的整數(shù)來(lái)表達(dá)的,其范圍為0 65535,其中01023為系統(tǒng)所保留,專門給那些通用 的服務(wù)(well-known services) 如http服務(wù)的端口號(hào)為80,telnet服務(wù)的端口號(hào)為21, ftp服務(wù)的端口為23,因此,當(dāng)我們編寫(xiě)通信程序 時(shí),應(yīng)選擇一個(gè)大于1023的數(shù)作為端口號(hào),以免發(fā)生 沖突。什么是端口號(hào)1. 傳輸控制協(xié)議(TCP)是在端點(diǎn)與端點(diǎn)之間建立持續(xù)的連接而進(jìn)行 通信。2. 建立連接后,發(fā)

4、送端將發(fā)送的數(shù)據(jù)印記了序列號(hào)和錯(cuò)誤檢測(cè)代碼, 并以字節(jié)流的方式發(fā)送出去;接收端則對(duì)數(shù)據(jù)進(jìn)行錯(cuò)誤檢查并按 序列順序?qū)?shù)據(jù)整理好,數(shù)據(jù)在需要時(shí)可以重新發(fā)送,因此整個(gè) 字節(jié)流到達(dá)接收端時(shí)完好無(wú)缺。這與兩個(gè)人打電話的情形是相似 的。3. TCP協(xié)議具有可靠性和有序性,并且以字節(jié)流的方式發(fā)送數(shù)據(jù),它 通常被稱為流通信協(xié)議。TCP簡(jiǎn)介TCP/IP協(xié)議使用Thread子類創(chuàng)建線程的優(yōu)點(diǎn)是:我們可以在子類中增加新的成員變量,使線程具有某種屬性,也可以在子類中新增加方法,使線程具有某種功能。但是,Java不支持多繼承,Thread類的子類不能再擴(kuò)展其他的類。使用Runable接口與TCP協(xié)議不同,用戶數(shù)據(jù)報(bào)協(xié)議

5、(UDP)則是一種無(wú)連無(wú)連接接的傳輸協(xié)議首先需要將要傳輸?shù)臄?shù)據(jù)定義成數(shù)據(jù)報(bào)(Datagram),在數(shù)據(jù)報(bào)中指明數(shù)據(jù)所要達(dá)到的端點(diǎn)(Socket,主機(jī)地址和端口號(hào)),然后再將數(shù)據(jù)報(bào)發(fā)送出去。 特點(diǎn): 這種傳輸方式是無(wú)序的,也不能確保絕對(duì)的安全可靠,但它很簡(jiǎn)單也具有比較高的效率,這與通過(guò)郵局發(fā)郵局發(fā)送郵件送郵件的情形非常相似。UDP 與 TCP的不同TCP協(xié)議和UDP協(xié)議各有各的用處。當(dāng)對(duì)所傳輸?shù)臄?shù)據(jù)具有時(shí)序性和可靠性等要求時(shí),應(yīng)使用TCP協(xié)議;當(dāng)傳輸?shù)臄?shù)據(jù)比較簡(jiǎn)單、對(duì)時(shí)序等無(wú)要求時(shí),UDP協(xié)議能發(fā)揮更好的作用,如ping、發(fā)送時(shí)間數(shù)據(jù)等。TCP與UDP對(duì)比UDPTCP/IP傳輸效率不需建立連接,

6、直接傳受傳輸前需要建立連接傳輸大小最大64KB無(wú)限制可靠性不可靠的協(xié)議可靠的Java提供的網(wǎng)絡(luò)功能類 InetAddress面向的是網(wǎng)絡(luò)層(網(wǎng)絡(luò)層(IP層)層),用于標(biāo)識(shí)網(wǎng)絡(luò)上的硬件資源 URL面向的應(yīng)用層應(yīng)用層,通過(guò)URL,Java程序可以直接送出或讀入網(wǎng)絡(luò)上的數(shù)據(jù) Sockets和Datagram面向的則是傳輸層傳輸層。針對(duì)網(wǎng)絡(luò)通信的不同層次,針對(duì)網(wǎng)絡(luò)通信的不同層次,Java提供的網(wǎng)絡(luò)功能有四大類:提供的網(wǎng)絡(luò)功能有四大類:Java對(duì)網(wǎng)絡(luò)編程的支持InetAddresspublic static InetAddress getByName(String host):host可以是一個(gè)機(jī)器名,

7、也可以是一個(gè)形如“%d.%d.%d.%d”的IP地址或一個(gè)DSN域public static InetAddress getLocalHost() :返回本地主機(jī)public static InetAddress getAllByName(String host):根據(jù)系統(tǒng)上配置的名稱服務(wù)返回其IP地址所組成的數(shù)組public static InetAddress getByAddress(String host, Byte addr):根據(jù)提供的主機(jī)名和IP地址創(chuàng)建InetAddressInetAddress:用于標(biāo)識(shí)網(wǎng)絡(luò)上的硬件資源,它提供了一系列方法以描述、獲取及使用網(wǎng)絡(luò)資源。 Inet

8、Addressimport .*;try InetAddress address=InetAddress.getLocalHost();/將此將此IP地址轉(zhuǎn)換為地址轉(zhuǎn)換為StringSystem.out.println(address.toString();/獲取此獲取此IP地址的主機(jī)名地址的主機(jī)名System.out.println(address.getHostName();/獲取獲取IPSystem.out.println(address.getHostAddress(); catch (UnknownHostException e) e.printStackTrace();URL介紹U

9、RL是統(tǒng)一資源定位符(Uniform Resource Locator)的簡(jiǎn)稱,它表示Internet上某一資源的地址。Internet上的資源包括HTML文件、圖象文件、聲音文件、動(dòng)畫(huà)文件以及其他任何內(nèi)容(并不完全是文件,也可以是一個(gè)對(duì)數(shù)據(jù)庫(kù)的查詢等)。通過(guò)URL,就可以訪問(wèn)Internet。瀏覽器或其他程序通過(guò)解析給定的URL就可以在網(wǎng)絡(luò)上查找相應(yīng)的文件或其他資源。一個(gè)URL包括兩部分內(nèi)容:協(xié)議名稱和資源名稱協(xié)議名稱和資源名稱,中間用冒號(hào)隔開(kāi):Protocol:resourceName 如:http:/獲取URL的方法public String getProtocol():獲取該URL的協(xié)

10、議名public String getHost() :獲取該URL的主機(jī)名public String getPort() :獲取該URL的端口號(hào)public String getPath() :獲取該URL的文件路徑public String getFile() :獲取該URL的文件名public String getRef() :獲取該URL在文件中的相對(duì)位置public String getQuery() :獲取該URL的查詢名使用URL獲取網(wǎng)站信息URL gis=new URL();System.out.println(Protocol:+gis.getProtocol();System

11、.out.println(hostname:+gis.getHost();System.out.println(port:+gis.getPort();System.out.println(file:+gis.getFile(); BufferedReader in=new BufferedReader(new InputStreamReader(gis.openStream(),utf-8); /讀取網(wǎng)站信息 String line; while(line=in.readLine()!=null)System.out.println(line); in.close();方法方法openStr

12、eam()openStream()與指定的與指定的URLURL建立建立連接并返回一個(gè)連接并返回一個(gè)InputStreamInputStream對(duì)象,對(duì)象,將將URLURL位置的資源轉(zhuǎn)成一個(gè)輸入數(shù)據(jù)位置的資源轉(zhuǎn)成一個(gè)輸入數(shù)據(jù)流。通過(guò)這個(gè)流。通過(guò)這個(gè)InputStreamInputStream對(duì)象,就對(duì)象,就可以讀取資源中的數(shù)據(jù)可以讀取資源中的數(shù)據(jù)URLJava 程序程序InputStream HTTPURLConnection用用HTTPURLConnection類提交請(qǐng)求到百度搜索并獲取搜索后的結(jié)果。請(qǐng)類提交請(qǐng)求到百度搜索并獲取搜索后的結(jié)果。請(qǐng)求搜索內(nèi)容:求搜索內(nèi)容:java百度搜索_java

13、 . 搜索結(jié)果:搜索結(jié)果:(代碼是搜索后返回的代碼是搜索后返回的html源碼源碼,圖片為瀏覽器顯示效果圖片為瀏覽器顯示效果)public class TestParamURL public static void main(String args) String strUrl = http:/ param = wd=java;System.out.println(sendGet(strUrl, param);/ 以GET方式提交HTTP請(qǐng)求到服務(wù)器,并返回結(jié)果public static String sendGet(String url, String param) String result

14、 = ;try String urlName = url + ? + param;URL u = new URL(urlName);URLConnection connection = u.openConnection();catch().代碼展示connection.connect();BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream();String line;while (line = in.readLine() != null) result += n + lin

15、e;in.close(); catch (Exception e) System.out.println(沒(méi)有結(jié)果! + e);return result;銜接上一頁(yè)/* * 以POST方式提交HTTP請(qǐng)求到服務(wù)器,并返回結(jié)果* 參數(shù)形式為參數(shù)名=值&參數(shù)名=值*/public static String sendPost(String url, String param) String result = ;try URL httpurl = new URL(url);HttpURLConnection httpConn = (HttpURLConnection) httpurl.op

16、enConnection();/ 設(shè)置是否向httpUrlConnection輸出,因?yàn)檫@個(gè)是post請(qǐng)求,參數(shù)要放在http正文內(nèi),因此需要設(shè)為true, 默認(rèn)情況下是false;httpConn.setDoOutput(true);/ 設(shè)置是否從httpUrlConnection讀入,默認(rèn)情況下是true;銜接上一頁(yè)httpConn.setDoInput(true);/ Post 請(qǐng)求不能使用緩存httpConn.setUseCaches(false);/ 設(shè)定傳送的內(nèi)容類型是可序列化的java對(duì)象/ (如果不設(shè)此項(xiàng),在傳送序列化對(duì)象時(shí),當(dāng)WEB服務(wù)默認(rèn)的不是這種類型時(shí)可能/拋java.i

17、o.EOFException)httpConn.setRequestProperty(Content-type,application/x-java-serialized-object);/ 設(shè)定請(qǐng)求的方法為POST,默認(rèn)是GEThttpConn.setRequestMethod(POST);銜接上一頁(yè)/ 利用輸出流向服務(wù)器傳送參數(shù),參數(shù)形式為參數(shù)名=值&參數(shù)名=值PrintWriter out = new PrintWriter(httpConn.getOutputStream();out.print(param);out.flush();out.close();BufferedRe

18、ader in = new BufferedReader(new InputStreamReader(httpConn.getInputStream();String line;while (line = in.readLine() != null) result += n + line;in.close(); catch (Exception e) System.out.println(沒(méi)有結(jié)果! + e);return result;銜接上一頁(yè)TCP 與 UDP通信協(xié)議的Java實(shí)現(xiàn)Socket套接字Socket套接字:把網(wǎng)絡(luò)連接當(dāng)成一個(gè)流,可以通過(guò)流的方式實(shí)現(xiàn)數(shù)據(jù)的交換。服務(wù)器套接字(S

19、erverSocket)客戶端套接字客戶端套接字Socket(String host,int port) Socket(InetAddress address,int port)public InetAddress getInetAddress()public int getPort()public int getLocalPort()public InetAddress getLocalAddress()public InputStream getInputStream() throws IOExceptionpublic OutputStream getOutputStream() thr

20、ows IOExceptionpublic void close() throws IOException服務(wù)器端套接字ServerSocket()ServerSocket(int port)ServerSocket(int port,int backlog)ServerSocket(int port,int backlog,InetAddress bindAddr)服務(wù)器端套接字服務(wù)器端套接字:每個(gè)服務(wù)器端套接字運(yùn)行在服務(wù)器上特定的端口,監(jiān)聽(tīng)這個(gè)端口的TCP連接。Socket accept():監(jiān)聽(tīng)并接受到此套接字的連接監(jiān)聽(tīng)并接受到此套接字的連接void close():關(guān)閉此套接字關(guān)閉此套

21、接字Socket TCP通信基本步驟第1步:在客戶端和服務(wù)器端創(chuàng)建Socket/ServerSocket實(shí)例第2步:打開(kāi)連接到Socket的輸入/輸出流第3步:利用輸入/輸出流,按照一定的協(xié)議對(duì)Socket進(jìn)行讀/寫(xiě)操作第4步:關(guān)閉輸入/輸出流和Socket創(chuàng)建服務(wù)器創(chuàng)建服務(wù)器(端口號(hào)端口號(hào))定義數(shù)據(jù)成員定義數(shù)據(jù)成員服務(wù)器等待服務(wù)器等待網(wǎng)絡(luò)連接網(wǎng)絡(luò)連接建立建立socket流流讀客戶端信息讀客戶端信息向用戶發(fā)出一個(gè)字符串向用戶發(fā)出一個(gè)字符串創(chuàng)建創(chuàng)建Socket實(shí)例實(shí)例定義數(shù)據(jù)成員定義數(shù)據(jù)成員建立建立socket流流讀讀socket流流(接收并顯示)(接收并顯示)發(fā)送用戶名給服務(wù)器發(fā)送用戶名給服務(wù)

22、器關(guān)閉流關(guān)閉流waiting for user 34343434提示用戶登錄成功提示用戶登錄成功讀讀socket流流關(guān)閉流關(guān)閉流服務(wù)器端服務(wù)器端客戶端客戶端Socket通信示例try try ServerSocket s = new ServerSocket(3434); / 1 ServerSocket s = new ServerSocket(3434); / 1、建立、建立SocketSocket while (true) while (true) Socket s1 = s.accept();Socket s1 = s.accept();/ 2/ 2、在客戶端和服務(wù)器

23、端同時(shí)打開(kāi)輸入、在客戶端和服務(wù)器端同時(shí)打開(kāi)輸入/ /輸出流輸出流/ BufferedWriter bw = new BufferedWriter(/ BufferedWriter bw = new BufferedWriter(/ new OutputStreamWriter(s1.getOutputStream();/ new OutputStreamWriter(s1.getOutputStream();/ bw.write(/ bw.write(你好你好, +s1.getInetAddress()+ : + s1.getPort();, +s1.getInetAddress()+ : +

24、 s1.getPort();/ bw.close();/ bw.close();/ / 服務(wù)器端讀信息服務(wù)器端讀信息BufferedReader br = new BufferedReader(new BufferedReader br = new BufferedReader(new InputStreamReader(s1InputStreamReader(s1.getInputStream();.getInputStream();String str = br.readLine();String str = br.readLine();System.System.outout.println(.println(客戶端說(shuō)客戶端說(shuō): + str);: + str);s1.close();s1.close(); catch (IOException e) catch (IOException

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論