版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第第12章章 Java網(wǎng)絡(luò)程序設(shè)計(jì)網(wǎng)絡(luò)程序設(shè)計(jì)Java網(wǎng)絡(luò)程序設(shè)計(jì)2nJava提供的網(wǎng)絡(luò)功能有三大類: URL, Socket, Datagram.nURL是三大功能中最高級的一種,通過URL Java程序可以直接送出或讀入網(wǎng)絡(luò)上的數(shù)據(jù).nSocket是傳統(tǒng)網(wǎng)絡(luò)程序最常用的方式,可以想象為兩個(gè)不同的程序通過網(wǎng)絡(luò)的通信信道.nDatagram是更低級的網(wǎng)絡(luò)傳輸方式,它把數(shù)據(jù)的目的記錄在數(shù)據(jù)包中,然后直接放在網(wǎng)絡(luò)上.Java網(wǎng)絡(luò)程序設(shè)計(jì)3主要內(nèi)容主要內(nèi)容n12.1 Java與網(wǎng)絡(luò)通信n1. TCP/IP協(xié)議n2. Java中的網(wǎng)絡(luò)功能n3. 端口n4. Socket通信機(jī)制n12.2 URL通信n
2、12.2.1 InetAddress類n12.2.2 URL類n12.2.3 URLConnection類n12.3 TCP Socket通信n1. URL通信與Socket通信的區(qū)別n2. 使用Socket通信過程n3. Socket類n4. ServerSocket類n12.4 數(shù)據(jù)報(bào)通信n作業(yè)Java網(wǎng)絡(luò)程序設(shè)計(jì)412.1 Java與網(wǎng)絡(luò)通信與網(wǎng)絡(luò)通信njava語言是Internet上的世界語。借助借助HTML從網(wǎng)上下載從網(wǎng)上下載applet在程序中通過在程序中通過URL訪問網(wǎng)上資源訪問網(wǎng)上資源通過通過包中的類包中的類直接在程序中實(shí)現(xiàn)網(wǎng)絡(luò)通訊直接在程序中實(shí)現(xiàn)網(wǎng)絡(luò)通訊Java網(wǎng)絡(luò)程序設(shè)計(jì)5
3、1. TCP/IP協(xié)議協(xié)議應(yīng)用層:應(yīng)用程序間溝通的層應(yīng)用層:應(yīng)用程序間溝通的層傳輸層:提供了結(jié)點(diǎn)間的數(shù)據(jù)傳送傳輸層:提供了結(jié)點(diǎn)間的數(shù)據(jù)傳送服務(wù)使用服務(wù)使用Socket、ServerSocket 類類網(wǎng)際層:負(fù)責(zé)提供基本的數(shù)據(jù)封包網(wǎng)際層:負(fù)責(zé)提供基本的數(shù)據(jù)封包傳送功能。傳送功能。網(wǎng)絡(luò)接口層:對實(shí)際的網(wǎng)絡(luò)媒體的網(wǎng)絡(luò)接口層:對實(shí)際的網(wǎng)絡(luò)媒體的管理,定義如何使用實(shí)際網(wǎng)絡(luò)來傳管理,定義如何使用實(shí)際網(wǎng)絡(luò)來傳送數(shù)據(jù)。送數(shù)據(jù)。應(yīng)用層應(yīng)用層(HTTP, FTP, telnet)傳輸層傳輸層(TCP, UDP,.)網(wǎng)際層網(wǎng)際層(IP)網(wǎng)絡(luò)接口層網(wǎng)絡(luò)接口層一般應(yīng)用程序是靠一般應(yīng)用程序是靠TCP(而不是而不是IP)實(shí)
4、現(xiàn)通訊功能,因?yàn)樗鼈冃枰髮?shí)現(xiàn)通訊功能,因?yàn)樗鼈冃枰罅繑?shù)據(jù)的無差錯(cuò)傳輸量數(shù)據(jù)的無差錯(cuò)傳輸。Java網(wǎng)絡(luò)程序設(shè)計(jì)61. TCP/IP協(xié)議協(xié)議Java網(wǎng)絡(luò)程序設(shè)計(jì)72. Java中的網(wǎng)絡(luò)功能中的網(wǎng)絡(luò)功能針對網(wǎng)絡(luò)通信的不同層次,針對網(wǎng)絡(luò)通信的不同層次,Java提供的網(wǎng)絡(luò)功能有四提供的網(wǎng)絡(luò)功能有四大類:大類:InetAddress 、URLs、Sockets、Datagram。n InetAddress面向的是面向的是IP層,用于標(biāo)識網(wǎng)絡(luò)上的硬層,用于標(biāo)識網(wǎng)絡(luò)上的硬件資源。件資源。n URL面向的是應(yīng)用層,通過面向的是應(yīng)用層,通過URL,Java程序可以直程序可以直接送出或讀入網(wǎng)絡(luò)上的數(shù)據(jù)。接送出或
5、讀入網(wǎng)絡(luò)上的數(shù)據(jù)。nSockets和和Datagram面向的則是傳輸層。面向的則是傳輸層。Sockets使用的是使用的是TCP協(xié)議,這是傳統(tǒng)網(wǎng)絡(luò)程序最常用的方式,協(xié)議,這是傳統(tǒng)網(wǎng)絡(luò)程序最常用的方式,可以想象為兩個(gè)不同的程序通過網(wǎng)絡(luò)的通信信道進(jìn)行可以想象為兩個(gè)不同的程序通過網(wǎng)絡(luò)的通信信道進(jìn)行通信。通信。Datagram則使用則使用UDP協(xié)議,是另一種網(wǎng)絡(luò)傳協(xié)議,是另一種網(wǎng)絡(luò)傳輸方式,它把數(shù)據(jù)的目的地記錄在數(shù)據(jù)包中,然后直輸方式,它把數(shù)據(jù)的目的地記錄在數(shù)據(jù)包中,然后直接放在網(wǎng)絡(luò)上。接放在網(wǎng)絡(luò)上。Java網(wǎng)絡(luò)程序設(shè)計(jì)包中的主要的類包中的主要的類n面向面向IP層的類:層的類:InetAddressn面
6、向應(yīng)用層的類:面向應(yīng)用層的類:URL、URLConnectionn面向傳輸層的類:面向傳輸層的類:nTCP協(xié)議相關(guān)類協(xié)議相關(guān)類:Socket、ServerSocketnUDP協(xié)議相關(guān)類:協(xié)議相關(guān)類:DatagramPacket、DatagramSocket、MulticastSocketn可能產(chǎn)生的可能產(chǎn)生的異常異常:nBindException、ConnectException、MalformedURLException、NoRouteToHostException、ProtocolException、SocketException、UnknownHostException、UnknownS
7、erviceExceptionJava網(wǎng)絡(luò)程序設(shè)計(jì)93. 端口端口nInternet上傳輸?shù)臄?shù)據(jù)都帶有標(biāo)識目的主機(jī)與端上傳輸?shù)臄?shù)據(jù)都帶有標(biāo)識目的主機(jī)與端口號的地址信息,主機(jī)的地址由口號的地址信息,主機(jī)的地址由32位的位的IP地址標(biāo)識,地址標(biāo)識,IP協(xié)議通過該地址把數(shù)據(jù)發(fā)送到正確的目的主機(jī);協(xié)議通過該地址把數(shù)據(jù)發(fā)送到正確的目的主機(jī);端口號由一個(gè)端口號由一個(gè)16位的數(shù)字標(biāo)識,位的數(shù)字標(biāo)識,TCP與與UDP協(xié)議根協(xié)議根據(jù)端口號把數(shù)據(jù)傳送給正確的應(yīng)用程序。據(jù)端口號把數(shù)據(jù)傳送給正確的應(yīng)用程序。n端口號的范圍是端口號的范圍是065535,其中,其中11023之間的之間的端口號是為端口號是為HTTP、FTP
8、等系統(tǒng)應(yīng)用保留等系統(tǒng)應(yīng)用保留的,的,F(xiàn)TP協(xié)協(xié)議的端口號是議的端口號是21,HTTP協(xié)議的端口號是協(xié)議的端口號是80,Telnet協(xié)議的端口號是協(xié)議的端口號是23,用戶應(yīng)用程序只能使用,用戶應(yīng)用程序只能使用1024以上的端口號,其中以上的端口號,其中10244999可任意被用可任意被用戶用作客戶端套接字端口,戶用作客戶端套接字端口,500065535可任意被可任意被用戶用作服務(wù)端套接字端口用戶用作服務(wù)端套接字端口。Java網(wǎng)絡(luò)程序設(shè)計(jì)10Java網(wǎng)絡(luò)程序設(shè)計(jì)114. Socket通信機(jī)制通信機(jī)制nSocket通信機(jī)制提供了兩種通信方式:通信機(jī)制提供了兩種通信方式:有連接有連接方式(方式(TCP
9、)和無連接方式()和無連接方式(UDP數(shù)據(jù)報(bào))數(shù)據(jù)報(bào))。n有連接方式中,通信雙方在開始時(shí)必須進(jìn)行一次連接過有連接方式中,通信雙方在開始時(shí)必須進(jìn)行一次連接過程,建立一條程,建立一條通信鏈路通信鏈路。通信鏈路提供了。通信鏈路提供了可靠的、全雙可靠的、全雙工的字節(jié)流服務(wù)工的字節(jié)流服務(wù)。n無連接方式中,通信雙方不存在一個(gè)連接過程,一次網(wǎng)無連接方式中,通信雙方不存在一個(gè)連接過程,一次網(wǎng)絡(luò)絡(luò)I/O以一個(gè)數(shù)據(jù)報(bào)形式進(jìn)行,而且每次網(wǎng)絡(luò)以一個(gè)數(shù)據(jù)報(bào)形式進(jìn)行,而且每次網(wǎng)絡(luò)I/O可以可以和不同主機(jī)的不同進(jìn)程進(jìn)行。無連接方式開銷小于有連和不同主機(jī)的不同進(jìn)程進(jìn)行。無連接方式開銷小于有連接方式,但是所提供的數(shù)據(jù)傳輸服務(wù)接
10、方式,但是所提供的數(shù)據(jù)傳輸服務(wù)不可靠不可靠,不能保證,不能保證數(shù)據(jù)報(bào)一定到達(dá)目的地。數(shù)據(jù)報(bào)一定到達(dá)目的地。nJava語言同時(shí)支持有連接和數(shù)據(jù)報(bào)通信方式,語言同時(shí)支持有連接和數(shù)據(jù)報(bào)通信方式,在這兩種方式中都在這兩種方式中都采用了采用了Socket表示通信過程中表示通信過程中的端點(diǎn)的端點(diǎn)。Java網(wǎng)絡(luò)程序設(shè)計(jì)124. Socket通信機(jī)制通信機(jī)制nSocket通信機(jī)制提供了兩種通信方式:通信機(jī)制提供了兩種通信方式:有連接有連接方式(方式(TCP)和無連接方式()和無連接方式(UDP數(shù)據(jù)報(bào))數(shù)據(jù)報(bào))。n有連接方式中,通信雙方在開始時(shí)必須進(jìn)行一次連接過有連接方式中,通信雙方在開始時(shí)必須進(jìn)行一次連接過程
11、,建立一條程,建立一條通信鏈路通信鏈路。通信鏈路提供了。通信鏈路提供了可靠的、全雙可靠的、全雙工的字節(jié)流服務(wù)工的字節(jié)流服務(wù)。n無連接方式中,通信雙方不存在一個(gè)連接過程,一次網(wǎng)無連接方式中,通信雙方不存在一個(gè)連接過程,一次網(wǎng)絡(luò)絡(luò)I/O以一個(gè)數(shù)據(jù)報(bào)形式進(jìn)行,而且每次網(wǎng)絡(luò)以一個(gè)數(shù)據(jù)報(bào)形式進(jìn)行,而且每次網(wǎng)絡(luò)I/O可以可以和不同主機(jī)的不同進(jìn)程進(jìn)行。無連接方式開銷小于有連和不同主機(jī)的不同進(jìn)程進(jìn)行。無連接方式開銷小于有連接方式,但是所提供的數(shù)據(jù)傳輸服務(wù)接方式,但是所提供的數(shù)據(jù)傳輸服務(wù)不可靠不可靠,不能保證,不能保證數(shù)據(jù)報(bào)一定到達(dá)目的地。數(shù)據(jù)報(bào)一定到達(dá)目的地。nJava語言同時(shí)支持有連接和數(shù)據(jù)報(bào)通信方式,語言
12、同時(shí)支持有連接和數(shù)據(jù)報(bào)通信方式,在這兩種方式中都在這兩種方式中都采用了采用了Socket表示通信過程中表示通信過程中的端點(diǎn)的端點(diǎn)。Java網(wǎng)絡(luò)程序設(shè)計(jì)13Socket通信通信n端到端的連接與通信端到端的連接與通信n網(wǎng)絡(luò)上的兩個(gè)程序(進(jìn)程)通過一個(gè)雙向的通信網(wǎng)絡(luò)上的兩個(gè)程序(進(jìn)程)通過一個(gè)雙向的通信連接實(shí)現(xiàn)數(shù)據(jù)的交換。連接實(shí)現(xiàn)數(shù)據(jù)的交換。n雙向鏈路的一端稱為一個(gè)雙向鏈路的一端稱為一個(gè)socket(套接字)套接字)n主機(jī)主機(jī)端口(用于區(qū)分同一臺主機(jī)上的不同的通端口(用于區(qū)分同一臺主機(jī)上的不同的通信應(yīng)用進(jìn)程:信應(yīng)用進(jìn)程:01023系統(tǒng)系統(tǒng) 102465535用戶)用戶)Java網(wǎng)絡(luò)程序設(shè)計(jì)14Soc
13、ket與與I/O流流n一個(gè)socket可以持有兩個(gè)流輸入流與輸出流Java網(wǎng)絡(luò)程序設(shè)計(jì)15Socket通信過程通信過程n服務(wù)器端的程序首先選擇一個(gè)端口服務(wù)器端的程序首先選擇一個(gè)端口(port)注冊注冊,然后調(diào)用然后調(diào)用accept()方法對此端口進(jìn)行方法對此端口進(jìn)行監(jiān)聽監(jiān)聽,即等,即等待其它程序的連接申請。如果客戶端的程序申請和待其它程序的連接申請。如果客戶端的程序申請和此端口連接,那么服務(wù)器端就利用此端口連接,那么服務(wù)器端就利用accept()方法方法來取得這個(gè)連接的來取得這個(gè)連接的Socket??蛻舳说某绦蚪ⅰ?蛻舳说某绦蚪ocket時(shí)必須指定服務(wù)器的地址時(shí)必須指定服務(wù)器的地址(ho
14、st)和通信的和通信的端口端口(port),這個(gè)端口必須與服務(wù)器端監(jiān)聽的端口,這個(gè)端口必須與服務(wù)器端監(jiān)聽的端口保持一致。保持一致。Java網(wǎng)絡(luò)程序設(shè)計(jì)1612.2 URL通信通信nURL(Uniform Resource Locator)是統(tǒng)一資源是統(tǒng)一資源定位器的簡稱,它表示定位器的簡稱,它表示Internet/Intranet上一個(gè)上一個(gè)資源的引用或地址,這些資源可以是一個(gè)文件、一資源的引用或地址,這些資源可以是一個(gè)文件、一個(gè)目錄或一個(gè)對象。個(gè)目錄或一個(gè)對象。 nURL是由一個(gè)字符串來描述的,是由一個(gè)字符串來描述的,URL包括協(xié)議包括協(xié)議和資源名稱兩部分,協(xié)議表示訪問資源所需的協(xié)議,和資源
15、名稱兩部分,協(xié)議表示訪問資源所需的協(xié)議,如如HTTP、FTP等;資源名稱表示要訪問的資源地等;資源名稱表示要訪問的資源地址。址。 n:8080Java網(wǎng)絡(luò)程序設(shè)計(jì)1712.2.1 InetAddress類類n類類InetAddress可以用于標(biāo)識網(wǎng)絡(luò)上的硬件資源,可以用于標(biāo)識網(wǎng)絡(luò)上的硬件資源,它提供了一系列方法以描述、獲取及使用網(wǎng)絡(luò)資源。它提供了一系列方法以描述、獲取及使用網(wǎng)絡(luò)資源。nInetAddress類沒有構(gòu)造函數(shù),因此不能用類沒有構(gòu)造函數(shù),因此不能用new來來構(gòu)造一個(gè)構(gòu)造一個(gè)InetAddress實(shí)例。通常是用它提供的靜態(tài)實(shí)例。通常是用它提供的靜態(tài)方法來獲
16、?。悍椒▉慝@取:npublic static InetAddress getByName(String host) :host可以是一個(gè)機(jī)器名,也可以是一個(gè)形如可以是一個(gè)機(jī)器名,也可以是一個(gè)形如“%d.%d.%d.%d”的的IP地址或一個(gè)地址或一個(gè)DSN域名。域名。npublic static InetAddress getLocalHost() npublic static InetAddress getAllByName(String host)n這三個(gè)方法通常會產(chǎn)生這三個(gè)方法通常會產(chǎn)生UnknownHostException例外,應(yīng)在程序中捕獲處理。例外,應(yīng)在程序中捕獲處理。Java網(wǎng)絡(luò)
17、程序設(shè)計(jì)18InetAddress類的幾個(gè)主要方法:類的幾個(gè)主要方法:npublic byte getAddress():獲得本對象的獲得本對象的IP地址(存放在字節(jié)數(shù)組中)。地址(存放在字節(jié)數(shù)組中)。npublic String getHostAddress():獲得本對象獲得本對象的的IP地址地址“%d.%d.%d.%d”。npublic String getHostName():獲得本對象的獲得本對象的機(jī)器名。機(jī)器名。n獲得本地主機(jī)的獲得本地主機(jī)的IP地址:地址:InetAddress addr=InetAddress.getLocalHost();import .*;public cl
18、ass TestInetAddressClass public static void main(String args) try InetAddress address=InetAddress.getByName();String hostName = address.getHostName(); / 獲得主機(jī)名獲得主機(jī)名String IPName = address.getHostAddress(); / 獲得獲得IP地址地址System.out.println(hostName);System.out.println(IPName); catch (UnknownHostExceptio
19、n e) e.printStackTrace(); Java網(wǎng)絡(luò)程序設(shè)計(jì)19【例12.1】TestInetAddressClass.javaJava網(wǎng)絡(luò)程序設(shè)計(jì)2012.2.2 URL類類npublic URL(String spec)n/參數(shù)參數(shù)spec是描述文件名的字符串。是描述文件名的字符串。npublic URL(String protocol, String host, String file)n/參數(shù)中的參數(shù)中的protocol為協(xié)議名;為協(xié)議名;host為主機(jī)名;為主機(jī)名;file為文為文件名;端口號使用默認(rèn)值。件名;端口號使用默認(rèn)值。npublic URL(String pro
20、tocol,String host,String port,String file)npublic URL(URL context,String spec)n/參數(shù)參數(shù)context為為URL對象,用于指定對象,用于指定URL位置。位置。注意注意:類:類URL的構(gòu)造方法都聲明拋出非運(yùn)行時(shí)異常的構(gòu)造方法都聲明拋出非運(yùn)行時(shí)異常(MalformedURLException),因此生成),因此生成URL對象時(shí),我對象時(shí),我們必須要對這一異常進(jìn)行處理,用們必須要對這一異常進(jìn)行處理,用trycatch語句進(jìn)行捕獲。語句進(jìn)行捕獲。Java網(wǎng)絡(luò)程序設(shè)計(jì)2112.2.2 URL類類一個(gè)一個(gè)URL對象生成后,其屬
21、性是不能被改變的,但可對象生成后,其屬性是不能被改變的,但可以通過它給定的方法來獲取這些屬性:以通過它給定的方法來獲取這些屬性:getDefaultport():返回缺省的端口號。返回缺省的端口號。getFile():獲得獲得URL指定資源的完整文件名指定資源的完整文件名getHost():返回主機(jī)名。返回主機(jī)名。getPath():返回指定資源文件目錄和文件名返回指定資源文件目錄和文件名getPort():返回端口號,默認(rèn)返回端口號,默認(rèn)-1getProtocol():返回表示返回表示URL中協(xié)議的字符串對象中協(xié)議的字符串對象getRef():返回返回URL中的中的HTML文檔標(biāo)記,即文檔標(biāo)
22、記,即#號標(biāo)記號標(biāo)記getUserInfo():返回用戶信息。返回用戶信息。toExternalForm():返回完整的返回完整的URL字符串。字符串。toString():返回完整返回完整URL字符串。字符串。/生成一個(gè)生成一個(gè)URL對象,并獲取它的各個(gè)屬性。對象,并獲取它的各個(gè)屬性。URL MyURL = null;try MyURL=new URL(http:/ catch (MalformedURLException e) System.out.println(MalformedURLException: + e); System.out.println(URL String: + M
23、yURL.toString();System.out.println(Protocol: + MyURL.getProtocol();System.out.println(Host: + MyURL.getHost();System.out.println(Port: + MyURL.getPort();System.out.println(File: + MyURL.getFile();Java網(wǎng)絡(luò)程序設(shè)計(jì)22【例【例12.2】 TestURLObject.javaJava網(wǎng)絡(luò)程序設(shè)計(jì)23通過通過URL讀取讀取www信息信息通過URL類提供的方法openStream(),就可以讀取一個(gè)URL
24、對象所指定的資源。public final InputStream openStream() 方法openStream()與指定的URL建立連接并返回一個(gè)InputStream對象,將URL位置的資源轉(zhuǎn)成一個(gè)數(shù)據(jù)流。通過這個(gè)InputStream對象,就可以讀取資源中的數(shù)據(jù)。URLJava 程序程序InputStreamJava網(wǎng)絡(luò)程序設(shè)計(jì)24【例【例12.3】 TestURLHtml.javan用用URL類的類的openStream()成員方法獲取指定的成員方法獲取指定的HTML頁面的源代碼。頁面的源代碼。try URL url = new URL(/ch1/W
25、ebForm1-1.aspx);/ 用用URL對象打開一個(gè)輸入流對象打開一個(gè)輸入流DataInputStream d = new DataInputStream(url.openStream();String inputLine;while (inputLine = d.readLine() != null) / 從輸入流讀入數(shù)據(jù)從輸入流讀入數(shù)據(jù)System.out.println(inputLine); / 將數(shù)據(jù)顯示到系統(tǒng)標(biāo)準(zhǔn)輸出上將數(shù)據(jù)顯示到系統(tǒng)標(biāo)準(zhǔn)輸出上d.close(); / 關(guān)閉輸入流關(guān)閉輸入流 catch (MalformedURLException me) catch (IOE
26、xception ioe) Java網(wǎng)絡(luò)程序設(shè)計(jì)25【例【例12.3】 TestURLHtml.javan在在JDK1.1以后以后DataInputStream的的readLine方法就過期方法就過期了了,換用換用BufferedReader。將代碼將代碼DataInputStream d = new DataInputStream(url.openStream();改為改為BufferedReader d=new BufferedReader(new InputStreamReader(url.openStream();就可以了就可以了Java網(wǎng)絡(luò)程序設(shè)計(jì)26【例【例12.3】 TestUR
27、LHtml.javan說明:由于說明:由于URL的的openStream()成員方法返回的成員方法返回的是是InputStream類的對象,所以只能通過類的對象,所以只能通過read()方方法逐個(gè)字節(jié)地去讀法逐個(gè)字節(jié)地去讀URL地址處的資源信息。這里利用地址處的資源信息。這里利用DataInputStream對原始信息流進(jìn)行了包裝和處理,對原始信息流進(jìn)行了包裝和處理,以提高以提高I/O效率。效率。Java網(wǎng)絡(luò)程序設(shè)計(jì)2712.2.3 URLConnection類類n通過通過URL類提供的方法類提供的方法openConnection(),就可以就可以獲得一個(gè)獲得一個(gè)URL連接(連接(URLCon
28、nection)對象。對象。npublic URLConnection openConnection()n通過通過URL的方法的方法openStream(),只能從網(wǎng)絡(luò)上讀取只能從網(wǎng)絡(luò)上讀取資源中的數(shù)據(jù)。通過資源中的數(shù)據(jù)。通過URLConnection類,可以在應(yīng)用類,可以在應(yīng)用程序和程序和URL資源之間進(jìn)行交互,既可以從資源之間進(jìn)行交互,既可以從URL中讀取中讀取數(shù)據(jù),也可以向數(shù)據(jù),也可以向URL中發(fā)送數(shù)據(jù)。中發(fā)送數(shù)據(jù)。URLConnection類類表示了應(yīng)用程序和表示了應(yīng)用程序和URL資源之間的通信連接。資源之間的通信連接??蛻舳丝蛻舳薺ava程序程序OutputStreamInputSt
29、reamCGI程序程序STDINSTDOUT服務(wù)器服務(wù)器connectiongetchar()putchar()Java網(wǎng)絡(luò)程序設(shè)計(jì)2812.2.3 URLConnection類類1創(chuàng)建創(chuàng)建URLConnection類的對象類的對象URLConnection類是一個(gè)抽象類,創(chuàng)建URLConnection對象分兩步完成:首先創(chuàng)建一個(gè)URL對象,然后調(diào)用該URL對象的openConnection()方法返回一個(gè)對應(yīng)其URL地址的URLConnection對象。例如:nURL MyURL=new URL(http:/ con= MyURL.openConnection();Java網(wǎng)絡(luò)程序設(shè)計(jì)291
30、2.2.3 URLConnection類類2向服務(wù)器端寫數(shù)據(jù)向服務(wù)器端寫數(shù)據(jù)首先建立輸出數(shù)據(jù)流:首先建立輸出數(shù)據(jù)流: nPrintStream out=new PrintStream(con.getOutputStream(); 然后向服務(wù)器寫入信息:然后向服務(wù)器寫入信息: nout.println(String data);Java網(wǎng)絡(luò)程序設(shè)計(jì)3012.2.3 URLConnection類類3從服務(wù)器端讀數(shù)據(jù)從服務(wù)器端讀數(shù)據(jù)首先建立輸入數(shù)據(jù)流:首先建立輸入數(shù)據(jù)流:nInputStreamReader ins=new InputStreamReader(con.getInputStream()
31、;nBufferedReader in=new BufferedReader(ins);或:或:nDataInputStream dis=newDataInputStream(con.getInputStream();然后從服務(wù)器讀信息:然后從服務(wù)器讀信息:in.readLine(); 或:dis.readLine();Java網(wǎng)絡(luò)程序設(shè)計(jì)31【例【例12.4】 CommunicationCgi.javan使用使用URLConnection類從遠(yuǎn)方主機(jī)獲取信息。類從遠(yuǎn)方主機(jī)獲取信息。n由于安全性的約束,由于安全性的約束,Java程序只能對特定的程序只能對特定的URL進(jìn)行寫的操作,這種進(jìn)行寫的操
32、作,這種URL就是服務(wù)器上的就是服務(wù)器上的CGI程序。程序。CGI是公共網(wǎng)關(guān)接口是公共網(wǎng)關(guān)接口(CommonGatewayInterface)的簡稱,它是客戶端瀏覽器與服務(wù)器端的應(yīng)用程序進(jìn)的簡稱,它是客戶端瀏覽器與服務(wù)器端的應(yīng)用程序進(jìn)行通信的接口。行通信的接口。Java網(wǎng)絡(luò)程序設(shè)計(jì)32【例【例12.4】 CommunicationCgi.java/ 建立指向網(wǎng)絡(luò)中建立指向網(wǎng)絡(luò)中CGI的的URL對象,對象,backwards為服務(wù)器端為服務(wù)器端CGI程序程序URL url = new URL(http:/);URLConnection connection = url.openConnectio
33、n();/將將 doOutput 標(biāo)志設(shè)置為標(biāo)志設(shè)置為 true,表示使用,表示使用URL連接進(jìn)行輸入。連接進(jìn)行輸入。 connection.setDoOutput(true);/讀取或?qū)懭脒h(yuǎn)方的計(jì)算機(jī)節(jié)點(diǎn)的信息時(shí),首先要建立輸入或輸出數(shù)據(jù)流,利用讀取或?qū)懭脒h(yuǎn)方的計(jì)算機(jī)節(jié)點(diǎn)的信息時(shí),首先要建立輸入或輸出數(shù)據(jù)流,利用URLConnection類的方法類的方法 getlnputStream()或或getOutputStream()PrintStream out = new PrintStream(connection.getOutputStream();out.println(12345); /向
34、遠(yuǎn)方計(jì)算機(jī)節(jié)點(diǎn)寫入信息向遠(yuǎn)方計(jì)算機(jī)節(jié)點(diǎn)寫入信息,服務(wù)器輸出數(shù)據(jù)服務(wù)器輸出數(shù)據(jù)out.close();InputStreamReader ins = new InputStreamReader(connection.getInputStream();BufferedReader in = new BufferedReader(ins);String inputLine;while (inputLine = in.readLine() != null) /讀取遠(yuǎn)方計(jì)算機(jī)節(jié)點(diǎn)的信息讀取遠(yuǎn)方計(jì)算機(jī)節(jié)點(diǎn)的信息System.out.println(inputLine); / 輸出從服務(wù)器讀出的數(shù)據(jù)輸出從服
35、務(wù)器讀出的數(shù)據(jù)in.close();Java網(wǎng)絡(luò)程序設(shè)計(jì)3312.3 TCP Socket通信通信nTCP(Transport Control Protocol)n兩主機(jī)之間兩主機(jī)之間有連接的、可靠的、端對端有連接的、可靠的、端對端(end-to-end)的的數(shù)據(jù)流的傳輸數(shù)據(jù)流的傳輸.n如如http, ftp, telnet 的傳輸層均使用此協(xié)議的傳輸層均使用此協(xié)議Java網(wǎng)絡(luò)程序設(shè)計(jì)3412.3 TCP Socket通信通信n為了支持為了支持TCP/IP面向連接的網(wǎng)絡(luò)程序的開發(fā),面向連接的網(wǎng)絡(luò)程序的開發(fā),包提供了包提供了Socket類與類與ServerSocket類,類,ServerSock
36、et類和類和Socket類均直接繼承于類均直接繼承于Java的的Object根類。根類。nServerSocket類用于服務(wù)端程序,它有一個(gè)類用于服務(wù)端程序,它有一個(gè)accept方法專門用來監(jiān)聽客戶端的連接,并產(chǎn)生一個(gè)方法專門用來監(jiān)聽客戶端的連接,并產(chǎn)生一個(gè)與客戶端連接相對應(yīng)的與客戶端連接相對應(yīng)的Socket對象;對象;nSocket類則是服務(wù)端程序和客戶端程序都要用到的類則是服務(wù)端程序和客戶端程序都要用到的類,該類專門用來處理連接雙方的數(shù)據(jù)通信。一個(gè)類,該類專門用來處理連接雙方的數(shù)據(jù)通信。一個(gè)Socket由一個(gè)由一個(gè)IP地址和一個(gè)端口號唯一確定。地址和一個(gè)端口號唯一確定。Java網(wǎng)絡(luò)程序設(shè)計(jì)
37、351. URL通信與通信與Socket通信的區(qū)別通信的區(qū)別nURL通信與通信與Socket通信都是面向連接的通信。它們通信都是面向連接的通信。它們的區(qū)別在于:的區(qū)別在于:(1) Socket通信方式為通信方式為主動(dòng)主動(dòng)等待客戶端的服務(wù)請求方式。而等待客戶端的服務(wù)請求方式。而URL通信方式為通信方式為被動(dòng)被動(dòng)等待客戶端的服務(wù)請求方式。等待客戶端的服務(wù)請求方式。(2) 利用利用Socket進(jìn)行通信時(shí),在服務(wù)器端運(yùn)行了一個(gè)進(jìn)行通信時(shí),在服務(wù)器端運(yùn)行了一個(gè)Socket通通信程序,不停地監(jiān)聽客戶端的連接請求,當(dāng)接到客戶端請求后,信程序,不停地監(jiān)聽客戶端的連接請求,當(dāng)接到客戶端請求后,馬上建立連接并進(jìn)行
38、通信。利用馬上建立連接并進(jìn)行通信。利用URL進(jìn)行通信時(shí),在服務(wù)器端常進(jìn)行通信時(shí),在服務(wù)器端常駐一個(gè)駐一個(gè)CGI程序,但它一直處于睡眠狀態(tài),只有當(dāng)客戶端的連接程序,但它一直處于睡眠狀態(tài),只有當(dāng)客戶端的連接請求到達(dá)時(shí)才被喚醒,然后建立連接并進(jìn)行通信。請求到達(dá)時(shí)才被喚醒,然后建立連接并進(jìn)行通信。(3) 在在Socket通信方式中,服務(wù)器端的程序可以打開多個(gè)線程通信方式中,服務(wù)器端的程序可以打開多個(gè)線程與多個(gè)客戶端進(jìn)行通信,并且還可以通過服務(wù)器使各個(gè)客戶端之與多個(gè)客戶端進(jìn)行通信,并且還可以通過服務(wù)器使各個(gè)客戶端之間進(jìn)行通信,這種方式適合于一些較復(fù)雜的通信。而在間進(jìn)行通信,這種方式適合于一些較復(fù)雜的通信
39、。而在URL通信通信方式中,服務(wù)器端的程序只能與一個(gè)客戶進(jìn)行通信,這種方式比方式中,服務(wù)器端的程序只能與一個(gè)客戶進(jìn)行通信,這種方式比較適合于較適合于B/S通信模式。通信模式。361.Socket通信機(jī)制的基本概念通信機(jī)制的基本概念(1)建立連接)建立連接n當(dāng)兩臺計(jì)算機(jī)進(jìn)行通信時(shí),首先要在兩者之間建立當(dāng)兩臺計(jì)算機(jī)進(jìn)行通信時(shí),首先要在兩者之間建立一個(gè)連接,也就是兩者分別運(yùn)行不同的程序,由一一個(gè)連接,也就是兩者分別運(yùn)行不同的程序,由一端發(fā)出連接請求,另一端等候連接請求。端發(fā)出連接請求,另一端等候連接請求。n當(dāng)?shù)群蚨耸盏秸埱蟛⒔邮苷埱蠛螅瑑蓚€(gè)程序就建立當(dāng)?shù)群蚨耸盏秸埱蟛⒔邮苷埱蠛?,兩個(gè)程序就建立起一個(gè)
40、連接,之后通過這個(gè)連接可以進(jìn)行數(shù)據(jù)交換。起一個(gè)連接,之后通過這個(gè)連接可以進(jìn)行數(shù)據(jù)交換。此時(shí),請求方稱為此時(shí),請求方稱為客戶端客戶端,接收方稱為,接收方稱為服務(wù)器端服務(wù)器端。n應(yīng)用在這兩端的應(yīng)用在這兩端的TCP Socket分別稱為分別稱為服務(wù)器服務(wù)器Socket和和客戶客戶Socket。n基本原理類似于電話系統(tǒng)?;驹眍愃朴陔娫捪到y(tǒng)。371.Socket通信機(jī)制的基本概念通信機(jī)制的基本概念(2)連接地址)連接地址n為了建立連接,需要有一個(gè)程序向另一臺計(jì)算機(jī)上為了建立連接,需要有一個(gè)程序向另一臺計(jì)算機(jī)上的程序發(fā)出請求,其中,能夠唯一識別對方機(jī)器的,的程序發(fā)出請求,其中,能夠唯一識別對方機(jī)器的,
41、就是計(jì)算機(jī)的名稱或就是計(jì)算機(jī)的名稱或IP地址地址,稱為,稱為連接地址連接地址,類似,類似于電話系統(tǒng)中的電話號碼。于電話系統(tǒng)中的電話號碼。n計(jì)算機(jī)上的每個(gè)程序有一個(gè)唯一的端口號,通過端計(jì)算機(jī)上的每個(gè)程序有一個(gè)唯一的端口號,通過端口號指定要連接的程序。所以一個(gè)完整的連接應(yīng)該口號指定要連接的程序。所以一個(gè)完整的連接應(yīng)該是是IP+端口端口。n兩個(gè)程序進(jìn)行連接之前要約定好端口號。由服務(wù)器兩個(gè)程序進(jìn)行連接之前要約定好端口號。由服務(wù)器端分配端口號并等候請求,客戶端利用這個(gè)端口號端分配端口號并等候請求,客戶端利用這個(gè)端口號發(fā)出連接請求,當(dāng)兩個(gè)程序所設(shè)定的端口號一致時(shí)發(fā)出連接請求,當(dāng)兩個(gè)程序所設(shè)定的端口號一致時(shí)
42、連接成功。連接成功。381.Socket通信機(jī)制的基本概念通信機(jī)制的基本概念(3)TCP/IP Socket通信通信nSocket在在TCP/IP協(xié)議中定義,針對一個(gè)特定的連接,協(xié)議中定義,針對一個(gè)特定的連接,每臺機(jī)器上都有一個(gè)每臺機(jī)器上都有一個(gè)“套接字套接字”,可以想象在它們,可以想象在它們之間有一條虛擬的之間有一條虛擬的“線纜線纜”,線纜的每一端都插入,線纜的每一端都插入一個(gè)一個(gè)“套接字套接字”或或“插座插座”里。里。n在在Java語言中,服務(wù)器端套接字使用語言中,服務(wù)器端套接字使用ServerSocket類,客戶端套接字使用類,客戶端套接字使用Socket類。類。39SOCKET連接過程
43、連接過程n套接字之間的連接過程可以分為三個(gè)步驟:套接字之間的連接過程可以分為三個(gè)步驟:n服務(wù)器監(jiān)聽服務(wù)器監(jiān)聽:服務(wù)器端套接字并不定位具體的客戶端套接字,:服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于而是處于等待連接的狀態(tài)等待連接的狀態(tài),實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài)。,實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài)。n客戶端請求客戶端請求:是指由客戶端的套接字提出連接請求,要連接:是指由客戶端的套接字提出連接請求,要連接的目標(biāo)是服務(wù)器端的套接字。為此,客戶端的套接字必須首的目標(biāo)是服務(wù)器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字,先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的指出服務(wù)器端套接字的地址和
44、端口號地址和端口號,然后就向服務(wù)器端套接字,然后就向服務(wù)器端套接字提出連接請求提出連接請求。n連接確認(rèn)連接確認(rèn):是指當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接收到客戶:是指當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求,它就響應(yīng)客戶端套接字的請求,建立端套接字的連接請求,它就響應(yīng)客戶端套接字的請求,建立一個(gè)新的線程,把服務(wù)器端套接字的描述發(fā)給客戶端,一旦一個(gè)新的線程,把服務(wù)器端套接字的描述發(fā)給客戶端,一旦客戶端確認(rèn)了此描述,連接就建立好了。而服務(wù)器端套接字客戶端確認(rèn)了此描述,連接就建立好了。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請求。繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端
45、套接字的連接請求。4016.3.2 基于連接的基于連接的Socket通信程序設(shè)計(jì)通信程序設(shè)計(jì)Java網(wǎng)絡(luò)程序設(shè)計(jì)412. 使用使用Socket通信過程通信過程n利用利用socket進(jìn)行有連接的通信過程包括以下三個(gè)進(jìn)行有連接的通信過程包括以下三個(gè)步驟:步驟:(1) 創(chuàng)建創(chuàng)建socket,建立連接,建立連接包中的兩個(gè)類包中的兩個(gè)類Socket與與ServerSocket分分別表示連接的別表示連接的Client端和端和Server端,進(jìn)行網(wǎng)絡(luò)通信端,進(jìn)行網(wǎng)絡(luò)通信的方法也都封裝在這兩個(gè)類中。建立連接首先要?jiǎng)?chuàng)的方法也都封裝在這兩個(gè)類中。建立連接首先要?jiǎng)?chuàng)建這兩個(gè)類的對象并把它們關(guān)聯(lián)起來。建這兩個(gè)類的對象并
46、把它們關(guān)聯(lián)起來。(2) 打開連接到打開連接到Socket的輸入輸出流,按照一定的的輸入輸出流,按照一定的協(xié)議對協(xié)議對Socket進(jìn)行讀寫操作進(jìn)行讀寫操作.連接建立后,要進(jìn)一步獲取連接上的連接建立后,要進(jìn)一步獲取連接上的I/O流,并通過流,并通過這些流進(jìn)行數(shù)據(jù)傳輸。這些流進(jìn)行數(shù)據(jù)傳輸。(3) 關(guān)閉關(guān)閉Socket.Java網(wǎng)絡(luò)程序設(shè)計(jì)423. Socket類類socket類構(gòu)造方法類構(gòu)造方法npublic Socket(String host, int port) 創(chuàng)建一個(gè)流套接字并將其連接到指定主機(jī)上的指定端口號。創(chuàng)建一個(gè)流套接字并將其連接到指定主機(jī)上的指定端口號。 npublic Socke
47、t(InetAddress address, int port) 創(chuàng)建一個(gè)流套接字并將其連接到指定創(chuàng)建一個(gè)流套接字并將其連接到指定 IP 地址的指定端口號地址的指定端口號 npublic Socket(String host, int port, InetAddress localAddr, int localPort)創(chuàng)建一個(gè)套接字并將其連接到指定遠(yuǎn)程地址上的指定遠(yuǎn)程端口創(chuàng)建一個(gè)套接字并將其連接到指定遠(yuǎn)程地址上的指定遠(yuǎn)程端口npublic Socket(InetAddress address, int port, InetAddress localAddr,int localPort)創(chuàng)建一
48、個(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ù)器端流套接字的流套接字流套接字。43Socket 類常用方法類常用方法nSocket的輸入的輸入/輸出流管理輸出流管理public InputStream getInputStream()/獲取與獲取與Socket相關(guān)聯(lián)的字節(jié)輸入流,用于從相關(guān)聯(lián)的字節(jié)輸入流,用于從Socket中讀數(shù)據(jù)中讀
49、數(shù)據(jù)public OutputStream getOutputStream() /獲取與獲取與Socket相關(guān)聯(lián)的字節(jié)輸出流,用于向相關(guān)聯(lián)的字節(jié)輸出流,用于向Socket中寫數(shù)據(jù)中寫數(shù)據(jù)n這些方法都將拋出例外這些方法都將拋出例外IOException,程序中需要捕獲,程序中需要捕獲處理。處理。n 關(guān)閉關(guān)閉Socketpublic void close() throws IOException44Socket 類常用方法類常用方法n設(shè)置設(shè)置/獲取獲取Socket數(shù)據(jù)數(shù)據(jù)public InetAddress getInetAddress():獲取創(chuàng)建獲取創(chuàng)建Socket對象時(shí)指定的計(jì)算機(jī)對象時(shí)指定
50、的計(jì)算機(jī)IP地址。地址。public InetAddress getLocalAddress():獲取創(chuàng)建獲取創(chuàng)建Socket對象時(shí)客戶計(jì)算機(jī)的對象時(shí)客戶計(jì)算機(jī)的IP地址。地址。public int getPort() :獲取創(chuàng)建獲取創(chuàng)建Socket對象時(shí)遠(yuǎn)程主機(jī)對象時(shí)遠(yuǎn)程主機(jī)的端口號的端口號public int getLocalPort()public void setSoTimeout(int timeout):設(shè)定客戶端接:設(shè)定客戶端接口所需等到的時(shí)間限度口所需等到的時(shí)間限度n 這些方法都將拋出例外這些方法都將拋出例外SocketException。Java網(wǎng)絡(luò)程序設(shè)計(jì)454. Serv
51、erSocket類類n構(gòu)造方法:構(gòu)造方法:npublic ServerSocket(int port)npublic ServerSocket(int port, int backlog):支支持指定數(shù)目的連接持指定數(shù)目的連接npublic ServerSocket(int port, int backlog, InetAddress bindAddr)n這些方法都將拋出例外這些方法都將拋出例外IOException,程序中需要捕程序中需要捕獲處理。獲處理。Java網(wǎng)絡(luò)程序設(shè)計(jì)464. ServerSocket類類主要方法主要方法npublic Socket accept() :在服務(wù)器端的指
52、定端口監(jiān)聽在服務(wù)器端的指定端口監(jiān)聽客戶端發(fā)來的連接請求,并與之連接。客戶端發(fā)來的連接請求,并與之連接。npublic void close() :關(guān)閉:關(guān)閉Socketnpublic InetAddress getInetAddress() :返回服務(wù)器返回服務(wù)器的的IP地址地址npublic int getLocalPort() :取得取得服務(wù)器的端口號服務(wù)器的端口號Java網(wǎng)絡(luò)程序設(shè)計(jì)47基于基于TCP的的socket編程編程n服務(wù)器程序編寫:服務(wù)器程序編寫:調(diào)用調(diào)用ServerSocket(int port)創(chuàng)建一個(gè)服務(wù)器創(chuàng)建一個(gè)服務(wù)器端套接字,并綁定到指定端口上;端套接字,并綁定到指定
53、端口上;調(diào)用調(diào)用accept(),監(jiān)聽連接請求,如果客戶端請,監(jiān)聽連接請求,如果客戶端請求連接,則接受連接,返回通信套接字。求連接,則接受連接,返回通信套接字。調(diào)用調(diào)用Socket類的類的getOutputStream()和和getInputStream獲取輸出流和輸入流,開始網(wǎng)絡(luò)獲取輸出流和輸入流,開始網(wǎng)絡(luò)數(shù)據(jù)的發(fā)送和接收。數(shù)據(jù)的發(fā)送和接收。最后關(guān)閉通信套接字。最后關(guān)閉通信套接字。Java網(wǎng)絡(luò)程序設(shè)計(jì)48基于基于TCP的的socket編程編程n客戶端程序編寫:客戶端程序編寫:調(diào)用調(diào)用Socket()創(chuàng)建一個(gè)流套接字,并連接到服創(chuàng)建一個(gè)流套接字,并連接到服務(wù)器端;務(wù)器端;調(diào)用調(diào)用Socket類
54、的類的getOutputStream()和和getInputStream獲取輸出流和輸入流,開始網(wǎng)絡(luò)獲取輸出流和輸入流,開始網(wǎng)絡(luò)數(shù)據(jù)的發(fā)送和接收。數(shù)據(jù)的發(fā)送和接收。 最后關(guān)閉通信套接字。最后關(guān)閉通信套接字。Java網(wǎng)絡(luò)程序設(shè)計(jì)49基于基于TCP的的socket編程編程ServerServerServerSocket(int port)Socket accept()OutputStream Socket.getOutputStream()InputStream Socket.getInputSream()Socket.close()ClientSocket(InetAddress address
55、, int port)OutputStream Socket.getOutputStream()InputStream Socket.getInputStream()Socket.close()Java網(wǎng)絡(luò)程序設(shè)計(jì)505. TCP Socket通信程序設(shè)計(jì)舉例通信程序設(shè)計(jì)舉例n【例例12.5】一個(gè)完整的實(shí)現(xiàn)一個(gè)完整的實(shí)現(xiàn)Socket通信的通信的Java程序,分別為服務(wù)器端程序和客戶端程序。在這個(gè)程序,分別為服務(wù)器端程序和客戶端程序。在這個(gè)程序中,程序中,TCP服務(wù)器在服務(wù)器在8000端口上傾聽,等待與端口上傾聽,等待與客戶端連接。當(dāng)建立連接后,客戶端向服務(wù)器端發(fā)客戶端連接。當(dāng)建立連接后,客戶端
56、向服務(wù)器端發(fā)送一條信息,服務(wù)器收到后再向客戶端發(fā)送一條信送一條信息,服務(wù)器收到后再向客戶端發(fā)送一條信息,直到客戶端發(fā)送息,直到客戶端發(fā)送bye結(jié)束消息傳遞,并拆除客結(jié)束消息傳遞,并拆除客戶端與服務(wù)器端的連接。戶端與服務(wù)器端的連接。 nserver.java client.javan分析如圖示: Java網(wǎng)絡(luò)程序設(shè)計(jì)51創(chuàng)建服務(wù)器創(chuàng)建服務(wù)器(端口號端口號)定義數(shù)據(jù)成員定義數(shù)據(jù)成員服務(wù)器等待服務(wù)器等待網(wǎng)絡(luò)連接網(wǎng)絡(luò)連接建立建立socket流流發(fā)送談話信息發(fā)送談話信息接收用戶談話信息接收用戶談話信息創(chuàng)建創(chuàng)建Socket實(shí)例實(shí)例定義數(shù)據(jù)成員定義數(shù)據(jù)成員建立建立socket流流發(fā)送談話信息發(fā)送談話信息接收
57、服務(wù)器談話信息接收服務(wù)器談話信息關(guān)閉流關(guān)閉流accept() 80008000結(jié)束談話結(jié)束談話(Bye.)結(jié)束談話結(jié)束談話(Bye.)關(guān)閉流關(guān)閉流服務(wù)器端服務(wù)器端客戶端客戶端Java網(wǎng)絡(luò)程序設(shè)計(jì)525. TCP Socket通信程序設(shè)計(jì)舉例通信程序設(shè)計(jì)舉例Java網(wǎng)絡(luò)程序設(shè)計(jì)536.多線程的多線程的TCP服務(wù)器服務(wù)器n在【例在【例12.5】中,服務(wù)器端的程序是單線程的,不】中,服務(wù)器端的程序是單線程的,不能支持多個(gè)客戶端的并發(fā)訪問。而實(shí)際應(yīng)用中有很多能支持多個(gè)客戶端的并發(fā)訪問。而實(shí)際應(yīng)用中有很多客戶端客戶端/服務(wù)器端服務(wù)器端應(yīng)用程序,其服務(wù)器端需要同時(shí)為應(yīng)用程序,其服務(wù)器端需
58、要同時(shí)為多個(gè)客戶端提供服務(wù),支持多客戶端的并發(fā)訪問。這多個(gè)客戶端提供服務(wù),支持多客戶端的并發(fā)訪問。這種訪問模式的實(shí)現(xiàn)思想是種訪問模式的實(shí)現(xiàn)思想是服務(wù)器端應(yīng)用程序采用多線服務(wù)器端應(yīng)用程序采用多線程機(jī)制程機(jī)制。n其工作過程是:主線程只負(fù)責(zé)監(jiān)聽,一旦有客戶機(jī)其工作過程是:主線程只負(fù)責(zé)監(jiān)聽,一旦有客戶機(jī)發(fā)出連接請求,主線程將創(chuàng)建一個(gè)子線程,由該子線發(fā)出連接請求,主線程將創(chuàng)建一個(gè)子線程,由該子線程負(fù)責(zé)該客戶機(jī)的通信,主線程繼續(xù)監(jiān)聽其他客戶機(jī)程負(fù)責(zé)該客戶機(jī)的通信,主線程繼續(xù)監(jiān)聽其他客戶機(jī)的連接請求。的連接請求。Java網(wǎng)絡(luò)程序設(shè)計(jì)54 解決方案:解決方案:n 將服務(wù)器寫成多線程的,主程序監(jiān)聽一端口,等待客
59、戶接入;同時(shí)構(gòu)造一個(gè)線程類,準(zhǔn)備接管會話。當(dāng)一個(gè)Socket會話產(chǎn)生后,將這個(gè)會話交給線程處理,然后主程序繼續(xù)監(jiān)聽。while (true) accept a connection ; create a thread to deal with the client ; end while Serverclient1client2serverthread2serverthread1Java網(wǎng)絡(luò)程序設(shè)計(jì)55此外此外:服務(wù)器應(yīng)能支持客戶間的通信服務(wù)器應(yīng)能支持客戶間的通信n可以在服務(wù)器端將與各客戶進(jìn)行通信的Socket和線程管理起來,從而各客戶之間可以在服務(wù)器端的協(xié)助下進(jìn)行通信。服務(wù)器服務(wù)器(4444
60、)acceptsocket客客戶戶2IP1 client1線程線程1客客戶戶1IP2 client2線程線程2Java網(wǎng)絡(luò)程序設(shè)計(jì)56【例12.6】多線程的TCP服務(wù)器程序。服務(wù)器端的部分運(yùn)行結(jié)果如圖12.3所示。Java網(wǎng)絡(luò)程序設(shè)計(jì)5712.4 數(shù)據(jù)報(bào)通信數(shù)據(jù)報(bào)通信n用戶數(shù)據(jù)報(bào)協(xié)議用戶數(shù)據(jù)報(bào)協(xié)議UDP是傳輸層的是傳輸層的無連接無連接通信協(xié)議。通信協(xié)議。數(shù)據(jù)報(bào)是一種在網(wǎng)絡(luò)中獨(dú)立傳播的自身包含地址信息數(shù)據(jù)報(bào)是一種在網(wǎng)絡(luò)中獨(dú)立傳播的自身包含地址信息的消息,它能否到達(dá)目的地、到達(dá)的時(shí)間以及到達(dá)時(shí)的消息,它能否到達(dá)目的地、到達(dá)的時(shí)間以及到達(dá)時(shí)內(nèi)容能否保持不變,這些都是不能保證的。由于內(nèi)容能否保持不變,
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年新式建筑材料采購合同:碎石篇
- 噴漆行業(yè)發(fā)展趨勢分析方案
- 我有兩個(gè)作文5篇
- 幼兒園下學(xué)期班主任工作總結(jié)(六篇)
- 昆蟲世界歷險(xiǎn)記讀后感6篇
- 模范集體事跡材料8篇
- 手工電弧焊操作規(guī)程有哪些(16篇)
- 2024至2030年中國彩鋼隔熱夾芯復(fù)合板數(shù)據(jù)監(jiān)測研究報(bào)告
- 2024至2030年中國乳酸芐酯數(shù)據(jù)監(jiān)測研究報(bào)告
- 2024年中國負(fù)載測控器市場調(diào)查研究報(bào)告
- 《中華民族共同體概論》考試復(fù)習(xí)題庫(含答案)
- 種植修復(fù)治療知情同意書
- Module 5 外研版英語九(上)模塊主題寫作詳解與訓(xùn)練
- 第二章攪拌摩擦焊
- 內(nèi)分泌科醫(yī)師培養(yǎng)細(xì)則
- 蛋白質(zhì)與酶工程復(fù)習(xí)題 金
- 五金件通用檢驗(yàn)標(biāo)準(zhǔn)
- kummell 病ppt課件
- 小班綜合活動(dòng)《出生的秘密》
- 習(xí)題參考答案
- 綠化養(yǎng)護(hù)報(bào)價(jià)表(共8頁)
評論
0/150
提交評論