




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第16章
Java網絡編程1本章主要內容16.1網絡基礎16.2URL編程16.3用Java語言實現底層網絡通信216.1網絡基礎16.1.1TCP/IP協議16.1.2通信端口16.1.3URL概念16.1.4Java語言的網絡編程316.1.1TCP/IP協議Internet的主要協議有:網絡層的IP協議;傳輸層的TCP和UDP協議;應用層的FTP、HTTP、SMTP等協議。TCP/IP網絡參考模型包括四個層次:應用層、傳輸層、網絡層、鏈路層。每一層負責不同的功能,416.1.1TCP/IP協議1.鏈路層鏈路層也稱為數據鏈路層或網絡接口層。通常包括操作系統中的設備驅動程序和計算機中對應的網絡接口卡。它們一起處理與電纜(或其它任何傳輸媒介)有關的物理接口細節。2.網絡層網絡層對TCP/IP網絡中的硬件資源進行標識。主要完成IP地址的管理。516.1.1TCP/IP協議3.傳輸層在TCP/IP網絡中最常用的傳輸協議是傳輸控制協TCP和用戶數據報協議UDP(UserDatagramProtocol)。主要用來完成數據的傳輸。TCP協議是通過在端點與端點之間建立持續的連接而進行通信的。是一種有序傳輸。UDP協議是一種無連接的傳輸協議。但效率比較高。4.應用層大多數基于Internet的應用程序都被看做TCP/IP網絡的最上層協議——應用層協議。例如:FTP、HTTP、SMTP、POP3、Telnet等協議。616.1.2
通信端口Internet上傳輸的數據都帶有標識目的主機與端口號的地址信息,主機的地址由32位的IP地址標識,IP協議通過該地址把數據發送到正確的目的主機;端口號由一個16位的數字標識,TCP與UDP協議根據端口號把數據傳送給正確的應用程序。端口號的范圍是0~65535,其中1~1023之間的端口號是為HTTP、FTP等系統應用保留的,FTP協議的端口號是21,HTTP協議的端口號是80,Telnet協議的端口號是23,用戶應用程序只能使用1024以上的端口號,其中1024~4999可任意被用戶用作客戶端套接字端口,5000~65535可任意被用戶用作服務端套接字端口。716.1.2
通信端口816.1.3
URL概念URL是統一資源定位器(UniformResourceLocator)的英文縮寫,它表示Internet上某一資源的地址。Internet上的資源包括HTML文件、圖像文件、聲音文件、動畫文件以及其他任何內容(并不完全是文件,也可以是對數據庫的一個查詢等)。916.1.3
URL概念URL的基本結構由5部分組成,其格式如下:傳輸協議://主機名:端口號/文件名#引用1.傳輸協議(protocol):傳輸協議是指所使用的協議名,如HTTP、FTP等。2.主機名(hostname):主機名是指資源所在的計算機??梢允荌P地址,也可以是計算機的名稱或域名。3.端口號(portnumber):一個計算機中可能有多種服務,如Web服務、FTP服務或自己建立的服務等。為了區分這些服務,就需要使用端口號,每一種服務用一個端口號。1016.1.3
URL概念4.文件名(filename):文件名包括該文件的完整路徑。在HTTP協議中,有一個默認的文件名是index.html,因此,下列兩個地址是等價的。/index.html5.引用(reference):引用就是資源內部的某個參考點。如/index.html#chapter1說明:對于一個URL并不是要求它必須包含所有的這5部分內容。1116.1.4Java語言的網絡編程Java語言的網絡編程分為三個層次。最高一級的網絡通信就是我們前面章節中所講的從網絡上下載小程序。次一級的通信,就是前面介紹的通過類URL對象指明文件所在位置,并從網絡上下載聲音和圖像文件,然后對聲音播放和圖像顯示。最低一級的通信是利用包中提供的類直接在程序中實現網絡通信。1216.1.4Java語言的網絡編程借助HTML從網上下載applet在程序中通過URL訪問網上資源通過包中的類直接在程序中實現網絡通訊1316.1.4Java語言的網絡編程針對不同層次的網絡通信,Java語言提供的網絡功能有四大類:URL、InetAddress、Socket、Datagram。InetAddress面向的是IP層,用于標識網絡上的硬件資源。URL面向的應用層,通過URL,Java程序可以直接送出或讀入網絡上的數據。Sockets和Datagram面向的則是傳輸層。Sockets使用的是TCP協議,這是傳統網絡程序最常用的方式,可以想象為兩個不同的程序通過網絡的通信信道進行通信。Datagram則使用UDP協議,是另一種網絡傳輸方式,它把數據的目的地記錄在數據包中,然后直接放在網絡上。1416.1.4Java語言的網絡編程包中的主要的類面向IP層的類:InetAddress面向應用層的類:URL、URLConnection面向傳輸層的類:TCP協議相關類:Socket、ServerSocketUDP協議相關類:DatagramPacket、DatagramSocket、MulticastSocket可能產生的異常:BindException、ConnectException、MalformedURLException、NoRouteToHostException、ProtocolException、SocketException、UnknownHostException、UnknownServiceException1516.2
URL編程在Java中,包里面的類是進行網絡編程的,其中.URL類和.URLConnection類使編程者能很方便的利用URL在Internet上進行網絡通信。1616.2.1
創建URL對象類URL提供了很多構造方法來生成一個URL對象:publicURL(String
spec)publicURL(URLcontext,Stringspec)publicURL(String
protocol,String
host,String
file)publicURL(String
protocol,String
host,int
port,String
file)以下是一些具體的構造實例:URLurl1=newURL(“”);URLbase=newURL(“”);URLurl2=newURL(base,“/mywork1.html”);URLurl4=newURL(“http”,“”,“/lyw/test.html”);URLurl5=newURL(“http”,“”,8080,“/java/network.html”);1716.2.1
創建URL對象一個URL對象生成后,其屬性是不能被改變的,但可以通過它給定的方法來獲取這些屬性:getDefaultport():
返回缺省的端口號。getFile():
獲得URL指定資源的完整文件名getHost():
返回主機名。getPath():
返回指定資源文件目錄和文件名getPort():
返回端口號,默認-1getProtocol():
返回表示URL中協議的字符串對象。getRef():
返回URL中的HTML文檔標記,即#號標記。getUserInfo():
返回用戶信息。toExternalForm():
返回完整的URL字符串。toString():
返回完整URL字符串。1816.2.1
創建URL對象在構造URL對象而使用其構造方法時會拋出MalformedURLException非運行時異常,因此生成URL對象時,必須對這一異常進行處理。例如: try { URLmyURL=newURL(“/”); } catch(MalformedURLExceptione) { e.printStackTrace(); }1916.2.2
使用URL類訪問資源【例16.1】通過URL直接讀取網上服務器中的文件內容。本例是利用URL訪問/index.html文件,即訪問教育網上的index.html文件。讀取網絡上文件內容一般分3個步驟。一是創建URL類的對象;二是利用URL類的openStream()方法獲得對應的InputStream類的對象;三是通過InputStream對象來讀取文件內容。20App16_1.java21App16_1.java2216.3用Java語言實現底層網絡通信用Java語言實現計算機網絡的底層通信,就是用Java程序實現網絡通信協議所規定的功能的操作,這是Java語言網絡編程的一部分。2316.3.1InetAddress程序設計類InetAddress可以用于標識網絡上的硬件資源,它提供了一系列方法以描述、獲取及使用網絡資源。InetAddress類沒有構造函數,因此不能用new來構造一個InetAddress實例。通常是用它提供的靜態方法來獲?。?/p>
publicstaticInetAddressgetByName(String
host)
:host可以是一個機器名,也可以是一個形如“%d.%d.%d.%d”的IP地址或一個DSN域名。
publicstaticInetAddressgetLocalHost() publicstaticInetAddress[]getAllByName(String
host)這三個方法通常會產生UnknownHostException例外,應在程序中捕獲處理。2416.3.1InetAddress程序設計以下是InetAddress類的幾個主要方法:publicbyte[]getAddress():獲得本對象的IP地址(存放在字節數組中)。publicString
getHostAddress():獲得本對象的IP地址“%d.%d.%d.%d”。publicString
getHostName():獲得本對象的機器名。獲得本地主機的IP地址:InetAddressaddr=InetAddress.getLocalHost();25App16_2.java編寫一個Java應用程序,直接查詢自己主機的IP地址和Internet上WWW服務器的IP地址。26App16_2.java2716.3.2基于連接的Socket通信程序設計Socket通信屬于網絡底層通信,它是網絡上運行的兩個程序間雙向通信的一端,它既可以接受請求,也可以發送請求,利用它可以較方便地進行網絡上的數據傳輸。Socket是實現客戶與服務器(Client/Server)模式的通信方式,它首先需要建立穩定的連接,然后以流的方式傳輸數據,實現網絡通信。Socket原意為“插座”,在通信領域中譯為“套接字”,意思是將兩個物品套在一起,在網絡通信里的含義就是建立一個連接。2816.3.2基于連接的Socket通信程序設計1.Socket通信機制的基本概念(1)建立連接當兩臺計算機進行通信時,首先要在兩者之間建立一個連接,也就是兩者分別運行不同的程序,由一端發出連接請求,另一端等候連接請求。當等候端收到請求并接受請求后,兩個程序就建立起一個連接,之后通過這個連接可以進行數據交換。此時,請求方稱為客戶端,接收方稱為服務器端。應用在這兩端的TCPSocket分別稱為服務器Socket和客戶Socket?;驹眍愃朴陔娫捪到y。2916.3.2基于連接的Socket通信程序設計(2)連接地址為了建立連接,需要有一個程序向另一臺計算機上的程序發出請求,其中,能夠唯一識別對方機器的,就是計算機的名稱或IP地址,稱為連接地址,類似于電話系統中的電話號碼。計算機上的每個程序有一個唯一的端口號,通過端口號指定要連接的程序。所以一個完整的連接應該是IP+端口。兩個程序進行連接之前要約定好端口號。有服務器端分配端口號并等候請求,客戶端利用這個端口號發出連接請求,當兩個程序所設定的端口號一致時連接成功。3016.3.2基于連接的Socket通信程序設計(3)TCP/IPSocket通信Socket在TCP/IP協議中定義,針對一個特定的連接,每臺機器上都有一個“套接字”,可以想象在它們之間有一條虛擬的“線纜”,線纜的每一端都插入一個“套接字”或“插座”里。在Java語言中,服務器端套接字使用ServerSocket類,客戶端套接字使用Socket類。3116.3.2基于連接的Socket通信程序設計SOCKET連接過程根據連接啟動的方式以及本地套接字要連接的目標,套接字之間的連接過程可以分為三個步驟:服務器監聽,客戶端請求,連接確認。服務器監聽:服務器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態,實時監控網絡狀態??蛻舳苏埱螅菏侵赣煽蛻舳说奶捉幼痔岢鲞B接請求,要連接的目標是服務器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然后就向服務器端套接字提出連接請求。連接確認:是指當服務器端套接字監聽到或者說接收到客戶端套接字的連接請求,它就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發給客戶端,一旦客戶端確認了此描述,連接就建立好了。而服務器端套接字繼續處于監聽狀態,繼續接收其他客戶端套接字的連接請求。3216.3.2基于連接的Socket通信程序設計3316.3.2基于連接的Socket通信程序設計2.客戶端Socket類與服務器端ServerSocket類在Java中,通信端點由.Socket類(客戶端)或.ServerSocket類(服務器端)表示。位于兩臺不同機器上的應用軟件通過網絡連接發送和接收字節流,從而實現通信。其中,Socket類代表的是客戶端,它是一個連接遠程服務器應用時臨時創建的端點。ServerSocker類代表的是服務器端,它啟動后等待來自客戶端的連接請求;一旦接收到請求,ServerSocket創建一個Socket實例來處理與該客戶端的通信。對于服務器應用,我們不知道客戶端應用什么時候會試圖連接服務器,服務器必須一直處于等待連接的狀態。socket類當客戶程序需要與服務器程序通訊的時候,客戶程序在客戶機創建一個socket對象。3416.3.2基于連接的Socket通信程序設計socket類構造方法publicSocket(String
host,int
port)
創建一個流套接字并將其連接到指定主機上的指定端口號。
publicSocket(InetAddressaddress,int
port)創建一個流套接字并將其連接到指定IP地址的指定端口號publicSocket(String
host,int
port,InetAddress
localAddr,int
localPort)創建一個套接字并將其連接到指定遠程地址上的指定遠程端口publicSocket(InetAddress
address,int
port,InetAddress
localAddr,int
localPort)創建一個套接字并將其連接到指定遠程地址上的指定遠程端口這些方法都將拋出例外IOException,程序中需要捕獲處理。兩個構造函數都創建了一個基于Socket的連接服務器端流套接字的流套接字。3516.3.2基于連接的Socket通信程序設計Socket類常用方法
Socket的輸入/輸出流管理publicInputStreamgetInputStream()publicOutputStreamgetOutputStream()這些方法都將拋出例外IOException,程序中需要捕獲處理。
關閉Socketpublicvoidclose()throwsIOException3616.3.2基于連接的Socket通信程序設計Socket類常用方法設置/獲取Socket數據publicInetAddressgetInetAddress():獲取創建Socket對象時指定的計算機IP地址。publicInetAddressgetLocalAddress():獲取創建Socket對象時客戶計算機的IP地址。publicintgetPort():獲取創建Socket對象時遠程主機的端口號publicintgetLocalPort()publicvoidsetSoTimeout(int
timeout):設定客戶端接口所需等到的時間限度
這些方法都將拋出例外SocketException。3716.3.2基于連接的Socket通信程序設計(2)ServerSocket類ServerSocket類的作用是實現客戶機/服務器模式的通信方式下服務器端的套接字。構造方法:publicServerSocket(int
port)publicServerSocket(int
port,int
backlog):支持指定數目的連接publicServerSocket(int
port,int
backlog,InetAddress
bindAddr)這些方法都將拋出例外IOException,程序中需要捕獲處理。3816.3.2基于連接的Socket通信程序設計(2)ServerSocket類主要方法publicSocketaccept()
:在服務器端的指定端口監聽客戶端發來的連接請求,并與之連接。publicvoidclose()
:關閉SocketpublicInetAddress
getInetAddress():返回服務器的IP地址publicint
getLocalPort():取得服務器的端口號3916.3.2基于連接的Socket通信程序設計(3)Socket通信模式根據連接啟動的方式以及本地套接字要連接的目標,套接字之間的連接過程可以分為三個步驟:服務器監聽,客戶端請求,連接確認。服務器監聽:服務器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態,實時監控網絡狀態??蛻舳苏埱螅菏侵赣煽蛻舳说奶捉幼痔岢鲞B接請求,要連接的目標是服務器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然后就向服務器端套接字提出連接請求。連接確認:是指當服務器端套接字監聽到或者說接收到客戶端套接字的連接請求,它就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發給客戶端,一旦客戶端確認了此描述,連接就建立好了。而服務器端套接字繼續處于監聽狀態,繼續接收其他客戶端套接字的連接請求。4016.3.2基于連接的Socket通信程序設計4116.3.2基于連接的Socket通信程序設計(3)Socket通信模式無論一個Socket通信程序的功能多么齊全、程序多么復雜,其基本結構都是一樣的。主要分為服務器端編程和客戶端編程。服務器程序編寫:①調用ServerSocket(intport)創建一個服務器端套接字,并綁定到指定端口上;②調用accept(),監聽連接請求,如果客戶端請求連接,則接受連接,返回通信套接字。③調用Socket類的getOutputStream()和getInputStream獲取輸出流和輸入流,開始網絡數據的發送和接收。④最后關閉通信套接字。4216.3.2基于連接的Socket通信程序設計 ServerSocket
server
=
new
ServerSocket(9998)
這條語句創建了一個服務器對象,這個服務器使用9998號端口。當一個客戶端程序建立一個Socket連接,所連接的端口號為9998時,服務器對象server便響應這個連接,并且server.accept()方法會創建一個Socket對象。服務器端便可以利用這個Socket對象與客戶進行通訊。 Socketincoming=server.accept()進而得到輸入流和輸出流,并進行封裝 BufferedReaderin=newBufferedReader(newInputStreamReader(incoming.getInputStream())); PrintWriterout=newPrintWriter(incoming.getOutputStream(),true);4316.3.2基于連接的Socket通信程序設計隨后,就可以使用in.readLine()方法得到客戶端的輸入,也可以使用out.println()方法向客戶端發送數據。從而可以根據程序的需要對客戶端的不同請求進行回應。在所有通訊結束以后應該關閉這兩個數據流,關閉的順序是先關閉輸出流,再關閉輸入流,即使用:
out.close(); in.close();4416.3.2基于連接的Socket通信程序設計(3)Socket通信模式客戶端程序編寫:①調用Socket()創建一個流套接字,并連接到服務器端;②調用Socket類的getOutputStream()和getInputStream獲取輸出流和輸入流,開始網絡數據的發送和接收。
③最后關閉通信套接字。45例16_3:服務器端Socket編程46例16_3:服務器端Socket編程監聽狀態4748例16_3:服務器端Socket編程49例16_3:服務器端Socket編程50例16_3:客戶端Socket編程51例16_3:客戶端Socket編程5253例16_3:客戶端Socket編程54例16_3:客戶端Socket編程55例16_3:客戶端Socket編程5616.3.3無連接的Socket通信程序設計
UDP協議是無連接的協議,它以數據報作為數據傳輸的載體。數據報是一個在網絡上發送的獨立信息,它的到達、到達時間以及內容本身等都不能得到保證。數據報的大小是受限制的,每個數據報的大小限定在64KB以內。由于UDP通信速度較快,所以常常被應用在某些無須實時交互、準確性要求不高、但傳輸速度要求較高的場合。UDP協議無需在發送方和接收方建立連接,數據報在網上可以以任何可能的路徑傳往目的地(分組交換)。J軟件包中的DatagramSocket類和DatagramPacket類為實現UDP通信提供了支持。DatagramSocket用于在程序中間建立傳送數據報的通信連接DatagramPacket則用來表示一個數據報。571.數據報方式的通信過程(1)創建數據報Socket;(2)構造用于接收或發送的數據報,并調用所創建Socket的receive()方法進行數據報接收或調用send()發送數據報。(3)通信結束,關閉Socket。16.3.3無連接的Socket通信程序設計582.DatagramSocket類DatagramSocket類的三個構造方法如下:(1)DatagramSocket():創建DatagramSocket對象并與本地主機某個可用端口相連。(2)DatagramSocket(intport):創建DatagramSocket對象并與指定端口相連。(3)DatagramSocket(intport,InetAddressiaddr):創建一個于本地地址綁定的DatagramSocket對象。16.3.3無連接的Socket通信程序設計5916.3.3無連接的Socket通信程序設計DatagramSocket類的常用方法如下:(1)voidreceive(DatagramPacketpacket)throwsIOExceptionreceive()方法將使程序中的線程一直處于阻塞狀態,直到從當前socket中接收到信息時,將收到的信息存儲在receive()方法的對象參數packet的存儲機構中。(2)voidsend(DatagramPacketpacket)throwsIOExceptionsend()方法將其參數DatagramPacket對象packet中包含的數據報文發送到所指定的IP地址主機的指定端口。6016.3.3無連接的Socket通信程序設計(3)voidsetSotimeout(inttimeout)throwsIOException當程序調用DatagramSocket的receive方法以讀取數據后,程序將處于阻塞狀態,知道setSoTimeout方法所設置時間超時為止。(4)voidclose()關閉數據報套接字,它不會拋出異常對象。61基于UDP的socket編程接收端(Server)發送端(Client)DatagramSocket(intport)DatagramSocket()DatagramPacket(byte[]buf,intlength)DatagramSocket.receive(DatagramPacketp)DatagramSocket.close()DatagramSocket.close()DatagramPacket(byte[
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廁所防臭除菌劑研發與供應合同
- 消息系統容錯性分析-洞察闡釋
- 高效節能型廠房線路改造施工質量保證合同
- 叉車維修保養年度服務合同范本
- 畫廊場地租賃與藝術品展覽協議(BF)
- 互聯網創業園區門面房租賃服務協議
- 滄州租賃房屋租賃合同糾紛處理協議
- 2024-2025年幼兒園信息化教學計劃
- 財務顧問團隊派遣服務合同范本
- 虛擬人身體語言生成的多分辨率建模方法-洞察闡釋
- 砌磚理論考試題及答案
- 人格性格測試題及答案
- 2025-2030年中國電子變壓器市場運行前景及投資價值研究報告
- 2024年廣東省廣州市越秀區中考二模數學試題(含答案)
- 2025屆各地名校4月上旬高三語文聯考作文題目及范文12篇匯編
- 【9語一模】2025年4月天津市和平區九年級中考一模語文試卷(含答案)
- 骨科科室工作總結匯報
- 青少年網絡安全知識講座
- 2025年高考物理大題突破+限時集訓(含解析)
- 三基中醫培訓試題及答案
- GB 28050-2025食品安全國家標準預包裝食品營養標簽通則
評論
0/150
提交評論