第10章 Java網(wǎng)絡(luò)程序設(shè)計_第1頁
第10章 Java網(wǎng)絡(luò)程序設(shè)計_第2頁
第10章 Java網(wǎng)絡(luò)程序設(shè)計_第3頁
第10章 Java網(wǎng)絡(luò)程序設(shè)計_第4頁
第10章 Java網(wǎng)絡(luò)程序設(shè)計_第5頁
已閱讀5頁,還剩91頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、面向?qū)ο蟪绦蛟O(shè)計Java本章相關(guān)詞匯本章相關(guān)詞匯單 詞說 明Internet Protocol(IP)互聯(lián)網(wǎng)協(xié)議net網(wǎng)絡(luò),網(wǎng)狀物socket套接字,插座server服務(wù)器,服務(wù)端client客戶,客戶端port端口accept接收,認可本章目標本章目標網(wǎng)絡(luò)基礎(chǔ)知識IP地址與端口包 InetAddress Socket ServerSocket擴展IO流的相關(guān)知識計算機網(wǎng)絡(luò)與通信計算機網(wǎng)絡(luò)與通信通信是人類生活中最重要的需求之一;通信是指:對語言、文字、聲音和圖片以及其它任何類型的相關(guān)數(shù)據(jù)進行傳輸;計算機的出現(xiàn)以及網(wǎng)絡(luò)的構(gòu)成,使得數(shù)據(jù)通信更加快速有效。計算機網(wǎng)絡(luò)的基本原理計算機網(wǎng)絡(luò)的基本原理計算

2、機網(wǎng)絡(luò)就是利用通信線路連接起來的、相互獨立的計算機集合。使用網(wǎng)卡、電使用網(wǎng)卡、電纜、集線器等纜、集線器等連接設(shè)備連接連接設(shè)備連接計算機以組成計算機以組成網(wǎng)絡(luò)。網(wǎng)絡(luò)。計算機網(wǎng)絡(luò)的OSI 體系結(jié)構(gòu)體系結(jié)構(gòu) TCP/IPTCP/IP(傳輸控制協(xié)議傳輸控制協(xié)議/ /網(wǎng)間協(xié)議)是網(wǎng)間協(xié)議)是InternetInternet的主要協(xié)議,定義了計算的主要協(xié)議,定義了計算機和外設(shè)進行通信所使用機和外設(shè)進行通信所使用的規(guī)則。的規(guī)則。TCP/IPTCP/IP網(wǎng)絡(luò)參考網(wǎng)絡(luò)參考模型包括模型包括五個五個層次:應(yīng)用層次:應(yīng)用層、傳輸層、網(wǎng)絡(luò)層、鏈層、傳輸層、網(wǎng)絡(luò)層、鏈路層、物理層。路層、物理層。TCP/IP網(wǎng)絡(luò)參考模型網(wǎng)

3、絡(luò)參考模型應(yīng)應(yīng) 用用 層層網(wǎng)網(wǎng) 絡(luò)絡(luò) 層層傳傳 輸輸 層層物理物理+ +數(shù)據(jù)鏈路層數(shù)據(jù)鏈路層TCP/IPTCP/IP參考模型參考模型IP地址地址網(wǎng)絡(luò)中有多臺計算機,它們必須通過某種標識來區(qū)分每一臺機器,這就是IP地址。在網(wǎng)絡(luò)尋找某一臺計算機都是依靠它的IP地址;IP地址由4個0-255之間的數(shù)字組成;如:為了方便使用,人們給每個結(jié)點起了一個名字,把名字與IP地址建立對應(yīng)關(guān)系,這就是域名域名系統(tǒng)DNS,凡域名空間有定義的域名都可以有效地轉(zhuǎn)換成IP地址。查看查看IP地址地址Ipconfig如果是win2000先運行cd C:WINNTsystem32,再運行Ipconfig如

4、果是win xp先運行cd C:WINDOWSsystem32,再運行Ipconfig特殊的特殊的IP地址地址對于本地計算機(就是你正在使用的那臺計算機),有兩種方法標識它: 用主機名標識:localhost 用IP地址標識: 以上兩者是等價的端端 口口一臺計算機上可能同時運行多個網(wǎng)絡(luò)應(yīng)用程序,IP地址只能確保把數(shù)據(jù)送到指定的計算機,但不能保證把這些數(shù)據(jù)傳遞給哪個網(wǎng)絡(luò)程序;為了讓一個計算機可以同時運行多個網(wǎng)絡(luò)程序,就引入了另外一個概念端口(port)。端口使用一個16位的數(shù)字來表示,它的范圍是065535,1024以下的端口號保留給預(yù)定義的服務(wù),如:http使用80端口;網(wǎng)絡(luò)

5、間通信其實是在網(wǎng)絡(luò)應(yīng)用程序端口之間進行的。端端 口口系統(tǒng)端口號列表系統(tǒng)端口號列表URLURL(Uniform Resource Locator)-統(tǒng)一資源定位符,表示Internet上某一資源的地址。簡單地說,URL就是Web地址,俗稱“網(wǎng)址”。 URL組成組成: 協(xié)議名和資源名。protocol:/resourceName協(xié)議名(protocol)指明獲取資源所使用的傳輸協(xié)議,如http、ftp、gopher、file等。資源名(resourceName)則應(yīng)該是資源的完整地址,包括主機名、端口號、文件名或文件內(nèi)部的一個引用。 如:http: / :80/index.htmlURL舉例舉例:

6、http:/ 、URL、Socket、Datagram。 InetAddress面向的是IP層,用于標識網(wǎng)絡(luò)上的硬件資源。 URL這種方法是通過URL的網(wǎng)絡(luò)資源表達式形式確定數(shù)據(jù)在網(wǎng)絡(luò)中的位置,利用URL對象中提供的方法,直接讀入網(wǎng)絡(luò)中的數(shù)據(jù),或者將本地數(shù)據(jù)傳送到網(wǎng)絡(luò)的另一端。Socket是指兩個程序通過網(wǎng)絡(luò)進行通信的一種方式,在TCP/IP協(xié)議下的客戶服務(wù)器軟件通常使用socket來進行信息交流,這種方式也是傳統(tǒng)中常用的一種方式。這種工作方式類似兩個人打電話。Datagram是一種面向非連接的、以數(shù)據(jù)報方式工作的通信,適用于網(wǎng)絡(luò)狀況不穩(wěn)定下的數(shù)據(jù)傳輸和訪問。這種工作方式類似郵局寄郵件。 包包

7、J包中包含多個用于網(wǎng)絡(luò)編程的接口和類,常用的有: InetAddress:該類用來代表一個IP地址。 URL:該類用來代表一個統(tǒng)一資源定位符。 ServerSocket:該類實現(xiàn)服務(wù)器端Socket。 Socket:該類實現(xiàn)客戶端Socket。要進行網(wǎng)絡(luò)通訊編程,必須導(dǎo)入此包。.InetAddress該類的功能是代表一個IP地址,并且將IP地址和域名相關(guān)的操作方法包含在該類的內(nèi)部。 該類無法直接實例化,只能通過下列方法獲得實例:方 法 原 型說 明static InetAddress getByName(String host)throws UnknownHostException返回指定主機

8、的IP地址對象static InetAddress getLocalHost()throws UnknownHostException返回本地主機的IP地址對象String getHostName()返回此 InetAddress 對象的主機名稱網(wǎng)絡(luò)編程的異常處理網(wǎng)絡(luò)編程的異常處理可能產(chǎn)生的異常:可能產(chǎn)生的異常:BindExceptionBindException、ConnectExceptionConnectException、MalformedURLExceptionMalformedURLException、NoRouteToHostExceptionNoRouteToHostExcep

9、tion、ProtocolExceptionProtocolException、SocketExceptionSocketException、UnknownHostExceptionUnknownHostException、UnknownServiceExceptionUnknownServiceExceptionimport .*; /導(dǎo)入包public class InetAddressDemo public static void main(String args) try /獲得本地主機的IP地址 InetAddress add1 = InetAddress.getLocalHost(

10、); System.out.println(當前本地主機: + add1); /通過DNS域名解析,獲得相應(yīng)服務(wù)的主機地址 InetAddress add2 = InetAddress.getByName(); System.out.println(網(wǎng)易服務(wù)器主機: + add2); /根據(jù)字符串表現(xiàn)形式的IP地址獲得相應(yīng)的主機地址(如果網(wǎng)絡(luò)上有該IP地址的話) InetAddress add3 = InetAddress.getByName(2); System.out.println(IP地址為2的主機: + add3); catch (Unkn

11、ownHostException uhe) uhe.printStackTrace(); InetAddressInetAddress示例示例上機練習(xí)上機練習(xí)查看本機的IP地址編程獲取本機的IP地址和本校校園網(wǎng)的IP地址InetAddress的其它方法的其它方法方 法 原 型說 明byte getAddress()返回此 InetAddress 對象的原始 IP 地址String getHostAddress()返回此 InetAddress 對象的IP地址字符串String getHostName()返回此 InetAddress 對象的主機名稱boolean equals(Object o

12、ther)判斷兩個IP地址是否相等String toString()返回此 InetAddress 對象的字符串表現(xiàn)形式(主機名/IP地址)URL類及其構(gòu)造方法類及其構(gòu)造方法要使用URL進行通信,就要使用URL類創(chuàng)建其對象,通過引用URL類定義的方法完成網(wǎng)絡(luò)通信。創(chuàng)建URL類對象要使用包中提供的.URL類的構(gòu)造方法。URL類的構(gòu)造方法類的構(gòu)造方法功能說明功能說明public URL(String str)使用URL字符串創(chuàng)建URL對象public URL(String protocol, String host,String file)通過指定協(xié)議名、主機名、文件名,端口使用默認值,創(chuàng)建URL

13、對象public URL(String protocol, String host, String port,String file)通過指定協(xié)議名、主機名、文件名和端口號,創(chuàng)建URL對象public URL(URL content, String str)通過在已知的URL路徑上增加細節(jié)的辦法創(chuàng)建URL對象URL 類的方法類的方法URL 類類功能說明功能說明int getPort()獲得端口號,如果端口沒有設(shè)置,返回-1String getProtocol()獲得協(xié)議名,如果協(xié)議沒有設(shè)置,返回nullString getHost()獲得主機名,如果主機沒有設(shè)置,返回nullString ge

14、tFile()獲得文件名,如果文件沒有設(shè)置,返回nullBoolean equals(Object obj)與指定的URL對象obj 進行比較,如果相同返回true,否則返回false Final InputStreamOpenStream()獲得一個輸入流,若獲取失敗,則拋出一個java.io.Exception異常String toString()將此URL對象轉(zhuǎn)換為字符串的形式URL程序例一程序例一/URLReader, 獲取網(wǎng)頁并按行打印import .*;import java.io.*;public class Network_1 public static void main(S

15、tring args) throws ExceptionURL hfut = new URL(); /URL數(shù)據(jù)數(shù)據(jù)- InputStreamReader對象對象 - BufferedReader對象對象 - 程序處理程序處理BufferedReader in = new BufferedReader(new InputStreamReader( hfut.openStream() ) );String inputLine;/打印輸出HTMLwhile ( (inputLine = in.readLine() ) != null ) System.out.p

16、rintln(inputLine);/關(guān)閉緩沖區(qū)in.close(); CodeURLConnection類類使用URL類可以很簡單地獲得信息,但如果在獲取到信息的同時還能向遠程的計算機節(jié)點,就需要使用URLConnection類。創(chuàng)建URLConnection類的對象,先創(chuàng)建一個URL對象,然后調(diào)用該對象的openConnection()方法就會返回一個對應(yīng)URL地址的URLConnection對象。/創(chuàng)建URL對象URL url=new URL(“http:/”); /創(chuàng)建鏈接通道URLConnection connect=url.openConnection();內(nèi)容詳見內(nèi)容詳見.URL

17、Connection類類URLConnection類類1建立輸入/輸出流 URLConnection類類不僅可以使用getInputStream()方法獲得URL節(jié)點的信息,還可以采用getOutputStream()方法向URL節(jié)點處傳送信息。在建立URLConnection類對象的同時就已經(jīng)在本級和URL節(jié)點之上建立了一條HTTP通道。HTTP是一個,發(fā)送信息之前要附加確認雙方身份的信息。例: DataInputStream datain=new DataInputStream(connect.getInputStream();URL程序例二程序例二Code/URLConnectionRe

18、ader/使用使用.URLConnection連接到互連網(wǎng),獲取網(wǎng)頁并按行打印連接到互連網(wǎng),獲取網(wǎng)頁并按行打印import .*;import java.io.*;public class Network_2 public static void main(String args) throws Exception /URL對象對象- URLConnection對象對象 - InputStreamReader -BufferedReader URL hfut = new URL(http:/ URLConnection uc = hfut.openConnection(); BufferedR

19、eader in = new BufferedReader( new InputStreamReader( uc.getInputStream() ); String inputLine; while (inputLine = in.readLine() != null) System.out.println(inputLine); in.close(); 網(wǎng)絡(luò)通訊的過程網(wǎng)絡(luò)通訊的過程網(wǎng)絡(luò)通訊基于“請求-響應(yīng)”模型。為了理解這個模型,先來看一個審訊的場面警察:姓名 嫌疑犯:XXX 警察:性別 嫌疑犯:男 警察:年齡 嫌疑犯:29 在這個例子中,警察問一句,嫌疑犯回答一句,如果警察不問,則嫌疑犯

20、保持沉默。這種一問一答的形式就是網(wǎng)絡(luò)中的“請求-響應(yīng)”模型。也就是通訊的一端發(fā)送數(shù)據(jù),另外一端反饋數(shù)據(jù),網(wǎng)絡(luò)通訊都基于該模型??蛻舳丝蛻舳?服務(wù)器服務(wù)器(C/S)模式模式在網(wǎng)絡(luò)通訊中,第一次主動發(fā)起通訊的程序被稱作客戶端(Client)程序,簡稱客戶端,而在第一次通訊中等待連接的程序被稱作服務(wù)器端(Server)程序,簡稱服務(wù)器??蛻舳?服務(wù)器的優(yōu)勢在于:服務(wù)器和客戶端分攤?cè)蝿?wù),分別負責部分處理工作;服務(wù)器可以同時為多臺客戶端服務(wù);多個客戶端可以同時訪問服務(wù)器上的相同數(shù)據(jù)。服務(wù)器端網(wǎng)絡(luò)編程步驟 監(jiān)聽端口監(jiān)聽端口 服務(wù)器端屬于被動等待連接,所以服務(wù)器端啟動以后,不需要發(fā)起連接,而只需要監(jiān)聽本地計

21、算機的某個固定端口即可。 這個端口就是服務(wù)器端開放給客戶端的端口。 獲得連接獲得連接當客戶端連接到服務(wù)器端時,服務(wù)器端就可以獲得一個連接,這個連接包含客戶端的信息,如客戶端IP地址等,服務(wù)器端和客戶端也通過該連接進行數(shù)據(jù)交換。一般在服務(wù)器端編程中,當獲得連接時,需要開啟專門的線程處理該連接,每個連接都由獨立的線程實現(xiàn)。 交換數(shù)據(jù)交換數(shù)據(jù) 服務(wù)器端接收客戶端發(fā)送過來的數(shù)據(jù),然后進行邏輯處理,再把處理以后的結(jié)果數(shù)據(jù)發(fā)送給客戶端。簡單來說,就是先接收再發(fā)送。 關(guān)閉連接關(guān)閉連接 當服務(wù)器程序關(guān)閉時,需要關(guān)閉服務(wù)器端,通過關(guān)閉服務(wù)器端使得服務(wù)器監(jiān)聽的端口以及占用的內(nèi)存可以釋放出來,實現(xiàn)了連接的關(guān)閉。客戶

22、端網(wǎng)絡(luò)編程步驟 建立網(wǎng)絡(luò)連接建立網(wǎng)絡(luò)連接 在建立網(wǎng)絡(luò)連接時需要指定連接到的服務(wù)器的IP地址和端口號,建立完成以后,會形成一條虛擬的連接,后續(xù)的操作就可以通過該連接實現(xiàn)數(shù)據(jù)交換了。 交換數(shù)據(jù)交換數(shù)據(jù) 交換數(shù)據(jù)嚴格按照請求響應(yīng)模型進行,由客戶端發(fā)送一個請求數(shù)據(jù)到服務(wù)器,服務(wù)器反饋一個響應(yīng)數(shù)據(jù)給客戶端,如果客戶端不發(fā)送請求則服務(wù)器端就不響應(yīng)。 根據(jù)邏輯需要,可以多次交換數(shù)據(jù),但是還是必須遵循請求響應(yīng)模型。 關(guān)閉網(wǎng)絡(luò)連接關(guān)閉網(wǎng)絡(luò)連接 在數(shù)據(jù)交換完成以后,關(guān)閉網(wǎng)絡(luò)連接,釋放程序占用的端口、內(nèi)存等系統(tǒng)資源。套接字套接字socket網(wǎng)絡(luò)上計算機通過TCP/IP協(xié)議進行通信,而套接字(socket)則將這些通

23、信協(xié)議進行了封裝;TCP/IP套接字用于在主機和Internet之間建立可靠的、雙向的、持續(xù)的、點對點的流式連接;socket用于描述用于描述IP地址和端口地址和端口,應(yīng)用程序通過套接字向,應(yīng)用程序通過套接字向網(wǎng)絡(luò)發(fā)出請求或者應(yīng)答網(wǎng)絡(luò)請求;網(wǎng)絡(luò)發(fā)出請求或者應(yīng)答網(wǎng)絡(luò)請求;客戶端和服務(wù)器通過套接字建立連接和通信。Socket是是TCP/IP協(xié)議中的協(xié)議中的傳輸層傳輸層接口,是建立在穩(wěn)定連接口,是建立在穩(wěn)定連接基礎(chǔ)上的以流傳輸數(shù)據(jù)的通信方式。它是目前實現(xiàn)客接基礎(chǔ)上的以流傳輸數(shù)據(jù)的通信方式。它是目前實現(xiàn)客戶戶/服務(wù)器服務(wù)器(Client/Server)模式應(yīng)用程序的主要手段。模式應(yīng)用程序的主要手段。S

24、ocket通信機制通信機制Socket通信機制提供了兩種通信方式:有連接方式(TCP)和無連接方式(UDP數(shù)據(jù)報)。有連接方式中,通信雙方在開始時必須進行一次連接過程,建立一條通信鏈路。通信鏈路提供了可靠的、雙向的字節(jié)流服務(wù)。無連接方式中,通信雙方不存在一個連接過程,一次網(wǎng)絡(luò)I/O以一個數(shù)據(jù)報形式進行,而且每次網(wǎng)絡(luò)I/O可以和不同主機的不同進程進行。無連接方式開銷小于有連接方式,但是所提供的數(shù)據(jù)傳輸服務(wù)不可靠,不能保證數(shù)據(jù)報一定到達目的地。Java語言同時支持有連接和數(shù)據(jù)報通信方式,在這兩種方式中都采用了Socket表示通信過程中的端點。主機甲主機甲套接字通信原理套接字通信原理A程序程序主機乙

25、主機乙B程序程序TCP/IP協(xié)議協(xié)議網(wǎng)網(wǎng) 卡卡網(wǎng)絡(luò)管理軟件網(wǎng)絡(luò)管理軟件socketsocket主機甲上的主機甲上的A程程序?qū)⒁欢螖?shù)據(jù)寫序?qū)⒁欢螖?shù)據(jù)寫入入socket中中 主機乙上的主機乙上的B程程序從序從socket中讀中讀取這段數(shù)據(jù)取這段數(shù)據(jù) Socket通信過程通信過程Server端創(chuàng)建ServerSocket對象監(jiān)聽某端口接受Client端的請求,用accept()返回的Socket建立連接關(guān)閉Socket,結(jié)束與當前Client的通信,等待其它請求關(guān)閉ServerSocket對象,結(jié)束監(jiān)聽服務(wù)Client端創(chuàng)建Socket對象,向Server的監(jiān)聽服務(wù)發(fā)送連接請求建立連接數(shù)據(jù)通信通過向

26、Socket讀寫數(shù)據(jù)完成與Client端通信通過向Socket讀寫數(shù)據(jù)完成與Server端通信關(guān)閉Socket,結(jié)束Server端的通信拆分連接在Java語言中,對于TCP方式的網(wǎng)絡(luò)編程提供了良好的支持,在實際實現(xiàn)時,以.Socket類代表客戶端連接,以.ServerSocket類代表服務(wù)器端連接。.SocketSocket類用于創(chuàng)建套接字對象,其構(gòu)造方法共有9種重載,常用的有如下幾種:套接字會因為網(wǎng)絡(luò)的連接中斷而失效,所以對它的操作都有可能拋出IOException。構(gòu) 造 方 法說 明Socket(InetAddress address, int port) throws IOExcept

27、ion用預(yù)先存在的InetAddress對象和端口創(chuàng)建一個與本地主機連接的套接字Socket(String hostName, int port)throws UnknownHostException, IOException創(chuàng)建一個本地主機與給定名稱的主機和端口連接的套接字Socket與與I/O流流Java是通過使用流模式來實現(xiàn)網(wǎng)絡(luò)信息交互的,這種模式下,一個接口同時擁有兩個流輸入流和輸出流。Socket的常用方法的常用方法一旦Socket對象被成功創(chuàng)建,就可以獲得訪問與之相關(guān)的輸入/輸出流的權(quán)力,通過流操作從套接字中發(fā)送(輸出)和接收(輸入)數(shù)據(jù):方 法 原 型說 明InputStream

28、 getInputStream()throws IOException獲得當前套接字的輸入流OutputStream getOutputStream()throws IOException獲得當前套接字的輸出流void close()throws IOException關(guān)閉當前套接字Socket的其它方法的其它方法使用下面的方法,可以在任何時候檢查套接字的地址和與之相關(guān)的端口信息方 法 原 型說 明InetAddress getInetAddress()返回與當前套接字連接的遠程主機的InetAddress對象,如未連接,則返回nullInt getPort()返回與當前套接字連接的遠程主機端

29、口InetAddress getLocalAddress()返回與當前套接字綁定的本地主機的InetAddress對象int getLocalPort()返回與當前套接字綁定的本地主機端口.ServerSocketServerSocket類用來創(chuàng)建服務(wù)器套接字,它監(jiān)聽本地或遠程客戶程序通過公共端口的連接;ServerSocket類有4個重載的構(gòu)造方法,以下是常用的:ServerSocket的常用方法如下:構(gòu) 造 方 法說 明ServerSocket(int port)throws IOException創(chuàng)建服務(wù)套接字,它負責偵聽由port指定的端口。方 法 原 型說 明Socket accep

30、t()throws IOException等待并偵聽來自客戶端的請求,一旦接收到,返回一個與客戶進行通信的Socketvoid close()throws IOException關(guān)閉當前服務(wù)器套接字Socket編程編程編寫服務(wù)器端程序創(chuàng)建服務(wù)器套接字(ServerSocket),綁定到指定端口;調(diào)用accept方法,偵聽來自客戶端的請求,如果客戶發(fā)出請求,則接受連接,返回通信套接字(Socket);調(diào)用Socket的getInputStream和getOutputStream方法,獲得輸入/輸出流,開始網(wǎng)絡(luò)數(shù)據(jù)的接收和發(fā)送;關(guān)閉通信套接字,關(guān)閉服務(wù)器套接字。編寫客戶端程序創(chuàng)建套接字(Socke

31、t) ,向服務(wù)器的偵聽端口發(fā)出請求;與服務(wù)器正確連接后,調(diào)用Socket的getInputStream和getOutputStream方法,獲得輸入/輸出流,開始網(wǎng)絡(luò)數(shù)據(jù)的接收和發(fā)送;關(guān)閉通信套接字。ClientServerSocket編程示意圖編程示意圖ServerSocket(int port)InputStream getInputStream()OutputStream getOutputStream()close()close()InputStream getInputStream()OutputStream getOutputStream()Socket(InetAddress a

32、ddress, int port)Socket accept()ServerSocket 類類l 在在 Server Server 端創(chuàng)建一個監(jiān)聽服務(wù)端創(chuàng)建一個監(jiān)聽服務(wù) ServerSocketServerSocket myServermyServer=new ServerSocket(=new ServerSocket(50005000););l 調(diào)用調(diào)用監(jiān)聽服務(wù)的監(jiān)聽服務(wù)的accept( )accept( )方法在方法在 Server Server 端創(chuàng)建一個端創(chuàng)建一個SocketSocket對象隨時監(jiān)聽可能的對象隨時監(jiān)聽可能的 ClientClient端請求端請求 Socket Sock

33、et linkSocketlinkSocket= =myServer.acceptmyServer.accept( );( );l 在在 Server Server 與與 Client Client 之間建立一個連接來傳遞數(shù)據(jù)之間建立一個連接來傳遞數(shù)據(jù) OutputStreamOutputStream SocketOsSocketOs= = linkSocket.getOutputStreamlinkSocket.getOutputStream( ); ( ); /用于寫數(shù)據(jù)用于寫數(shù)據(jù) InputStreamInputStream SocketIsSocketIs= = linkSocket.

34、getInputStreamlinkSocket.getInputStream( ); ( ); /用于讀數(shù)據(jù)用于讀數(shù)據(jù)l 調(diào)用監(jiān)聽服務(wù)的調(diào)用監(jiān)聽服務(wù)的close( ) close( ) 方法結(jié)束監(jiān)聽服務(wù)方法結(jié)束監(jiān)聽服務(wù) myServer.closemyServer.close( );( ); Socket 類類p創(chuàng)建一個創(chuàng)建一個 Socket Socket 對象,向服務(wù)器發(fā)出請求。對象,向服務(wù)器發(fā)出請求。 Socket myClient=new Socket(“Server 主機名”,端口號);p在在 Server Server 與與 Client Client 之間建立一個連接來傳遞數(shù)據(jù)。

35、之間建立一個連接來傳遞數(shù)據(jù)。 OutputStreamOutputStream SocketOsSocketOs= = myClient.getOutputStreammyClient.getOutputStream( );/( );/用于寫數(shù)據(jù)用于寫數(shù)據(jù) InputStreamInputStream SocketIsSocketIs= = myClient.getInputStreammyClient.getInputStream( );/( );/用于讀數(shù)據(jù)用于讀數(shù)據(jù)p通信結(jié)束時,關(guān)閉連接。通信結(jié)束時,關(guān)閉連接。 myClient.closemyClient.close( );( );pu

36、blic class Server private static final int SERVER_PORT = 9001; /指定偵聽端口 public Server() try ServerSocket ss = new ServerSocket(SERVER_PORT); /創(chuàng)建服務(wù)器套接字 System.out.println(服務(wù)端已啟動,正在等待客戶端服務(wù)端已啟動,正在等待客戶端.); Socket s = ss.accept(); /偵聽來自客戶端的請求 InputStream in = s.getInputStream(); /獲得輸入流,以接收數(shù)據(jù) OutputStream

37、out = s.getOutputStream(); /獲得輸出流以發(fā)送數(shù)據(jù) byte buf = new byte1024; int len = in.read(buf); /從輸入流中讀取數(shù)據(jù) String strFromClient = new String(buf, 0, len); System.out.print(來自客戶端的信息來自客戶端的信息); System.out.println(strFromClient); String strToClient = “你好!你好!; out.write(strToClient.getBytes(); /往輸出流中發(fā)送數(shù)據(jù) in.clos

38、e(); out.close(); /關(guān)閉輸入流和輸出流 s.close(); ss.close(); /關(guān)閉通信套接字和服務(wù)器套接字 System.out.println(服務(wù)端已關(guān)閉。服務(wù)端已關(guān)閉。); catch (IOException ioe) ioe.printStackTrace(); public static void main(String args) new Server(); 示例(服務(wù)端)示例(服務(wù)端)public class Client private static final int SERVER_PORT = 9001; /服務(wù)器的偵聽端口 public Cl

39、ient() try /由于服務(wù)端也是運行在本機,所以創(chuàng)建本機的InetAddress對象 InetAddress address = InetAddress.getByName(localhost); Socket s = new Socket(address, SERVER_PORT); /向服務(wù)器偵聽端口發(fā)出請求 System.out.println(客戶端已啟動??蛻舳艘褑?。); InputStream in = s.getInputStream(); /獲得輸入流,用來接收數(shù)據(jù) OutputStream out = s.getOutputStream(); /獲得輸出流,用來發(fā)送數(shù)

40、據(jù) String strToServer = “Hello; out.write(strToServer.getBytes(); /往輸出流中發(fā)送數(shù)據(jù) byte buf = new byte1024; int len = in.read(buf); /從輸入流中讀取數(shù)據(jù) String strFromServer = new String(buf, 0, len); System.out.print(來自服務(wù)端的回答來自服務(wù)端的回答); System.out.println(strFromServer); in.close();out.close(); /關(guān)閉輸入流和輸出流 s.close();

41、 /關(guān)閉通信套接字 System.out.println(客戶端已關(guān)閉??蛻舳艘殃P(guān)閉。); catch (UnknownHostException nhe) System.out.println(未找到指定主機未找到指定主機.); catch (IOException ioe) ioe.printStackTrace(); public static void main(String args) new Client(); 示例(客戶端)示例(客戶端)作業(yè)作業(yè)編寫聊天程序客戶端程序客戶端程序import java.awt.event.*;import java.io.*;import .*;p

42、ublic class ClientGUI implements ActionListener SocketGUI clientframe;Socket socket;InputStream in;OutputStream out;final int serverPort=5002;public ClientGUI() clientframe = new SocketGUI(客戶端客戶端);try socket = new Socket(Localhost,serverPort);in=socket.getInputStream();out=socket.getOutputStream();b

43、yte buf=new byte1024;clientframe.tf.addActionListener(this);while(true) int len=in.read(buf); clientframe.ta.append(服務(wù)器端說:服務(wù)器端說:+new String(buf,0,len)+n); catch (Exception e) e.printStackTrace();finallytry socket.close(); catch (IOException e) e.printStackTrace();接收服務(wù)器端發(fā)來的信息public void actionPerform

44、ed(ActionEvent arg0) clientframe.ta.append(我說:我說:+clientframe.tf.getText()+n);try out.write(clientframe.tf.getText().getBytes(); catch (IOException e) e.printStackTrace();向服務(wù)器端發(fā)送信息主方法主方法public static void main(String args) new ClientGUI();文件傳送文件傳送Java是通過使用流模式來實現(xiàn)網(wǎng)絡(luò)信息交互的,這種模式下,一個接口同時擁有兩個流輸入流和輸出流??蛻舳嗽次?/p>

45、件服務(wù)器目的文件復(fù)制文件示例復(fù)制文件示例import java.io.*;class CopyFileDemo public static void main(String args) throws IOException File srcFile = new File(src.dat); /源文件對象 File destFile = new File(dest.dat); /目標文件對象 /使用源文件對象創(chuàng)建文件輸入流對象 FileInputStream fis = new FileInputStream(srcFile); /使用目標文件對象創(chuàng)建文件輸出流對象 FileOutputStre

46、am fos = new FileOutputStream(destFile); byte buf = new byte1024; /創(chuàng)建字節(jié)數(shù)組,作為臨時緩沖 System.out.println(開始復(fù)制文件開始復(fù)制文件.); int i; while (i=fis.read(buf)!= -1) /循環(huán)從文件輸入流中讀取數(shù)據(jù) fos.write(buf,0,i); /寫入到文件輸出流中 System.out.println(文件復(fù)制成功!文件復(fù)制成功!); fis.close(); /關(guān)閉流 fos.close(); 關(guān)于關(guān)于IO流流計算機系統(tǒng)將除了CPU和內(nèi)存以外其它所有設(shè)備都當成文件

47、來處理,包括網(wǎng)絡(luò)終端(網(wǎng)卡)也不例外;在兩臺主機之間通過socket建立握手連接之后,主要是通過輸入/輸出流來接收和發(fā)送數(shù)據(jù),實際上,對于網(wǎng)絡(luò)的操作,絕大部分是在操作IO流;實際上操作網(wǎng)絡(luò)端口流與操作磁盤文件流的原理是相似的;出于效率的考慮,scoket使用的是字節(jié)流,但是在實際操作中,字節(jié)往往會帶來不便,所以我們一般會把字節(jié)流改造成字符流后進行操作。輸入輸入對于InputStream,先使用InputStreamReader轉(zhuǎn)化成字符流;然后再使用BufferedReader建立緩沖,以提高效率,如:InputStream is = socket.getInputStream();Input

48、StreamReader isr = new InputStreamReader(is);BufferedReader in = new BufferedReader(isr);import java.io.*;import java.awt.*;import java.awt.event.*;import .*;public class chatServer extends Frame implements ActionListener Label label=new Label(聊天聊天); Panel panel=new Panel( ); TextField tf=new TextFi

49、eld(10);/用來輸入要說的話用來輸入要說的話 TextArea ta=new TextArea( );/用來顯示聊天過程用來顯示聊天過程服務(wù)器端:服務(wù)器端:基于基于Socket 的的聊天聊天程序程序 ServerSocket server; Socket client; InputStream in; OutputStream out; public chatServer( )/構(gòu)造方法構(gòu)造方法 super(服務(wù)器服務(wù)器); setSize(250,250); panel.add(label); panel.add(tf); tf.addActionListener(this); add

50、(North,panel); add(Center,ta);addWindowListener(new WindowAdapter( ) public void windowCloseing(WindowEvent e) System.exit(0); ); show( ); try server=new ServerSocket(5000); client=server.accept( ); ta.append(已連接的客戶機已連接的客戶機: +client.getInetAddress( ).getHostName( )+nn); in=client.getInputStream( );

51、out=client.getOutputStream( ); catch(IOException ioe) while(true)/接受客戶端說的話接受客戶端說的話 try byte buf=new byte256; in.read(buf); String str=new String(buf); ta.append(客戶機說:客戶機說:+str); ta.append(n); catch(IOException ioe) public void actionPerformed(ActionEvent e) try String str=tf.getText( ); byte buf=str

52、.getBytes( ); tf.setText(null); out.write(buf);/發(fā)送服務(wù)器說的話發(fā)送服務(wù)器說的話 ta.append(我說:我說:+str); ta.append(n); catch(IOException ioe) public static void main(String args ) new chatServer( ); import java.io.*;import java.awt.*;import java.awt.event.*;import .*;public class chatClient extends Frame implements

53、ActionListener Label label=new Label(聊天聊天); Panel panel=new Panel( ); TextField tf=new TextField(10); TextArea ta=new TextArea( ); Socket client; InputStream in; OutputStream out;客戶端:客戶端:基于基于Socket 的的聊天聊天程序程序 public chatClient( )/構(gòu)造方法構(gòu)造方法 super(客戶機客戶機); setSize(250,250); panel.add(label); panel.add(

54、tf); tf.addActionListener(this); add(North,panel); add(Center,ta); addWindowListener(new WindowAdapter( ) public void windowClosing(WindowEvent e) System.exit(0); ); show( ); try client= new Socket(InetAddress.getLocalHost( ),5000); ta.append(已連接到服務(wù)器已連接到服務(wù)器:+ client.getInetAddress( ).getHostName( )+

55、nn); in=client.getInputStream( ); out=client.getOutputStream( ); catch(IOException ioe) while(true)/接受服務(wù)器端說的話接受服務(wù)器端說的話 try byte buf=new byte256; in.read(buf); String str=new String(buf); ta.append(服務(wù)器說服務(wù)器說:+str); ta.append(n); catch(IOException e) public void actionPerformed(ActionEvent e) try Strin

56、g str=tf.getText( ); byte buf=str.getBytes( ); tf.setText(null); out.write(buf); ta.append(我說我說:+str); ta.append(n); catch(IOException ioe) public static void main(String args ) new chatClient( ); 6.多線程的多線程的TCP服務(wù)器服務(wù)器在典型的服務(wù)器中,我們希望同時能處理多個客戶的請求。解決這個問題的關(guān)鍵就是多線程處理機制最基本的方法是:在服務(wù)器(程序)里創(chuàng)建單個ServerSocket,并調(diào)用acc

57、ept()來等候一個新連接。一旦有連接請求到來,便將取得的socket對象傳遞給線程對象,在線程中執(zhí)行服務(wù)代碼。然后再調(diào)用accept(),等候下一次新的連接請求??蛻舳顺绦蚴褂镁€程模擬多個客戶向服務(wù)器請求連接服務(wù)。 在一臺計算機上一次啟動多個服務(wù)器程序,只要端口號在一臺計算機上一次啟動多個服務(wù)器程序,只要端口號不同。不同。myserver1 myclient1myserver1 myclient1myserver2myclient2myserver2myclient2Server1(1111)client(2222)Server2(2222)client(1111) Server解決方案一:

58、 解決方案二:解決方案二: 將服務(wù)器寫成多線程的,主程序監(jiān)聽一端口,等待客戶接入;同時構(gòu)造一個線程類,準備接管會話。當一個Socket會話產(chǎn)生后,將這個會話交給線程處理,然后主程序繼續(xù)監(jiān)聽。while (true) accept a connection ; create a thread to deal with the client ; end while Serverclient1client2serverthread2serverthread1此外此外:服務(wù)器應(yīng)能支持客戶間的通信服務(wù)器應(yīng)能支持客戶間的通信可以在服務(wù)器端將與各客戶進行通信的Socket和線程管理起來,從而各客戶之間可以在

59、服務(wù)器端的協(xié)助下進行通信。服務(wù)器服務(wù)器(4444)acceptsocket客客戶戶2IP1 client1線程線程1客客戶戶1IP2 client2線程線程2【例12.6】多線程的TCP服務(wù)器程序。服務(wù)器端的部分運行結(jié)果如圖12.3所示。總結(jié)總結(jié)網(wǎng)絡(luò)的發(fā)展促使計算機之間的通信日趨重要;網(wǎng)絡(luò)上的計算機通過IP地址來區(qū)分不同的機器,端口是數(shù)據(jù)的通道,使得多個應(yīng)用程序在同一主機上進行網(wǎng)絡(luò)通信;InetAddress用來描述主機地址;Socket用來創(chuàng)建兩臺主機之間的連接;ServerSocket用來偵聽來自客戶端的請求;我們實際上是通過操作IO流來進行數(shù)據(jù)的收發(fā)工作,將字節(jié)流改造成字符流會使操作更加

60、方便。Java Web應(yīng)用開發(fā)應(yīng)用開發(fā) 第四章第四章本章相關(guān)詞匯本章相關(guān)詞匯單 詞說 明protocol協(xié)議HyperText TransferProtocol(HTTP)超文本傳輸協(xié)議content內(nèi)容split劈開,分離本章目標本章目標使用Socket發(fā)送文本文件以及超文本文件了解HTTP協(xié)議了解客戶端瀏覽器的基本運行原理了解Web服務(wù)器的基本運行原理使用使用Socket發(fā)送文件內(nèi)容發(fā)送文件內(nèi)容在前面的章節(jié)中,我們已經(jīng)基本了解如何使用套接字進行網(wǎng)絡(luò)通信;我們甚至使用Socket實現(xiàn)了簡單的對話聊天功能;那么,我們是不是也可以利用Socket來實現(xiàn)發(fā)送文件的功能呢?案例案例1(服務(wù)端)(服務(wù)

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論