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