版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
人民郵電出版社14網(wǎng)絡(luò)編程Java程序設(shè)計第章導(dǎo)讀Introduction網(wǎng)絡(luò)編程是Java編程技術(shù)中一個重要的組成部分,本章將學(xué)習(xí)Java語言中專門用于網(wǎng)絡(luò)編程的基礎(chǔ)類,通過這些類可以很方便地實現(xiàn)網(wǎng)絡(luò)通信。C目錄ONTENTS14.2基于URL的網(wǎng)絡(luò)編程14.3InetAddress類14.4套接字14.5UDP數(shù)據(jù)報14.6廣播數(shù)據(jù)報14.1網(wǎng)絡(luò)基礎(chǔ)14.7基于NIO的編程14.1.1
網(wǎng)絡(luò)基本概念計算機網(wǎng)絡(luò)就是指將地理位置不同的計算機通過通信線路連接起來,實現(xiàn)資源共享和信息傳遞。網(wǎng)絡(luò)編程就是通過程序?qū)崿F(xiàn)兩臺(或多臺)主機之間的數(shù)據(jù)通信。要想實現(xiàn)這一目標(biāo),首先要建立連接,然后按照事先規(guī)定好的格式進(jìn)行數(shù)據(jù)傳輸,從而完成主機之間的信息傳輸。14.1.1網(wǎng)絡(luò)基本概念1.IP地址和域名IP地址是識別網(wǎng)絡(luò)主機的唯一身份標(biāo)識。IP地址是由32位二進(jìn)制數(shù)組成(IPv4為例),通常寫成4個0~255之間的數(shù)字。域名可看做是IP地址的別稱,用字符進(jìn)行描述,便于理解和記憶。在網(wǎng)絡(luò)通信過程中只能使用IP地址。DNS是地址解析系統(tǒng),實現(xiàn)域名與IP地址的自動轉(zhuǎn)換工作。14.1.1網(wǎng)絡(luò)基本概念端口是用于識別主機進(jìn)程的標(biāo)識。Socket是主機IP地址+端口號。網(wǎng)絡(luò)編程也稱為基于Socket的編程。2.端口和SocketClient是發(fā)起請求的一方,被稱作客戶端;Server是接受請求的另一方,被稱作服務(wù)器端。C/S模式稱為客戶端/服務(wù)器端模式,簡稱C/S模式。B/S模式:特殊的C/S模式。Browser是瀏覽器,不需要安裝額外的客戶端程序就能訪問服務(wù)器端。3.C/S模式14.1.2TCP和UDP協(xié)議1.TCP協(xié)議2.UDP協(xié)議TCP(TransmissionControlProtocol——傳輸控制協(xié)議)是一種面向連接的可靠的傳輸協(xié)議。采用通信雙方相互應(yīng)答的方式來保證數(shù)據(jù)傳送的可靠性。網(wǎng)絡(luò)的通信開銷增加,協(xié)議也更為復(fù)雜。大部分網(wǎng)絡(luò)通信都采用TCP協(xié)議。UDP(UserDatagramProtocol——用戶數(shù)據(jù)報協(xié)議)是一種面向無連接的傳輸協(xié)議。不需要通信雙方事先建立連接和應(yīng)答就進(jìn)行傳輸。協(xié)議簡單,效率更高,但不保證通信的可靠性。適用一些簡單的網(wǎng)絡(luò)應(yīng)用。C目錄ONTENTS14.2基于URL的網(wǎng)絡(luò)編程14.3InetAddress類14.4套接字14.5UDP數(shù)據(jù)報14.6廣播數(shù)據(jù)報14.1網(wǎng)絡(luò)基礎(chǔ)14.7基于NIO的編程
14.2.1URL基礎(chǔ)URL(UniformResourceLocation),稱為統(tǒng)一資源定位符,它是指向互聯(lián)網(wǎng)“資源”的指針。URL格式:協(xié)議名://主機地址[:端口號][/資源路徑][/資源對象]其中:協(xié)議名表示訪問該網(wǎng)絡(luò)資源所采用的協(xié)議。端口號指連接主機服務(wù)的進(jìn)程端口。資源路徑表示資源對象所在的路徑。資源對象指的是待訪問的資源。
14.2.1URL基礎(chǔ).URL類的構(gòu)造方法:publicURL(String
spec)throwsMalformedURLException
另外一個常用的構(gòu)造方法:publicURL(String
protocol,String
host,int
port,String
file)throwsMalformedURLException該構(gòu)造方法分別給出了訪問的協(xié)議、主機地址、,端口和資源對象等參數(shù)。
14.2.2網(wǎng)絡(luò)資源訪問URL中的方法:publicfinalInputStreamopenStream()throwsIOException可以獲得輸入流,用于客戶端從服務(wù)器端讀取數(shù)據(jù)。【例14.1】編程序從命令窗口讀取一個網(wǎng)絡(luò)資源(網(wǎng)頁),并顯示該資源的內(nèi)容。Example14_01.javaC目錄ONTENTS14.2基于URL的網(wǎng)絡(luò)編程14.3InetAddress類14.4套接字14.5UDP數(shù)據(jù)報14.6廣播數(shù)據(jù)報14.1網(wǎng)絡(luò)基礎(chǔ)14.7基于NIO的編程
14.3.1地址的表示表示主機地址主要有兩種形式:IP地址形式和主機名形式。以百度為例,其主機名形式為:,IP地址形式為1/2。百度的主機名只有一個,而IP地址卻有兩個,這是為了實現(xiàn)網(wǎng)絡(luò)訪問的負(fù)載均衡。
14.3.2獲取地址.InetAddress類通過若干個靜態(tài)方法來獲取表示主機IP地址的InetAddress對象。靜態(tài)方法:publicstaticInetAddressgetByName(String
host)throwsUnknownHostException參數(shù)host是一個字符串形式的域名或IP地址。【例14.2】InetAddress類的使用示例。Example14_02.javaC目錄ONTENTS14.2基于URL的網(wǎng)絡(luò)編程14.3InetAddress類14.4套接字14.5UDP數(shù)據(jù)報14.6廣播數(shù)據(jù)報14.1網(wǎng)絡(luò)基礎(chǔ)14.7基于NIO的編程14.4.1套接字概述
套接字,即socket,由IP地址+端口構(gòu)成。計算機網(wǎng)絡(luò)中規(guī)定端口號由16位二進(jìn)制數(shù)表示,即十進(jìn)制數(shù)范圍為0~65535。0~1023端口為公認(rèn)端口或熟知端口,被系統(tǒng)進(jìn)程或常用服務(wù)所占用。選擇端口時要選擇1024以后的端口。套接字根據(jù)連接端的不同可分為客戶端套接字和服務(wù)器端套接字。.Socket類和.ServerSocket類用于客戶機與服務(wù)器端的網(wǎng)絡(luò)編程。14.4.2客戶端套接字
客戶端是發(fā)起連接請求的程序。首先建立網(wǎng)絡(luò)連接,在建立連接時需要指出服務(wù)器端的IP地址和端口號。連接建立成功,就可以實現(xiàn)數(shù)據(jù)交互。數(shù)據(jù)交互時按照請求-響應(yīng)模型由客戶端向服務(wù)器端發(fā)送請求,服務(wù)器端根據(jù)請求內(nèi)容進(jìn)行處理,并將響應(yīng)結(jié)果返回給客戶端。數(shù)據(jù)的交互過程可以進(jìn)行多次,每次均按照請求-響應(yīng)模型進(jìn)行。在數(shù)據(jù)交互結(jié)束后,關(guān)閉網(wǎng)絡(luò)連接,釋放占用的端口、內(nèi)存等資源,結(jié)束客戶端程序。1、客戶端編程步驟14.4.2客戶端套接字
.Socket類代表客戶端連接。最常用的構(gòu)造方法有兩個:2、客戶端套接字publicSocket(String
host,int
port)throwsUnknownHostException,IOExceptionpublicSocket(InetAddress
address,int
port)throwsIOException交互操作是通過輸入流/輸出流完成的。獲取輸出流的方法:
publicOutputStreamgetOutputStream()throwsIOException獲取輸入流的方法:
publicInputStreamgetInputStream()throwsIOException14.4.2客戶端套接字2、客戶端套接字
例:OutputStreamout=socket1.getOutputStream();//建立socket1的輸出流對象InputStreamin=socket2.getInputStream();//建立socket2的輸入流對象建立好輸入輸出流對象,就可以按照第12章的I/O流方式進(jìn)行數(shù)據(jù)交互。數(shù)據(jù)交互完成后,關(guān)閉網(wǎng)絡(luò)連接,釋放占用的資源:socket1.close();14.4.2客戶端套接字2、客戶端套接字【例14.3】客戶機與服務(wù)器通信示例,該程序向服務(wù)器端發(fā)送一個問候字符串:“你好,我是客戶機A”,并顯示服務(wù)器端響應(yīng)的字符串信息:“你好,我是服務(wù)器B”。(配合例14.4)客戶端程序:Example14_03.java14.4.3服務(wù)器端套接字
服務(wù)器端程序監(jiān)聽固定的端口。當(dāng)服務(wù)器端監(jiān)聽到客戶端的連接請求后,與客戶端建立一個網(wǎng)絡(luò)連接。連接建立成功后,雙方進(jìn)行數(shù)據(jù)交互。數(shù)據(jù)交互結(jié)束,關(guān)閉服務(wù)器端,釋放占用的資源。在實際編程中,為解決多用戶響應(yīng)問題,通常采用多線程機制。1、服務(wù)器端編程步驟14.4.3服務(wù)器端套接字
服務(wù)器端使用.ServerSocket類的對象來表示服務(wù)器套接字。ServerSocket類的常用構(gòu)造方法:2、服務(wù)器端套接字publicServerSocket(intport)throwsIOExceptionport為連接指定的端口,如果為0,表示使用任何空閑的端口。在建立連接時,會創(chuàng)建一個連接請求隊列,表示可以連接的最大請求數(shù),默認(rèn)為50。如果隊列滿時再收到連接請求,則拒絕該連接。另一個構(gòu)造方法可以指定請求隊列的長度:
publicServerSocket(intport,intbacklog)throwsIOException參數(shù)backlog為大于0的正整數(shù),表示隊列的最大長度。如果該值小于等于0,則使用默認(rèn)值。
14.4.3服務(wù)器端套接字【例14.4】客戶機與服務(wù)器通信示例,服務(wù)器端。Example14_04.java創(chuàng)建好服務(wù)器套接字后,就可以進(jìn)行連接監(jiān)聽了。連接監(jiān)聽的方法為:publicSocketaccept()throwsIOException此方法監(jiān)聽并接受到此套接字的連接。其在連接傳入之前一直阻塞。例如:Socketsocket=server_socket.accept();一旦監(jiān)聽到請求并建立了socket連接后,就可以進(jìn)行數(shù)據(jù)交互了。14.4.4多線程網(wǎng)絡(luò)編程【例14.5】多線程通信示例。實現(xiàn)一個簡單的四則運算過程:客戶端從鍵盤輸入四則運算表達(dá)式,但不進(jìn)行運算,而是將該表達(dá)式傳送給服務(wù)器端。服務(wù)器端接收到表達(dá)式后進(jìn)行處理和計算,將運算結(jié)果返回給客戶端進(jìn)行顯示。本例由三個類組成,Example14_05_ClientExample14_05_ServerExample14_05_LogicThreadC目錄ONTENTS14.2基于URL的網(wǎng)絡(luò)編程14.3InetAddress類14.4套接字14.5UDP數(shù)據(jù)報14.6廣播數(shù)據(jù)報14.1網(wǎng)絡(luò)基礎(chǔ)14.7基于NIO的編程14.5.1發(fā)送數(shù)據(jù)包
.DatagramPacket類用于將數(shù)據(jù)打包,即封裝成一個數(shù)據(jù)包對象。常用的構(gòu)造方法有兩個:publicDatagramPacket(byte[]buf,intlength,InetAddressaddress,intport)publicDatagramPacket(byte[]buf,intoffset,intlength,InetAddressaddress,intport)參數(shù)buf表示包數(shù)據(jù),length是包長度,length參數(shù)必須小于或等于buf.length,address是發(fā)送的目的地址,port是目的端口號。參數(shù)offset指的是從buf的offset處開始的數(shù)據(jù)。14.5.1發(fā)送數(shù)據(jù)包例如:bytedata[]=”hello”.getByte();//字節(jié)數(shù)組InetAddressaddr=InetAddress.getByName(“”);DatagramPacketdata_send=newDatagramPacket(data,data.length,addr,5151);封裝好數(shù)據(jù)包后,再用.DatagramSocket類創(chuàng)建一個連接對象,這個連接對象將數(shù)據(jù)包發(fā)送出去。例如:
DatagramSocketsend_socket=newDatagramSocket();send_socket.send(data_send);14.5.2接收數(shù)據(jù)包接收端需要創(chuàng)建DatagramSocket對象和DatagramPacket對象。DatagramSocket對象是用于監(jiān)聽接收端口,并將接收到的數(shù)據(jù)存到DatagramPacket對象中。DatagramSocket類的構(gòu)造方法:
publicDatagramSocket(intport)throwsSocketException參數(shù)port為要使用的端口號。DatagramPacket對象的作用是保存接收到的DatagramPacket數(shù)據(jù)包。接收端DatagramPacket類的構(gòu)造方法為:
publicDatagramPacket(byte[]buf,intlength)其中的參數(shù)buf就保存?zhèn)魅霐?shù)據(jù)報的緩沖區(qū),len是要讀取的字節(jié)數(shù)。14.5.2接收數(shù)據(jù)包其他常用方法。讀取發(fā)送端的InetAddress地址:InetAddressgetAddress()獲得發(fā)送端的端口號:intgetPort()獲得收到的數(shù)據(jù)字節(jié)長度:intgetLength()例如:byte[]data=newbyte[1024];intlength=512;DatagramPacketpacket=newDatagramPacket(data,length);最后使用receive_socket對象的receive(DatagramPacketpacket)方法就可以接收數(shù)據(jù)包了。14.5.2接收數(shù)據(jù)包【例14.6】基于UDP的通信示例,客戶端向服務(wù)器端發(fā)送問候信息“你好,我是客戶機A”,服務(wù)器端接收到后回送響應(yīng)信息:“你好,我是服務(wù)器B”。本例程序由兩個類組成,分別是客戶端類Example14_06_Client_UDP和服務(wù)器端類Example14_06_Server_UDP。Example14_06_Client_UDP.javaExample14_06_Server_UDP.javaC目錄ONTENTS14.2基于URL的網(wǎng)絡(luò)編程14.3InetAddress類14.4套接字14.5UDP數(shù)據(jù)報14.6廣播數(shù)據(jù)報14.1網(wǎng)絡(luò)基礎(chǔ)14.7小結(jié)14.6廣播數(shù)據(jù)報
這種通信類似于收音機的廣播,用戶只要調(diào)到指定的頻道上就能收聽到廣播的內(nèi)容。要想實現(xiàn)這個功能需要使用特殊的IP地址。要想實現(xiàn)多播或廣播通信的主機都必須要加入到同一個D類地址中。D類地址的十進(jìn)制表示范圍是:~55。14.6廣播數(shù)據(jù)報
(1)MulticastSocket(intport)throwsIOException創(chuàng)建一個多播套接字,并將其綁定到指定端口上。(2)MulticastSocket(SocketAddressbindaddr)throwsIOException創(chuàng)建一個多播套接字,并將其綁定到一個指定套接字地址上。實現(xiàn)廣播,需要使用.MulticastSocket類。該類是一種基于UDP的DatagramSocket,用于發(fā)送和接收IP多播包。該類的對象可以加入Internet上其他多播主機的“組”中。類DatagramSocket的常用方法:14.6廣播數(shù)據(jù)報(3)publicvoidjoinGroup(InetAddressmcastaddr)throwsIOException//將多播套接字加入到指定多播組中。(4)publicvoidleaveGroup(InetAddressmcastaddr)throwsIOException//將多播套接字移出多播組。(5)publicvoidsetTimeToLive(intttl)throwsIOException//設(shè)置在此MulticastSocket上發(fā)出的多播數(shù)據(jù)包的默認(rèn)生存時間,1為本地網(wǎng)絡(luò)。【例14.7】廣播數(shù)據(jù)報發(fā)送端示例。Example14_07.java【例14.8】廣播數(shù)據(jù)報接收端示例。Example14_08.javaC目錄ONTENTS14.2基于URL的網(wǎng)絡(luò)編程14.3InetAddress類14.4套接字14.5UDP數(shù)據(jù)報14.6廣播數(shù)據(jù)報14.1網(wǎng)絡(luò)基礎(chǔ)14.7基于NIO的編程14.7.1SocketChannel類java.nio.channels.SocketChannel類用于創(chuàng)建面向緩沖區(qū)的套接字通道,通過該類的對象實現(xiàn)雙向通信。返回類型方法名方法功能SocketChannelopen()打開套接字通道SocketChannelopen(SocketAddressremote)打開通道并連接到遠(yuǎn)程地址booleanconnect(SocketAddressremote)連接此通道的遠(yuǎn)程套接字booleanisConnected()判斷是否已連接網(wǎng)絡(luò)套接字booleanisConnectionPending判斷是否正在進(jìn)行連接booleanfinishConnect()完成套接字通道的連接過程Socketsocket()獲取與此通道關(guān)聯(lián)的套接字SelectionKeyregister(Selectorsel,intops)向給定的選擇器注冊此通道,返回一個選擇鍵intread(ByteBufferdst)從通道讀數(shù)據(jù)到給定緩沖區(qū)中,返回讀取的字節(jié)數(shù)intwrite(ByteBuffersrc)將給定緩沖區(qū)中數(shù)據(jù)寫入通道,返回寫入的字節(jié)數(shù)表14.1SocketChannel類的常用方法14.7.2ServerSocketChannel類java.nio.channels.ServerSocketChannel類用于創(chuàng)建服務(wù)器端監(jiān)聽套接字通道,該類對象主要用于接受此套接字的連接。返回類型方法名方法功能staticServerSocketChannelopen()打開服務(wù)器套接字通道ServerSocketsocket()獲取與此通道關(guān)聯(lián)的服務(wù)器套接字SocketChannelaccept()接受到此通道套接字的連接表14.2ServerSocketChannel類的常用方法14.7.3Selector類
通過選擇器,一個線程可以監(jiān)控和處理多個通道的通信,大大提高資源利用率。Selector類,也稱之為選擇器,用于實現(xiàn)Channel通道的多路復(fù)用。選擇器的工作原理:首先把通道注冊到選擇器上,并指出待監(jiān)控類型:連接、讀操作、寫操作等。注冊成功,選擇器會分配給該通道一個鍵值key,并存入選擇器的鍵集合中。然后就可以遍歷鍵集合,獲取各鍵對應(yīng)的通道,根據(jù)當(dāng)前通道的狀態(tài)完成相關(guān)的讀/寫等操作。14.7.3Selector類返回類型方法名方法功能staticSelectoropen()創(chuàng)建一個選擇器booleanisOpen()判斷選擇器是否已打開Set<SelectionKey>keys()獲取選擇器的鍵集合intselect()選擇一組準(zhǔn)備就緒通道的鍵Set<SelectionKey>selectedKeys()獲得選擇器的已選擇鍵集合voidclose()關(guān)閉此選擇器表14.3Selector類的常用方法鍵集合:注冊到此選擇器上的通道鍵集合;已選擇鍵集合:至少為一個操作準(zhǔn)備就緒的通道鍵集合;已取消鍵集合:已被取消,但通道尚未注銷的鍵的集合。在新創(chuàng)建的選擇器中,這三個集合都是空集合。選擇器維護(hù)3個選擇鍵集合:鍵集合;已選擇鍵集合;已取消鍵集合。14.7.4SelectionKey類java.nio.channels.SelectionKey類用于表示通道在選擇器中注冊的選擇鍵。
每次向選擇器注冊通道時就會創(chuàng)建一個選擇鍵。選擇鍵包括兩個操作集:表示下一次調(diào)用選擇器的選擇方法時,測試哪類操作的準(zhǔn)備就緒信息。創(chuàng)建該鍵時使用給定的值初始化interest集合;以后也可通過interestOps(int)方法對其進(jìn)行更改。指示其通道對該操作類別已準(zhǔn)備就緒。該集合外部不能修改。interest集合:ready集合:14.7.4SelectionKey類SelectionKey類的操作類別屬性有:OP_ACCEPT:連接可接受操作,
溫馨提示
- 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個人股權(quán)轉(zhuǎn)讓與債務(wù)剝離合同范本3篇
- 2025年度個人商鋪買賣合同示范文本
- 二零二五年度活動板房安裝及安全性能檢測合同3篇
- 二零二五年度航空航天器內(nèi)部裝飾安裝合同3篇
- 二零二五年度車庫租賃與車位租賃及停車場應(yīng)急救援合同3篇
- 二零二五年度出租車公司品牌推廣與營銷合同3篇
- 二零二五年度綠色建筑設(shè)計與施工技術(shù)服務(wù)合同3篇
- 二零二五年度寵物運輸安全責(zé)任保險合同模板3篇
- 二零二五年度酒店廚房承包與菜品研發(fā)合同匯編3篇
- 二零二五年度瓷磚跨境電商代理銷售合同3篇
- 小學(xué)六年級數(shù)學(xué)上冊《簡便計算》練習(xí)題(310題-附答案)
- 2023-2024學(xué)年度人教版一年級語文上冊寒假作業(yè)
- 培訓(xùn)如何上好一堂課
- 高教版2023年中職教科書《語文》(基礎(chǔ)模塊)下冊教案全冊
- 2024醫(yī)療銷售年度計劃
- 稅務(wù)局個人所得稅綜合所得匯算清繳
- 人教版語文1-6年級古詩詞
- 上學(xué)期高二期末語文試卷(含答案)
- 軟件運維考核指標(biāo)
- 空氣動力學(xué)仿真技術(shù):格子玻爾茲曼方法(LBM)簡介
- 比較思想政治教育學(xué)
評論
0/150
提交評論