




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第11章Java網絡編程第一頁,共49頁。11.1概述11.1.1網絡編程的基本概念網絡編程的目的就是指直接或間接地通過網絡協(xié)議與其他計算機進行數據傳遞。網絡編程中有兩個主要問題:一個是如何準確的定位網絡上一臺或多臺主機;另一個就是找到主機后如何可靠高效地進行數據傳輸。第二頁,共49頁。11.1網絡編程的基本概念11.1.1網絡編程的基本概念在TCP/IP協(xié)議中:IP層主要負責網絡主機的定位以及數據包的尋址,由IP地址可以唯一地確定Internet上的一臺主機。TCP層則提供面向應用的可靠的或不可靠的數據傳輸機制,這是網絡編程的主要對象,一般不需要關心IP層對數據包如何封裝。第三頁,共49頁。11.1網絡編程的基本概念從軟件體系結構角度對網絡應用程序分類:B/S結構:只需要對應的客戶機上有瀏覽器(如IE)即可,不需要安裝專門的客戶端軟件,客戶機的瀏覽器程序通過HTTP(超文本傳輸協(xié)議)訪問服務器上的資源。C/S結構:需要在客戶機上安裝專門的客戶端軟件。通訊雙方的一方作為服務器,另一方則作為客戶端。本章討論的基于Java的網絡應用程序設計主要是基于C/S結構的。第四頁,共49頁。11.1網絡編程的基本概念11.1.2Java網絡編程方法Java網絡編程方法主要有兩種:通過URL類和URLConnection類訪問WWW網絡資源。由于URL十分方便直觀,盡管在功能上有一定的局限性,但在某些情況下還是值得推薦的。借助Socket套接字實現基于TCP協(xié)議或UDP協(xié)議的網絡編程。TCP編程主要用到的類有Socket、ServerSocket;UDP編程主要用到的類有DatagramSocket、DatagramPacket和MulticastSocket。第五頁,共49頁。11.2基于URL的網絡編程11.2.1URL組成和基本用法URL(UniformResourceLocator,統(tǒng)一資源定位符):是用于完整地描述Internet上網頁和其他資源的地址的一種標識方法。URL確定一個地址是通過使用一定的順序把數字和字母排列起來。瀏覽器通過解析給定的URL地址,可對我們訪問的Internet上的各種網絡資源,比如文件、Web站點、新聞組、網頁等進行訪問及數據傳輸。第六頁,共49頁。11.2基于URL的網絡編程URL的一般格式:協(xié)議://主機名[:端口號]/路徑/#引用協(xié)議是指獲取資源使用的傳輸協(xié)議,最常用的是http,此外,還有https、ftp、gopher、file以及mms等。主機名是指訪問資源所在的服務器的地址。
端口號為可選項,是傳輸層服務訪問點。路徑一般用來表示目的主機上的一個目錄或文件地址,同端口一樣,路徑也是可以缺省的。引用是指向資源文件的具體位置,該項也不是必須的。第七頁,共49頁。11.2基于URL的網絡編程URL類中的構造方法:1)通過指定協(xié)議,主機名,端口和路徑來構造URL對象。publicURL(Stringprotocol,Stringhost,intport,Stringfile)throwsMalformedURLException2)通過指定協(xié)議,主機名和路徑來構造URL對象。publicURL(Stringprotocol,Stringhost,Stringfile)throwsMalformedURLException3)通過指定協(xié)議,主機名,端口號,路徑和流處理器來構造URL對象。publicURL(Stringprotocol,Stringhost,intport,Stringhandler)throwsMalformedURLException4)通過代表URL的字符串構造URL對象。publicURL(Stringspec)throwsMalformedURLException5)通過URL對象和相對此URL對象的部分URL來構造URL對象。publicURL(URLcontext,Stringspec)throwsMalformedURLException6)通過URL對象和相對此URL對象的部分URL來構造URL對象,同時設定此URL對象的流處理器。publicURL(URLcontext,Stringspec,URLStreamHandlerhandler)throwsMalformedURLException第八頁,共49頁。11.2基于URL的網絡編程URL中含有特殊字符時需要進行額外處理:例如:對于world/其中含有空格,需要對URL進行編碼,實現如下:URLurl=newURL(“”),用%20替代空格。URL構造時的異常捕獲:一般使用try/catch語句對異常進行捕獲try{URLmyURL=newURL(…)}catch(MalformedURLExceptione){…//相關異常處理代碼…}第九頁,共49頁。11.2基于URL的網絡編程URL對象屬性的獲?。篣RL對象是只寫一次的對象,一旦生成一個URL對象,其屬性是不能被隨意更改的,但是可以通過類URL所提供的方法來獲取這些屬性。方法描述publicStringgetProtocol()獲取URL對象的協(xié)議名publicStringgetHost()獲取URL對象的主機名publicintgetPort()獲取URL對象的端口號,如果沒有設置端口,返回-1publicStringgetFile()獲取URL對象的文件名publicStringgetPath()獲取URL對象的路徑信息publicStringgetQuery()獲取URL對象的查詢信息publicStringgetUserInfo()獲取URL對象的用戶信息第十頁,共49頁。11.2基于URL的網絡編程URL對象屬性的獲?。悍椒枋鰌ublicStringgetAuthority()獲取URL對象的權限,認證信息publicintgetDefaultPort()返回與這個URL對象相關的協(xié)議的缺省端口號publicStringgetRef()獲取URL對象在文件中的相對位置,返回URL對象的引用(錨)。publicStringtoExternalForm()返回這個URL對象代表的URL的字符串表示publicbooleansameother)比較本URL對象與另一個URL對象是否指向的是同一個目標publicURLConnectionopenConnection()throwsIOException打開一個到URL對象指向的網絡資源的URLConnection第十一頁,共49頁。11.2基于URL的網絡編程URL對象屬性的獲取:方法描述publicfinalInputStreamopenStream()throwsIOException打開一個到URL對象指向的網絡資源的輸入流,通過這個流,可以讀取這個網絡資源的內容publicfinalObjectgetContent()throwsIOException獲取此URL的內容,這個方法相當于openConnection().getContent()publicfinalObjectgetContent(Class[]classes)throwsIOException這個方法相當于openConnection().getContent(Class[])第十二頁,共49頁。11.2基于URL的網絡編程【例11-1】:生成一個URL對象,并獲取它的各個屬性
代碼:11-1.txt運行結果輸出URL地址的個屬性值,因為URL沒有參考點,輸出為null。第十三頁,共49頁。11.2基于URL的網絡編程11.2.2連接和讀取Web資源通過URLConnection連接WWW:用URL類的openStream()方法可從網絡上讀取數據,如果同時還想輸出數據,例如向服務器端CGI(通用網關接口)程序發(fā)送一些數據,就需要用到URLConnection類,與URL建立連接,然后對其進行讀/寫操作。URLConnection類是實現應用程序和URL之間通信連接的所有類的超類,該類的實例可以用來讀寫URL所指的資源。在創(chuàng)建了URL對象之后,可以使用該URL對象的openConnection方法來創(chuàng)建URLConnection對象,之后就可以完成各種各樣的操作。第十四頁,共49頁。11.2基于URL的網絡編程看如下程序段:try{URLnetChinaJavaWorld=newURL(“”);URLConnectionuc=netChinaJavaWorld.openConnection();}catch(MalformedURLExceptione){//創(chuàng)建URL()對象失敗…}catch(IOExceptione){//openConnection()失敗…}以上程序段生成一個指向地址的對象,然后用openConnection()打開該URL對象上的一個連接,返回一個URLConnection對象,假如連接過程失敗,會產生IOException類型異常。第十五頁,共49頁。11.2基于URL的網絡編程以上在類URLConnection中,提供了很多設置或獲取連接參數的方法,其中,最常使用的是獲得輸入流的方法getInputStream()和獲得輸出流的方法getOutputStream(),定義如下:方法描述getInputStream()返回該URLConnection對應的輸入流,用于獲取URLConnection響應的內容getOutputStream()返回該URLConnection對應的輸出流,用于向URLConnection發(fā)送請求參數第十六頁,共49頁。11.2基于URL的網絡編程如下代碼:URLnetChinaJavaWorld=newURL(“”);//創(chuàng)建一URL對象URLConnectionuc=netChinaJavaWorld.openConnection();//由URL對象獲取URLConnection對象DataInputStreamdis=newDataInputStream(uc.getInputSteam());//由URLConnection獲取輸出流,并構造PrintStream對象PrintStreamps=newPrintSteam(uc.getOutupSteam());//由URLConnection獲取輸出流,并構造PrintStream對象Stringline=dis.readLine();//從服務器讀入一行
ps.println(“client…”);//向服務器寫出字符串”client…”第十七頁,共49頁。11.2基于URL的網絡編程用URL讀取WWW數據資源:在取得一個URL對象后,的openStream()方法,可以獲得所需的特定的WWW資源。其定義為:InputStreamopenStream():返回一個用于從當前連接讀入的InputStream。實際上,類URL的方法openSteam()是通過URLConnection來實現的,它等價于openConnection().getInputStream()。第十八頁,共49頁。11.2基于URL的網絡編程在該方法的使用中,需要先定義一個URL對象,并與該URL的方法openStream()建立連接,從該連接中讀取所需要的數據,返回結果為InputStream類的對象。然后就可以使用標準的輸入/輸出方法將讀取到的數據打印到顯示終端上。第十九頁,共49頁。11.2基于URL的網絡編程【例11-2】用URL讀取WWW數據打印到終端上://Ex11_2_URLReaderpublicclassEx11_2_URLReader{publicstaticvoidmain(String[]args)throwsException{//聲明main方法拋出所有例外URLurlSina=newURL("");//構建一個URL 對象BufferedReaderin=newBufferedReader(newInputStreamReader(urlSina.openStream()));//使用openStream得到一輸入流并由此構造一個BufferedReader對象第二十頁,共49頁。11.2基于URL的網絡編程【例11-2】用URL讀取WWW數據打印到終端上:
代碼:11-2.txt
該例中,首先定義了一個URL對象urlSina,指向新浪網站的主頁,然后調用urlSina.openStream()方法,生成該URL的一個字節(jié)輸入流,接著,通過InputStreamReader以及BufferedReader生成一個緩沖字符流,最后調用BufferedReader對象的readLine()方法讀取新浪主頁的HTML內容。第二十一頁,共49頁。11.3基于連接的套接字通信方式11.3.1套接字通信的概念套接字:在應用層向傳輸層進行數據通信時,TCP/UDP并不是每次都只為單個應用程序進程提供服務,很多時候會有多個應用程序進程同時提出請求服務。多個TCP連接或多個應用程序進程可能需要通過同一個TCP協(xié)議端口傳輸數據。為了區(qū)別不同的應用程序進程和連接,許多計算機操作系統(tǒng)為應用程序與TCP/IP協(xié)議交互提供了稱為套接字(Socket)的接口套接字:是網絡通信的應用程序接口,可以實現客戶機與服務器之間的通信。第二十二頁,共49頁。11.3基于連接的套接字通信方式套接字的結構描述:{協(xié)議,本地地址,本地端口,遠程地址,遠程端口}協(xié)議:用來指明應用程序通信的傳輸層協(xié)議,有面向連接的TCP和無連接的UDP;本地地址和遠程地址:是用來標識通信雙方的主機,可以使用IP地址或主機名字來進行標識,能夠對網絡中的任意主機進行唯一定位。本地端口和遠程端口:用來對通信雙方的具體應用進程進行識別,在計算機中采用16位的二進制來表示端口號,范圍是0-65535,0-1023的端口號為系統(tǒng)保留端口,設計應用程序時不可以使用這些端口。第二十三頁,共49頁。11.3基于連接的套接字通信方式套接字分類:根據網絡通信的特征,套接字主要分為兩類:基于TCP的流式套接字(SOCK_STREAM):提供可靠、全雙工的字節(jié)流服務,網絡通信操作是在一對進程之進行的,因此在進行通信時,雙方必須首先創(chuàng)建一個連接過程,建立起一條通信鏈路,通信結束直接關閉此連接過程即可?;赨DP的數據報套接字(SOCK_DGRAM):不需要保證數據傳輸的可靠性和完整性,網絡通信的操作是在不同的主機和進程之間轉發(fā)完成的,不需要建立專門的連接和通信鏈路。第二十四頁,共49頁。11.3基于連接的套接字通信方式11.3.2TCP套接字通信的一般過程實現TCP套接字的服務器端和客戶端步驟:服務器端步驟創(chuàng)建套接字綁定套接字設置套接字為監(jiān)聽模式,進入被動接收連接請求狀態(tài)接收請求,建立連接讀/寫數據終止連接客戶端步驟創(chuàng)建套接字
與遠程服務器程序鏈接讀/寫數據終止連接第二十五頁,共49頁。11.3基于連接的套接字通信方式11.3.3基于連接的網絡編程一對一的Socket通信:在Internet的互聯中,TCP/IP協(xié)議使用非常廣泛,TCP是一種可靠的,面向連接的傳輸層協(xié)議。在C/S模式下,網絡上的兩個進程進行通信,當兩臺主機準備進行會話時,必須先建立一個Socket連接,其中一方作為服務器,另一方作為客戶端,服務器打開一個Socket并實時監(jiān)聽來自網絡的連接請求,客戶端向網絡上的服務器發(fā)送請求,通過Socket向服務器傳遞信息,請求建立連接,只需指定主機的IP地址和端口號即可。第二十六頁,共49頁。11.3基于連接的套接字通信方式基于連接的服務端及客戶端流程圖第二十七頁,共49頁。11.3基于連接的套接字通信方式【例11-3】一對一通信程序(服務端程序)
代碼:11-3.txt客戶端運行界面:服務端運行界面:第二十八頁,共49頁。11.3基于連接的套接字通信方式一對多的Socket通信:前面講解的C/S程序只能實現服務器和一個客戶的交談。在實際應用中,通常是多個客戶端同時向服務器提出請求,因此往往是在服務器上運行一個常駐程序,用它來接收來自多個客戶端的請求,并提供相應的服務。這個功能的實現只需使用多線程對服務器端進行改造,就可實現多客戶機制。第二十九頁,共49頁。11.3基于連接的套接字通信方式并發(fā)服務器的原理是:客戶方向服務器發(fā)送請求,服務器在接受請求后,立即調用一個線程,來實現服務器與客戶方之間的交互,主程序則返回繼續(xù)監(jiān)聽端口,等待下一個客戶的連接請求。前一個線程在完成相應的交互過程后自動退出,連接也將自動關閉。實現并發(fā)服務器的基本方法:在服務器的程序中首先創(chuàng)建單個ServerSocket,并調用accept()來等候一個新連接,一旦accept()返回,就取得獲得結果的Socket,并用它新建一個線程,令其只為那個特定的客戶提供服務;然后再調用accept(),等候下一個新的連接請求。第三十頁,共49頁。11.3基于連接的套接字通信方式【例11-4】一對多通信程序(服務端程序)代碼:11-4.txt
運行界面:1號客戶端運行界面:2號客戶端運行界面:服務端運行界面:第三十一頁,共49頁。11.4基于無連接的數據報通信方式11.4.1數據報通信的概念TCP和UDP的區(qū)別:通信方式協(xié)議可靠性數據量是否需要連接應用流式通信TCP可靠,有序,無差錯,無重復,不會丟失數據大量數據需要連接http,telnet,ftp服務數據報通信UDP不可靠,會丟失數據少量數據無連接,每個數據報包括源地址和目標地址時間服務,ping程序第三十二頁,共49頁。數據報通信的表示方法:DatagramSocket和DatagramPacket也是在包中定義的,適用于在java中編寫使用UDP協(xié)議通信的網絡程序。兩者的用途不相同:DatagramSocket:程序之間建立了一個通信連接,用來傳送數據報。DatagramPacket:用來表示一個數據報。11.4基于無連接的數據報通信方式第三十三頁,共49頁。11.4基于無連接的數據報通信方式DatatgramSocket類的構造器和使用方法:方法描述PublicDatagramSocket()創(chuàng)建一個DatagramSocket類的對象,并綁定到本地主機上的指定的可用端口PublicDatagramSocket(intport)創(chuàng)建一個DatagramSocket類的對象,并綁定到本地主機上的某個可用端口PublicDatagramSocket(intport,InetAddressladdr)創(chuàng)建一個與本地地址綁定的DatagramSocket類的對象Publicvoiddisconnect()斷開連接第三十四頁,共49頁。11.4基于無連接的數據報通信方式方法描述PublicInetAddressgetAddress()連接的目的端的IP地址PublicInetAddressgetLocalAddress()本地的IP地址PublicintgetLocalPort()本地端口PublicintgetPort()連接目的端的端口PublicintgetReceiveBufferSize()接收端數據緩沖區(qū)的大小,對應還有setSendBufferSize(int)Publicvoidreceive(DatagramPacketp)接收數據包并將數據保存在DatagramPacket中,實際是DatagramPacket指定了一個數據緩存Publicvoidsend(DatagramPacketp)發(fā)送數據包Publicvoidclose()關閉DatagramPacket第三十五頁,共49頁。11.4基于無連接的數據報通信方式DatatgramPacket類的構造器和使用方法:
用于處理報文,它將Byte數組,目標地址,目標端口等數據包裝成報文或者將報文拆卸成Byte數組。方法描述PublicDatagramPacket(byteibuf[],intilength)創(chuàng)建一個帶有指定長度為ilength的字節(jié)數組的數據包PublicDatagramPacket(byteibuf[],intilength,InetAddressiaddr,intiport)創(chuàng)建一個用于發(fā)送的DatagramPacket類對象,它指定了發(fā)送數據的長度,接收端的IP地址和端口號PublicsynchronizedInetAddressgetAddress()返回發(fā)送數據包的主機IP地址PublicsynchronizedintgetPort()返回發(fā)送數據包的主機的端口號第三十六頁,共49頁。11.4基于無連接的數據報通信方式11.4.1數據報通信的概念DatatgramPacket類的構造器和使用方法:方法描述Publicsynchronizedbyte[]getData()取得發(fā)送或者接收的數據包的數據信息,這個方法很重要PublicsynchronizedintgetLength()取得數據包的長度PublicsynchronizedvoidsetAddress(InetAddressiaddr)設置數據包的IP地址PublicsynchronizedvoidsetPort(intiport)設置數據包發(fā)送目的端的端口號PublicsynchronizedvoidsetData(byteibuf[])設置數據緩沖區(qū)的數據PublicsynchronizedvoidsetLength(intilength)設置數據包的長度第三十七頁,共49頁。11.4基于無連接的數據報通信方式下面的程序建立了一個客戶端和服務端的數據包scokets:DatagramSocketserverSocket=newDatagramSocket(8888);DatagramSocketclientSocket=newDatagramSocket();第三十八頁,共49頁。11.4基于無連接的數據報通信方式方法介紹:在DatagramSocket的構造器中,服務器用參數8888來指定端口號,由于客戶端是主動向服務器發(fā)送會話請求的一方,所以客戶端使用的端口可以和服務器使用的端口不相同,它可以使用系統(tǒng)中非保留的端口。在第2種形式的構造器中沒有指定端口,程序會讓操作系統(tǒng)自動分配一個供通信用的可用的端口。第三十九頁,共49頁。11.4基于無連接的數據報通信方式需要注意:在客戶端也可以自行請求一個指定的端口,但如果這個端口已經被其他應用程序綁定,則會拋出一個異常SocketException,表示請求失敗,此時程序非法終止。因此必須注意捕獲這個異常,建議如果并不想構建一個服務器,最好不要指定端口。第四十頁,共49頁。11.4基于無連接的數據報通信方式向多個地址傳送數據:DatagramSocket類只允許數據報發(fā)送到一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權】 IEC TS 63346-1-1:2024 EN Low-voltage auxiliary power systems - Part 1-1: Terminology
- 【正版授權】 IEC 62386-105:2024 EN-FR Digital addressable lighting interface - Part 105: Particular requirements for control gear and control devices - Firmware transfer
- 【正版授權】 ISO/IEC TR 19583-24:2025 EN Information technology - Concepts and usage of metadata - Part 24: 11179-3:2013 Metamodel in RDF
- 2025-2030年中國鋅系常溫磷化液市場運營現狀與發(fā)展前景分析報告
- 2025-2030年中國釩鐵行業(yè)市場經營狀況及投資戰(zhàn)略研究報告
- 2025江西省安全員B證(項目經理)考試題庫
- 2025-2030年中國軟體家具市場運行態(tài)勢及發(fā)展趨勢分析報告
- 2025-2030年中國貝復舒行業(yè)前景展望及未來投資規(guī)劃研究報告
- 2025-2030年中國蛋品加工市場運營狀況及發(fā)展趨勢分析報告
- 2025-2030年中國管道管產業(yè)前景趨勢及投資戰(zhàn)略研究報告
- 課件-DeepSeek從入門到精通
- 17J008擋土墻(重力式、衡重式、懸臂式)圖示圖集
- 藥品類體外診斷試劑專項培訓課件
- 自動化生產線運行與維護完整版課件(全)
- 回字格+米字格練字模版(A4最大利用率)
- 食品經營操作流程圖
- 小學生必背古詩詞80首硬筆書法字帖
- 中風(腦梗死恢復期)中醫(yī)護理方案(課堂PPT)
- X52K銑床參數
- 橡膠履帶力學分析及優(yōu)化設計
- CFM56-7發(fā)動機滑油系統(tǒng)及其常見故障分析(共41頁)
評論
0/150
提交評論