版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1第第16章章 Java網(wǎng)絡編程網(wǎng)絡編程2本章主要內(nèi)容n16.1 網(wǎng)絡基礎(chǔ)網(wǎng)絡基礎(chǔ)n16.2 URL編程編程n16.3 用用Java語言實現(xiàn)底層網(wǎng)絡通信語言實現(xiàn)底層網(wǎng)絡通信316.1 網(wǎng)絡基礎(chǔ)網(wǎng)絡基礎(chǔ)n16.1.1 TCP/IP協(xié)議協(xié)議n16.1.2 通信端口通信端口n16.1.3 URL概念概念n16.1.4 Java語言的網(wǎng)絡編程語言的網(wǎng)絡編程416.1.1 TCP/IP協(xié)議協(xié)議nInternet的主要協(xié)議有:網(wǎng)絡層的的主要協(xié)議有:網(wǎng)絡層的IP協(xié)議;傳輸層協(xié)議;傳輸層的的TCP和和UDP協(xié)議;應用層的協(xié)議;應用層的FTP、HTTP、SMTP等協(xié)議。等協(xié)議。nTCP/IP網(wǎng)絡參考模型包括四個
2、層次:網(wǎng)絡參考模型包括四個層次:應用層、傳應用層、傳輸層、網(wǎng)絡層、鏈路層輸層、網(wǎng)絡層、鏈路層。每一層負責不同的功能,。每一層負責不同的功能,516.1.1 TCP/IP協(xié)議協(xié)議1鏈路層鏈路層鏈路層也稱為數(shù)據(jù)鏈路層或網(wǎng)絡接口層。鏈路層也稱為數(shù)據(jù)鏈路層或網(wǎng)絡接口層。通常包括操作系通常包括操作系統(tǒng)中的設(shè)備驅(qū)動程序和計算機中對應的網(wǎng)絡接口卡。它們統(tǒng)中的設(shè)備驅(qū)動程序和計算機中對應的網(wǎng)絡接口卡。它們一起處理與電纜(或其它任何傳輸媒介)有關(guān)的一起處理與電纜(或其它任何傳輸媒介)有關(guān)的物理接口物理接口細節(jié)細節(jié)。2網(wǎng)絡層網(wǎng)絡層網(wǎng)絡層對網(wǎng)絡層對TCP/IP網(wǎng)絡中的硬件資源進行標識。網(wǎng)絡中的硬件資源進行標識。主要完
3、成主要完成IP地址的管理。地址的管理。616.1.1 TCP/IP協(xié)議協(xié)議3傳輸層傳輸層在在TCP/IP網(wǎng)絡中最常用的傳輸協(xié)議是傳輸控制協(xié)網(wǎng)絡中最常用的傳輸協(xié)議是傳輸控制協(xié)TCP和用和用戶數(shù)據(jù)報協(xié)議戶數(shù)據(jù)報協(xié)議UDP(User Datagram Protocol)。主要用來完。主要用來完成數(shù)據(jù)的傳輸。成數(shù)據(jù)的傳輸。TCP協(xié)議是通過在端點與端點之間建立持續(xù)的連接而進行協(xié)議是通過在端點與端點之間建立持續(xù)的連接而進行通信的。是一種有序傳輸。通信的。是一種有序傳輸。UDP協(xié)議是一種無連接的傳輸協(xié)議。但效率比較高。協(xié)議是一種無連接的傳輸協(xié)議。但效率比較高。4應用層應用層大多數(shù)基于大多數(shù)基于Interne
4、t的應用程序都被看做的應用程序都被看做TCP/IP網(wǎng)絡的最上網(wǎng)絡的最上層協(xié)議層協(xié)議應用層協(xié)議。例如:應用層協(xié)議。例如:FTP、HTTP、SMTP、POP3、Telnet等協(xié)議。等協(xié)議。716.1.2 通信端口通信端口nInternet上傳輸?shù)臄?shù)據(jù)都帶有標識目的主機與端口號的地址上傳輸?shù)臄?shù)據(jù)都帶有標識目的主機與端口號的地址信息,主機的地址由信息,主機的地址由32位的位的IP地址標識,地址標識,IP協(xié)議通過該地協(xié)議通過該地址把數(shù)據(jù)發(fā)送到正確的目的主機;端口號由一個址把數(shù)據(jù)發(fā)送到正確的目的主機;端口號由一個16位的數(shù)位的數(shù)字標識,字標識,TCP與與UDP協(xié)議根據(jù)端口號把數(shù)據(jù)傳送給正確的協(xié)議根據(jù)端口號
5、把數(shù)據(jù)傳送給正確的應用程序。應用程序。n端口號的范圍是端口號的范圍是065535,其中,其中11023之間的端口號是為之間的端口號是為HTTP、FTP等系統(tǒng)應用保留等系統(tǒng)應用保留的,的,F(xiàn)TP協(xié)議的端口號是協(xié)議的端口號是21,HTTP協(xié)議的端口號是協(xié)議的端口號是80,Telnet協(xié)議的端口號是協(xié)議的端口號是23,用戶,用戶應用程序只能使用應用程序只能使用1024以上的端口號,其中以上的端口號,其中10244999可任可任意被用戶用作客戶端套接字端口,意被用戶用作客戶端套接字端口,500065535可任意被用可任意被用戶用作服務端套接字端口。戶用作服務端套接字端口。816.1.2 通信端口通信端
6、口916.1.3 URL概念概念nURL是統(tǒng)一資源定位器是統(tǒng)一資源定位器(Uniform Resource Locator)的英文縮寫,它表示的英文縮寫,它表示Internet上某一資源的上某一資源的地址。地址。Internet上的資源包括上的資源包括HTML文件、圖像文文件、圖像文件、聲音文件、動畫文件以及其他任何內(nèi)容件、聲音文件、動畫文件以及其他任何內(nèi)容(并不并不完全是文件,也可以是對數(shù)據(jù)庫的一個查詢等完全是文件,也可以是對數(shù)據(jù)庫的一個查詢等)。1016.1.3 URL概念概念nURL的基本結(jié)構(gòu)由的基本結(jié)構(gòu)由5部分組成,其格式如下:部分組成,其格式如下:n傳輸協(xié)議傳輸協(xié)議:/主機名主機名:
7、端口號端口號/文件名文件名#引用引用1.傳輸協(xié)議傳輸協(xié)議(protocol):傳輸協(xié)議是指所使用的協(xié)議名,如:傳輸協(xié)議是指所使用的協(xié)議名,如HTTP、FTP等。等。2.主機名主機名(hostname):主機名是指資源所在的計算機??梢裕褐鳈C名是指資源所在的計算機??梢允鞘荌P地址,也可以是計算機的名稱或域名。地址,也可以是計算機的名稱或域名。3.端口號端口號(portnumber):一個計算機中可能有多種服務,如:一個計算機中可能有多種服務,如Web服務、服務、FTP服務或自己建立的服務等。為了區(qū)分這些服服務或自己建立的服務等。為了區(qū)分這些服務,就需要使用端口號,每一種服務用一個端口號。務,就
8、需要使用端口號,每一種服務用一個端口號。1116.1.3 URL概念概念4.文件名文件名(filename):文件名包括該文件的完整路徑。在:文件名包括該文件的完整路徑。在HTTP協(xié)議中,有一個默認的文件名是協(xié)議中,有一個默認的文件名是index.html,因此,因此,下列兩個地址是等價的。下列兩個地址是等價的。http:/http:/ 5.引用引用(reference):引用就是資源內(nèi)部的某個參考點。如:引用就是資源內(nèi)部的某個參考點。如http:/ Java語言的網(wǎng)絡編程語言的網(wǎng)絡編程nJava語言的網(wǎng)絡編程分為三個層次。語言的網(wǎng)絡編程分為三個層次。n最高一級的網(wǎng)絡通信就是我們前面章節(jié)中所講
9、的從網(wǎng)絡上最高一級的網(wǎng)絡通信就是我們前面章節(jié)中所講的從網(wǎng)絡上下載小程序。下載小程序。n次一級的通信,就是前面介紹的通過類次一級的通信,就是前面介紹的通過類URL對象指明文件對象指明文件所在位置,并從網(wǎng)絡上下載聲音和圖像文件,然后對聲音所在位置,并從網(wǎng)絡上下載聲音和圖像文件,然后對聲音播放和圖像顯示。播放和圖像顯示。1.最低一級的通信是利用最低一級的通信是利用包中提供的類直接在程序包中提供的類直接在程序中實現(xiàn)網(wǎng)絡通信。中實現(xiàn)網(wǎng)絡通信。1316.1.4 Java語言的網(wǎng)絡編程語言的網(wǎng)絡編程借助HTML從網(wǎng)上下載applet在程序中通過URL訪問網(wǎng)上資源通過包中的類直接在程序中實現(xiàn)網(wǎng)絡通訊1416.
10、1.4 Java語言的網(wǎng)絡編程語言的網(wǎng)絡編程n針對不同層次的網(wǎng)絡通信,針對不同層次的網(wǎng)絡通信,Java語言提供的網(wǎng)絡功能有四語言提供的網(wǎng)絡功能有四大類:大類: URL、InetAddress、Socket、Datagram。nInetAddress面向的是面向的是IP層層,用于標識網(wǎng)絡上的硬件資源。,用于標識網(wǎng)絡上的硬件資源。n URL面向的面向的應用層應用層,通過,通過URL,Java程序可以直接送出程序可以直接送出或讀入網(wǎng)絡上的數(shù)據(jù)。或讀入網(wǎng)絡上的數(shù)據(jù)。nSockets和和Datagram面向的則是面向的則是傳輸層傳輸層。Sockets使用的是使用的是TCP協(xié)議協(xié)議,這是傳統(tǒng)網(wǎng)絡程序最常用
11、的方式,可以想象為,這是傳統(tǒng)網(wǎng)絡程序最常用的方式,可以想象為兩個不同的程序通過網(wǎng)絡的通信信道進行通信。兩個不同的程序通過網(wǎng)絡的通信信道進行通信。Datagram則使用則使用UDP協(xié)議協(xié)議,是另一種網(wǎng)絡傳輸方式,它,是另一種網(wǎng)絡傳輸方式,它把數(shù)據(jù)的目的地把數(shù)據(jù)的目的地記錄在數(shù)據(jù)包中,然后直接放在網(wǎng)絡上。記錄在數(shù)據(jù)包中,然后直接放在網(wǎng)絡上。1516.1.4 Java語言的網(wǎng)絡編程語言的網(wǎng)絡編程包中的主要的類包中的主要的類n面向面向IP層的類:層的類:InetAddressn面向應用層的類:面向應用層的類:URL、URLConnectionn面向傳輸層的類:面向傳輸層的類:nTCP協(xié)議相關(guān)類協(xié)議相關(guān)
12、類:Socket、ServerSocketnUDP協(xié)議相關(guān)類協(xié)議相關(guān)類:DatagramPacket、DatagramSocket、MulticastSocketn可能產(chǎn)生的異常:可能產(chǎn)生的異常:nBindException、ConnectException、MalformedURLException、NoRouteToHostException、ProtocolException、SocketException、UnknownHostException、UnknownServiceException1616.2 URL編程編程n在在Java中,中,包里面的類是進行網(wǎng)絡編程的,包里面的類是進行
13、網(wǎng)絡編程的,其中其中.URL類和類和.URLConnection類類使編程者能很方便的利用使編程者能很方便的利用URL在在Internet上進行網(wǎng)上進行網(wǎng)絡通信。絡通信。1716.2.1 創(chuàng)建創(chuàng)建URL對象對象n類類URL提供了很多構(gòu)造方法來生成一個提供了很多構(gòu)造方法來生成一個URL對象:對象:npublic URL(String spec) npublic URL(URL context, String spec)npublic URL(String protocol, String host, String file)npublic URL(String protocol, String
14、host, int port, String file)n以下是一些具體的構(gòu)造實例:以下是一些具體的構(gòu)造實例:nURL url1 = new URL(“http:/”);nURL base = new URL(“http:/”);nURL url2 = new URL(base, “/mywork1.html”);nURL url4 = new URL(“http”, “”,“/lyw/test.html”);nURL url5 = new URL(“http”, “”, 8080, “/java/network.html”);1816.2.1 創(chuàng)建創(chuàng)建URL對象對象n一個一個URL對象生成后
15、,其屬性是不能被改變的,但可以通過對象生成后,其屬性是不能被改變的,但可以通過它給定的方法來獲取這些屬性:它給定的方法來獲取這些屬性:ngetDefaultport():返回缺省的端口號。返回缺省的端口號。ngetFile():獲得獲得URL指定資源的完整文件名指定資源的完整文件名ngetHost():返回主機名。返回主機名。ngetPath():返回指定資源文件目錄和文件名返回指定資源文件目錄和文件名ngetPort():返回端口號,默認返回端口號,默認-1ngetProtocol():返回表示返回表示URL中協(xié)議的字符串對象。中協(xié)議的字符串對象。ngetRef(): 返回返回URL中的中的
16、HTML文檔標記,即文檔標記,即#號標記。號標記。ngetUserInfo():返回用戶信息。返回用戶信息。ntoExternalForm():返回完整的返回完整的URL字符串。字符串。ntoString():返回完整返回完整URL字符串。字符串。1916.2.1 創(chuàng)建創(chuàng)建URL對象對象n在構(gòu)造在構(gòu)造URL對象而使用其構(gòu)造方法時會拋出對象而使用其構(gòu)造方法時會拋出MalformedURLException非運行時異常,因此生成非運行時異常,因此生成URL對象對象時,必須對這一異常進行處理。例如:時,必須對這一異常進行處理。例如:tryURL myURL=new URL(“http:/ catch
17、 (MalformedURLException e)e.printStackTrace();2016.2.2 使用使用URL類訪問資源類訪問資源n【例例16.1】通過通過URL直接讀取網(wǎng)上服務器中的文件內(nèi)容。本直接讀取網(wǎng)上服務器中的文件內(nèi)容。本例是利用例是利用URL訪問訪問http:/ 用用Java語言實現(xiàn)底層網(wǎng)絡通信語言實現(xiàn)底層網(wǎng)絡通信n用用Java語言實現(xiàn)計算機網(wǎng)絡的底層通信,就是用語言實現(xiàn)計算機網(wǎng)絡的底層通信,就是用Java程序?qū)崿F(xiàn)網(wǎng)絡通信協(xié)議所規(guī)定的功能的操作,程序?qū)崿F(xiàn)網(wǎng)絡通信協(xié)議所規(guī)定的功能的操作,這是這是Java語言網(wǎng)絡編程的一部分。語言網(wǎng)絡編程的一部分。2416.3.1 Inet
18、Address程序設(shè)計程序設(shè)計n類類InetAddress可以用于標識網(wǎng)絡上的硬件資源,它提供了一可以用于標識網(wǎng)絡上的硬件資源,它提供了一系列方法以描述、獲取及使用網(wǎng)絡資源。系列方法以描述、獲取及使用網(wǎng)絡資源。nInetAddress類沒有構(gòu)造函數(shù),因此不能用類沒有構(gòu)造函數(shù),因此不能用new來構(gòu)造一個來構(gòu)造一個InetAddress實例。通常是用它提供的靜態(tài)方法來獲?。簩嵗?。通常是用它提供的靜態(tài)方法來獲?。簆ublic static InetAddress getByName(String host) :host可可以是一個機器名,也可以是一個形如以是一個機器名,也可以是一個形如“%d.%d.
19、%d.%d”的的IP地址或一個地址或一個DSN域名。域名。public static InetAddress getLocalHost() public static InetAddress getAllByName(String host)n這三個方法通常會產(chǎn)生這三個方法通常會產(chǎn)生UnknownHostException例外,應在例外,應在程序中捕獲處理。程序中捕獲處理。2516.3.1 InetAddress程序設(shè)計程序設(shè)計以下是以下是InetAddress類的幾個主要方法:類的幾個主要方法:npublic byte getAddress():獲得本對象的獲得本對象的IP地址(存放在字地址
20、(存放在字節(jié)數(shù)組中)。節(jié)數(shù)組中)。npublic String getHostAddress():獲得本對象的獲得本對象的IP地址地址“%d.%d.%d.%d”。npublic String getHostName():獲得本對象的機器名。獲得本對象的機器名。n獲得本地主機的獲得本地主機的IP地址:地址:nInetAddress addr=InetAddress.getLocalHost();26App16_2.java編寫一個編寫一個Java應用程序,直接查詢自己主機的應用程序,直接查詢自己主機的IP地址和地址和Internet上上WWW服務器的服務器的IP地址。地址。 27App16_2.
21、java2816.3.2 基于連接的基于連接的Socket通信程序設(shè)計通信程序設(shè)計nSocket通信屬于網(wǎng)絡底層通信,它通信屬于網(wǎng)絡底層通信,它是網(wǎng)絡上運行的兩個程序是網(wǎng)絡上運行的兩個程序間雙向通信的一端間雙向通信的一端,它既可以接受請求,也可以發(fā)送請求,它既可以接受請求,也可以發(fā)送請求,利用它可以較方便地進行網(wǎng)絡上的數(shù)據(jù)傳輸。利用它可以較方便地進行網(wǎng)絡上的數(shù)據(jù)傳輸。nSocket是實現(xiàn)客戶與服務器是實現(xiàn)客戶與服務器(Client/Server)模式的通信方式,模式的通信方式,它首先需要建立穩(wěn)定的連接,然后以流的方式傳輸數(shù)據(jù),實它首先需要建立穩(wěn)定的連接,然后以流的方式傳輸數(shù)據(jù),實現(xiàn)網(wǎng)絡通信?,F(xiàn)
22、網(wǎng)絡通信。Socket原意為原意為“插座插座”,在通信領(lǐng)域中譯為,在通信領(lǐng)域中譯為“套接字套接字”,意思是將兩個物品套在一起,在網(wǎng)絡通信里的,意思是將兩個物品套在一起,在網(wǎng)絡通信里的含義就是建立一個連接。含義就是建立一個連接。2916.3.2 基于連接的基于連接的Socket通信程序設(shè)計通信程序設(shè)計1.Socket通信機制的基本概念通信機制的基本概念(1)建立連接)建立連接n當兩臺計算機進行通信時,首先要在兩者之間建立一個連接,當兩臺計算機進行通信時,首先要在兩者之間建立一個連接,也就是兩者分別運行不同的程序,由一端發(fā)出連接請求,另也就是兩者分別運行不同的程序,由一端發(fā)出連接請求,另一端等候連
23、接請求。一端等候連接請求。n當?shù)群蚨耸盏秸埱蟛⒔邮苷埱蠛?,兩個程序就建立起一個連當?shù)群蚨耸盏秸埱蟛⒔邮苷埱蠛?,兩個程序就建立起一個連接,之后通過這個連接可以進行數(shù)據(jù)交換。此時,請求方稱接,之后通過這個連接可以進行數(shù)據(jù)交換。此時,請求方稱為為客戶端客戶端,接收方稱為,接收方稱為服務器端服務器端。n應用在這兩端的應用在這兩端的TCP Socket分別稱為分別稱為服務器服務器Socket和和客戶客戶Socket。n基本原理類似于電話系統(tǒng)?;驹眍愃朴陔娫捪到y(tǒng)。3016.3.2 基于連接的基于連接的Socket通信程序設(shè)計通信程序設(shè)計(2)連接地址)連接地址n為了建立連接,需要有一個程序向另一臺計算
24、機上的程序發(fā)為了建立連接,需要有一個程序向另一臺計算機上的程序發(fā)出請求,其中,能夠唯一識別對方機器的,就是計算機的名出請求,其中,能夠唯一識別對方機器的,就是計算機的名稱或稱或IP地址地址,稱為,稱為連接地址連接地址,類似于電話系統(tǒng)中的電話號碼。,類似于電話系統(tǒng)中的電話號碼。n計算機上的每個程序有一個唯一的端口號,通過端口號指定計算機上的每個程序有一個唯一的端口號,通過端口號指定要連接的程序。所以一個完整的連接應該是要連接的程序。所以一個完整的連接應該是IP+端口端口。n兩個程序進行連接之前要約定好端口號。有服務器端分配端兩個程序進行連接之前要約定好端口號。有服務器端分配端口號并等候請求,客戶
25、端利用這個端口號發(fā)出連接請求,當口號并等候請求,客戶端利用這個端口號發(fā)出連接請求,當兩個程序所設(shè)定的端口號一致時連接成功。兩個程序所設(shè)定的端口號一致時連接成功。3116.3.2 基于連接的基于連接的Socket通信程序設(shè)計通信程序設(shè)計(3)TCP/IP Socket通信通信nSocket在在TCP/IP協(xié)議中定義,針對一個特定的連接,每臺機協(xié)議中定義,針對一個特定的連接,每臺機器上都有一個器上都有一個“套接字套接字”,可以想象在它們之間有一條虛擬,可以想象在它們之間有一條虛擬的的“線纜線纜”,線纜的每一端都插入一個,線纜的每一端都插入一個“套接字套接字”或或“插座插座”里。里。n在在Java語
26、言中,服務器端套接字使用語言中,服務器端套接字使用ServerSocket類,客戶類,客戶端套接字使用端套接字使用Socket類。類。3216.3.2 基于連接的基于連接的Socket通信程序設(shè)計通信程序設(shè)計SOCKET連接過程連接過程n根據(jù)連接啟動的方式以及本地套接字要連接的目標,套接字根據(jù)連接啟動的方式以及本地套接字要連接的目標,套接字之間的連接過程可以分為三個步驟:之間的連接過程可以分為三個步驟:服務器監(jiān)聽,客戶端請服務器監(jiān)聽,客戶端請求,連接確認求,連接確認。n服務器監(jiān)聽服務器監(jiān)聽:服務器端套接字并不定位具體的客戶端套接字,:服務器端套接字并不定位具體的客戶端套接字,而是處于而是處于等
27、待連接的狀態(tài)等待連接的狀態(tài),實時監(jiān)控網(wǎng)絡狀態(tài)。,實時監(jiān)控網(wǎng)絡狀態(tài)。n客戶端請求客戶端請求:是指由客戶端的套接字提出連接請求,要連接:是指由客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。為此,客戶端的套接字必須首的目標是服務器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,先描述它要連接的服務器的套接字,指出服務器端套接字的指出服務器端套接字的地址和端口號地址和端口號,然后就向服務器端套接字,然后就向服務器端套接字提出連接請求提出連接請求。n連接確認連接確認:是指當服務器端套接字監(jiān)聽到或者說接收到客戶:是指當服務器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請
28、求,它就響應客戶端套接字的請求,建立端套接字的連接請求,它就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發(fā)給客戶端,一旦一個新的線程,把服務器端套接字的描述發(fā)給客戶端,一旦客戶端確認了此描述,連接就建立好了。而服務器端套接字客戶端確認了此描述,連接就建立好了。而服務器端套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請求。繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請求。3316.3.2 基于連接的基于連接的Socket通信程序設(shè)計通信程序設(shè)計3416.3.2 基于連接的基于連接的Socket通信程序設(shè)計通信程序設(shè)計2.客戶端客戶端Socket類與服務器端類與服務
29、器端ServerSocket類類n在在Java中,通信端點由中,通信端點由.Socket類(客戶端)或類(客戶端)或.ServerSocket類(服務器端)表示。位于兩臺不同機類(服務器端)表示。位于兩臺不同機器上的應用軟件通過網(wǎng)絡連接發(fā)送和接收字節(jié)流,從而實現(xiàn)器上的應用軟件通過網(wǎng)絡連接發(fā)送和接收字節(jié)流,從而實現(xiàn)通信。其中,通信。其中,Socket類代表的是客戶端,它是一個連接遠程類代表的是客戶端,它是一個連接遠程服務器應用時臨時創(chuàng)建的端點。服務器應用時臨時創(chuàng)建的端點。nServerSocker類類代表的是服務器端,它啟動后等待來自客戶代表的是服務器端,它啟動后等待來自客戶端的連接請求;一旦接
30、收到請求,端的連接請求;一旦接收到請求,ServerSocket創(chuàng)建一個創(chuàng)建一個Socket實例來處理與該客戶端的通信。對于服務器應用,我實例來處理與該客戶端的通信。對于服務器應用,我們不知道客戶端應用什么時候會試圖連接服務器,服務器必們不知道客戶端應用什么時候會試圖連接服務器,服務器必須一直處于等待連接的狀態(tài)。須一直處于等待連接的狀態(tài)。nsocket類類n當客戶程序需要與服務器程序通訊的時候,客戶程序在客戶當客戶程序需要與服務器程序通訊的時候,客戶程序在客戶機創(chuàng)建一個機創(chuàng)建一個socket對象。對象。3516.3.2 基于連接的基于連接的Socket通信程序設(shè)計通信程序設(shè)計socket類構(gòu)造
31、方法類構(gòu)造方法npublic Socket(String host, int port) 創(chuàng)建一個流套接字并將其連接到指定主機上的指定端口號。創(chuàng)建一個流套接字并將其連接到指定主機上的指定端口號。 npublic Socket(InetAddress address, int port) 創(chuàng)建一個流套接字并將其連接到指定創(chuàng)建一個流套接字并將其連接到指定 IP 地址的指定端口號地址的指定端口號 npublic Socket(String host, int port, InetAddress localAddr, int localPort)創(chuàng)建一個套接字并將其連接到指定遠程地址上的指定遠程端口創(chuàng)
32、建一個套接字并將其連接到指定遠程地址上的指定遠程端口npublic Socket(InetAddress address, int port, InetAddress localAddr,int localPort)創(chuàng)建一個套接字并將其連接到指定遠程地址上的指定遠程端口創(chuàng)建一個套接字并將其連接到指定遠程地址上的指定遠程端口這些方法都將拋出例外這些方法都將拋出例外IOException,程序中需要捕獲處理。,程序中需要捕獲處理。兩兩個構(gòu)造函數(shù)都創(chuàng)建了一個基于個構(gòu)造函數(shù)都創(chuàng)建了一個基于Socket的連接服務器端流套接字的連接服務器端流套接字的的流套接字流套接字。3616.3.2 基于連接的基于連接
33、的Socket通信程序設(shè)計通信程序設(shè)計Socket 類常用方法類常用方法n Socket的輸入的輸入/輸出流管理輸出流管理public InputStream getInputStream()public OutputStream getOutputStream() n這些方法都將拋出例外這些方法都將拋出例外IOException,程序中需要捕獲處理。,程序中需要捕獲處理。n 關(guān)閉關(guān)閉Socketpublic void close() throws IOException3716.3.2 基于連接的基于連接的Socket通信程序設(shè)計通信程序設(shè)計Socket 類常用方法類常用方法n設(shè)置設(shè)置/獲取
34、獲取Socket數(shù)據(jù)數(shù)據(jù)public InetAddress getInetAddress():獲取創(chuàng)建獲取創(chuàng)建Socket對象時指對象時指定的計算機定的計算機IP地址。地址。public InetAddress getLocalAddress():獲取創(chuàng)建獲取創(chuàng)建Socket對象時對象時客戶計算機的客戶計算機的IP地址。地址。public int getPort() :獲取創(chuàng)建獲取創(chuàng)建Socket對象時遠程主機的端口號對象時遠程主機的端口號public int getLocalPort()public void setSoTimeout(int timeout):設(shè)定客戶端接口所需等:設(shè)定客
35、戶端接口所需等到的時間限度到的時間限度n 這些方法都將拋出例外這些方法都將拋出例外SocketException。3816.3.2 基于連接的基于連接的Socket通信程序設(shè)計通信程序設(shè)計(2)ServerSocket類類nServerSocket類的作用是實現(xiàn)客戶機類的作用是實現(xiàn)客戶機/服務器模式的通信方式服務器模式的通信方式下服務器端的套接字。下服務器端的套接字。n構(gòu)造方法:構(gòu)造方法:npublic ServerSocket(int port)npublic ServerSocket(int port, int backlog):支持指定數(shù)目的:支持指定數(shù)目的連接連接npublic Ser
36、verSocket(int port, int backlog, InetAddress bindAddr)n這些方法都將拋出例外這些方法都將拋出例外IOException,程序中需要捕獲處理。,程序中需要捕獲處理。3916.3.2 基于連接的基于連接的Socket通信程序設(shè)計通信程序設(shè)計(2)ServerSocket類類n主要方法主要方法npublic Socket accept() :在服務器端的指定端口監(jiān)聽客戶端在服務器端的指定端口監(jiān)聽客戶端發(fā)來的連接請求,并與之連接。發(fā)來的連接請求,并與之連接。npublic void close() :關(guān)閉:關(guān)閉Socketnpublic InetA
37、ddress getInetAddress() :返回服務器返回服務器的的IP地址地址npublic int getLocalPort() :取得取得服務器的端口號服務器的端口號4016.3.2 基于連接的基于連接的Socket通信程序設(shè)計通信程序設(shè)計(3)Socket通信模式通信模式n根據(jù)連接啟動的方式以及本地套接字要連接的目標,套接字根據(jù)連接啟動的方式以及本地套接字要連接的目標,套接字之間的連接過程可以分為三個步驟:之間的連接過程可以分為三個步驟:服務器監(jiān)聽,客戶端請服務器監(jiān)聽,客戶端請求,連接確認求,連接確認。n服務器監(jiān)聽服務器監(jiān)聽:服務器端套接字并不定位具體的客戶端套接字,:服務器端套
38、接字并不定位具體的客戶端套接字,而是處于而是處于等待連接的狀態(tài)等待連接的狀態(tài),實時監(jiān)控網(wǎng)絡狀態(tài)。,實時監(jiān)控網(wǎng)絡狀態(tài)。n客戶端請求客戶端請求:是指由客戶端的套接字提出連接請求,要連接:是指由客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。為此,客戶端的套接字必須首的目標是服務器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,先描述它要連接的服務器的套接字,指出服務器端套接字的指出服務器端套接字的地址和端口號地址和端口號,然后就向服務器端套接字,然后就向服務器端套接字提出連接請求提出連接請求。n連接確認連接確認:是指當服務器端套接字監(jiān)聽到或者說接收到客戶:是指當服
39、務器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求,它就響應客戶端套接字的請求,建立端套接字的連接請求,它就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發(fā)給客戶端,一旦一個新的線程,把服務器端套接字的描述發(fā)給客戶端,一旦客戶端確認了此描述,連接就建立好了。而服務器端套接字客戶端確認了此描述,連接就建立好了。而服務器端套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請求。繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請求。4116.3.2 基于連接的基于連接的Socket通信程序設(shè)計通信程序設(shè)計4216.3.2 基于連接的基于連接的Socket通信程序設(shè)計通信程序設(shè)
40、計(3)Socket通信模式通信模式n無論一個無論一個Socket通信程序的功能多么齊全、程序多么復雜,通信程序的功能多么齊全、程序多么復雜,其基本結(jié)構(gòu)都是一樣的。主要分為服務器端編程和客戶端其基本結(jié)構(gòu)都是一樣的。主要分為服務器端編程和客戶端編程。編程。n服務器程序編寫:服務器程序編寫:調(diào)用調(diào)用ServerSocket(int port)創(chuàng)建一個服務器端套接字,并綁創(chuàng)建一個服務器端套接字,并綁定到指定端口上;定到指定端口上;調(diào)用調(diào)用accept(),監(jiān)聽連接請求,監(jiān)聽連接請求,如果客戶端請求連接,則接,如果客戶端請求連接,則接受連接,返回通信套接字。受連接,返回通信套接字。調(diào)用調(diào)用Socket
41、類的類的getOutputStream()和和getInputStream獲取輸獲取輸出流和輸入流,開始網(wǎng)絡數(shù)據(jù)的發(fā)送和接收。出流和輸入流,開始網(wǎng)絡數(shù)據(jù)的發(fā)送和接收。最后關(guān)閉通信套接字。最后關(guān)閉通信套接字。4316.3.2 基于連接的基于連接的Socket通信程序設(shè)計通信程序設(shè)計ServerSocket server = new ServerSocket(9998) n這條語句創(chuàng)建了一個服務器對象,這個服務器使用這條語句創(chuàng)建了一個服務器對象,這個服務器使用9998號端號端口。當一個客戶端程序建立一個口。當一個客戶端程序建立一個Socket連接,所連接的端口連接,所連接的端口號為號為9998時,
42、服務器對象時,服務器對象server便響應這個連接,并且便響應這個連接,并且server.accept()方法會創(chuàng)建一個方法會創(chuàng)建一個Socket對象。服務器端便可以對象。服務器端便可以利用這個利用這個Socket對象與客戶進行通訊。對象與客戶進行通訊。Socket incoming = server.accept()n進而得到輸入流和輸出流,并進行封裝進而得到輸入流和輸出流,并進行封裝BufferedReader in = new BufferedReader(new InputStreamReader(incoming.getInputStream(); PrintWriter out =
43、 new PrintWriter(incoming.getOutputStream(),true);4416.3.2 基于連接的基于連接的Socket通信程序設(shè)計通信程序設(shè)計n隨后,就可以使用隨后,就可以使用in.readLine()方法得到客戶端的輸入,也方法得到客戶端的輸入,也可以使用可以使用out.println()方法向客戶端發(fā)送數(shù)據(jù)。從而可以根據(jù)方法向客戶端發(fā)送數(shù)據(jù)。從而可以根據(jù)程序的需要對客戶端的不同請求進行回應。程序的需要對客戶端的不同請求進行回應。n在所有通訊結(jié)束以后應該關(guān)閉這兩個數(shù)據(jù)流,關(guān)閉的順序是在所有通訊結(jié)束以后應該關(guān)閉這兩個數(shù)據(jù)流,關(guān)閉的順序是先關(guān)閉輸出流,再關(guān)閉輸入流
44、,即使用:先關(guān)閉輸出流,再關(guān)閉輸入流,即使用:out.close(); in.close();4516.3.2 基于連接的基于連接的Socket通信程序設(shè)計通信程序設(shè)計(3)Socket通信模式通信模式n客戶端程序編寫:客戶端程序編寫:調(diào)用調(diào)用Socket()創(chuàng)建一個流套接字,并連接到服務器端;創(chuàng)建一個流套接字,并連接到服務器端;調(diào)用調(diào)用Socket類的類的getOutputStream()和和getInputStream獲取輸獲取輸出流和輸入流,開始網(wǎng)絡數(shù)據(jù)的發(fā)送和接收。出流和輸入流,開始網(wǎng)絡數(shù)據(jù)的發(fā)送和接收。 最后關(guān)閉通信套接字。最后關(guān)閉通信套接字。46例例16_3:服務器端:服務器端So
45、cket編程編程47例例16_3:服務器端:服務器端Socket編程編程監(jiān)聽狀態(tài)監(jiān)聽狀態(tài)4849例例16_3:服務器端:服務器端Socket編程編程50例例16_3:服務器端:服務器端Socket編程編程51例例16_3:客戶端:客戶端Socket編程編程52例例16_3:客戶端:客戶端Socket編程編程5354例例16_3:客戶端:客戶端Socket編程編程55例例16_3:客戶端:客戶端Socket編程編程56例例16_3:客戶端:客戶端Socket編程編程5716.3.3 無連接的無連接的Socket通信程序設(shè)計通信程序設(shè)計n UDP協(xié)議是無連接的協(xié)議,它以數(shù)據(jù)報作為數(shù)據(jù)傳輸?shù)妮d體。協(xié)
46、議是無連接的協(xié)議,它以數(shù)據(jù)報作為數(shù)據(jù)傳輸?shù)妮d體。數(shù)據(jù)報是一個在網(wǎng)絡上發(fā)送的獨立信息,它的到達、到達時數(shù)據(jù)報是一個在網(wǎng)絡上發(fā)送的獨立信息,它的到達、到達時間以及內(nèi)容本身等都不能得到保證。數(shù)據(jù)報的大小是受限制間以及內(nèi)容本身等都不能得到保證。數(shù)據(jù)報的大小是受限制的,每個數(shù)據(jù)報的大小限定在的,每個數(shù)據(jù)報的大小限定在64KB以內(nèi)。以內(nèi)。n由于由于UDP通信速度較快,所以常常被應用在某些無須實時交通信速度較快,所以常常被應用在某些無須實時交互、準確性要求不高、但傳輸速度要求較高的場合?;?、準確性要求不高、但傳輸速度要求較高的場合。nUDP協(xié)議無需在發(fā)送方和接收方建立連接,數(shù)據(jù)報在網(wǎng)上可協(xié)議無需在發(fā)送方和接
47、收方建立連接,數(shù)據(jù)報在網(wǎng)上可以以任何可能的路徑傳往目的地以以任何可能的路徑傳往目的地(分組交換分組交換)。nJ軟件包中的軟件包中的DatagramSocket類和類和DatagramPacket類為實現(xiàn)類為實現(xiàn)UDP通信提供了支持。通信提供了支持。nDatagramSocket用于在程序中間建立傳送數(shù)據(jù)報的通信連用于在程序中間建立傳送數(shù)據(jù)報的通信連接接nDatagramPacket則用來表示一個數(shù)據(jù)報。則用來表示一個數(shù)據(jù)報。58n1數(shù)據(jù)報方式的通信過程數(shù)據(jù)報方式的通信過程n(1) 創(chuàng)建數(shù)據(jù)報創(chuàng)建數(shù)據(jù)報Socket;n(2) 構(gòu)造用于接收或發(fā)送的數(shù)據(jù)報,并調(diào)用所創(chuàng)建構(gòu)造用于接收或發(fā)送的數(shù)據(jù)報,并
48、調(diào)用所創(chuàng)建Socket的的receive()方法進行數(shù)據(jù)報接收或調(diào)用方法進行數(shù)據(jù)報接收或調(diào)用send()發(fā)送數(shù)據(jù)報。發(fā)送數(shù)據(jù)報。n(3)通信結(jié)束,關(guān)閉通信結(jié)束,關(guān)閉Socket。16.3.3 無連接的無連接的Socket通信程序設(shè)計通信程序設(shè)計59n2DatagramSocket類類nDatagramSocket類的三個構(gòu)造方法如下:類的三個構(gòu)造方法如下:n(1) DatagramSocket():創(chuàng)建:創(chuàng)建DatagramSocket對象并對象并與本地主機某個可用端口相連。與本地主機某個可用端口相連。n(2) DatagramSocket(int port):創(chuàng)建:創(chuàng)建DatagramSoc
49、ket對象并與指定端口相連。對象并與指定端口相連。n(3) DatagramSocket(int port,InetAddress iaddr):創(chuàng):創(chuàng)建一個于本地地址綁定的建一個于本地地址綁定的DatagramSocket對象。對象。16.3.3 無連接的無連接的Socket通信程序設(shè)計通信程序設(shè)計6016.3.3 無連接的無連接的Socket通信程序設(shè)計通信程序設(shè)計nDatagramSocket類的常用方法如下:類的常用方法如下:n(1) void receive(DatagramPacket packet)throws IOExceptionnreceive()方法將使程序中的線程一直處
50、于阻塞狀態(tài),直方法將使程序中的線程一直處于阻塞狀態(tài),直到從當前到從當前socket中接收到信息時,將收到的信息存儲在中接收到信息時,將收到的信息存儲在receive()方法的對象參數(shù)方法的對象參數(shù)packet的存儲機構(gòu)中。的存儲機構(gòu)中。n(2) void send(DatagramPacket packet)throws IOExceptionnsend()方法將其參數(shù)方法將其參數(shù)DatagramPacket對象對象packet中包中包含的數(shù)據(jù)報文發(fā)送到所指定的含的數(shù)據(jù)報文發(fā)送到所指定的IP地址主機的指定端口。地址主機的指定端口。6116.3.3 無連接的無連接的Socket通信程序設(shè)計通信程
51、序設(shè)計n(3) void setSotimeout(int timeout) throws IOExceptionn當程序調(diào)用當程序調(diào)用DatagramSocket的的receive方法以讀取數(shù)據(jù)方法以讀取數(shù)據(jù)后,程序?qū)⑻幱谧枞麪顟B(tài),知道后,程序?qū)⑻幱谧枞麪顟B(tài),知道setSoTimeout方法所設(shè)方法所設(shè)置時間超時為止。置時間超時為止。 n(4) void close()n關(guān)閉數(shù)據(jù)報套接字,它不會拋出異常對象。關(guān)閉數(shù)據(jù)報套接字,它不會拋出異常對象。62基于UDP的socket編程接收端接收端(Server)發(fā)送端發(fā)送端(Client)DatagramSocket(int port)DatagramSocket()Da
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度牛肉產(chǎn)品綠色認證與環(huán)保標識合同4篇
- 二零二五版暖通設(shè)備研發(fā)與制造合同4篇
- 2025年度農(nóng)業(yè)品牌授權(quán)合作合同范本4篇
- 2025年度嬰幼兒奶粉線上線下融合營銷合作合同范本
- 2025年度門臉房屋租賃與新能源汽車充電站建設(shè)合同4篇
- 2025年度土地流轉(zhuǎn)收益分配合同示范文本
- 二零二五年度房地產(chǎn)公司打字員招聘合同4篇
- 二零二五年度互聯(lián)網(wǎng)+期權(quán)合約合同范本4篇
- 二零二五年度智能安防系統(tǒng)技術(shù)服務合同協(xié)議書2篇
- 2025年度蘋果出口貿(mào)易合同模板4篇
- 2024-2025學年高二上學期期末數(shù)學試卷(新題型:19題)(基礎(chǔ)篇)(含答案)
- 下運動神經(jīng)元損害綜合征疾病演示課件
- 北師大版三年級數(shù)學(上冊)看圖列式計算(完整版)
- 2023中考地理真題(含解析)
- 麻醉藥品、精神藥品月檢查記錄表
- 浙江省寧波市海曙區(qū)2022學年第一學期九年級期末測試科學試題卷(含答案和答題卡)
- 高考英語詞匯3500電子版
- 建院新聞社成立策劃書
- JJF 1101-2019環(huán)境試驗設(shè)備溫度、濕度參數(shù)校準規(guī)范
- GB/T 25000.51-2016系統(tǒng)與軟件工程系統(tǒng)與軟件質(zhì)量要求和評價(SQuaRE)第51部分:就緒可用軟件產(chǎn)品(RUSP)的質(zhì)量要求和測試細則
- 外科學試題庫及答案(共1000題)
評論
0/150
提交評論