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

下載本文檔

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

文檔簡(jiǎn)介

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

2、機(jī)網(wǎng)絡(luò)就是利用通信線路連接起來(lái)的、相互獨(dú)立的計(jì)算機(jī)集合。使用網(wǎng)卡、電使用網(wǎng)卡、電纜、集線器等纜、集線器等連接設(shè)備連接連接設(shè)備連接計(jì)算機(jī)以組成計(jì)算機(jī)以組成網(wǎng)絡(luò)。網(wǎng)絡(luò)。計(jì)算機(jī)網(wǎng)絡(luò)的OSI 體系結(jié)構(gòu)體系結(jié)構(gòu) TCP/IPTCP/IP(傳輸控制協(xié)議傳輸控制協(xié)議/ /網(wǎng)間協(xié)議)是網(wǎng)間協(xié)議)是InternetInternet的主要協(xié)議,定義了計(jì)算的主要協(xié)議,定義了計(jì)算機(jī)和外設(shè)進(jìn)行通信所使用機(jī)和外設(shè)進(jìn)行通信所使用的規(guī)則。的規(guī)則。TCP/IPTCP/IP網(wǎng)絡(luò)參考網(wǎng)絡(luò)參考模型包括模型包括五個(gè)五個(gè)層次:應(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ò)中有多臺(tái)計(jì)算機(jī),它們必須通過(guò)某種標(biāo)識(shí)來(lái)區(qū)分每一臺(tái)機(jī)器,這就是IP地址。在網(wǎng)絡(luò)尋找某一臺(tái)計(jì)算機(jī)都是依靠它的IP地址;IP地址由4個(gè)0-255之間的數(shù)字組成;如:為了方便使用,人們給每個(gè)結(jié)點(diǎn)起了一個(gè)名字,把名字與IP地址建立對(duì)應(yīng)關(guān)系,這就是域名域名系統(tǒng)DNS,凡域名空間有定義的域名都可以有效地轉(zhuǎn)換成IP地址。查看查看IP地址地址Ipconfig如果是win2000先運(yùn)行cd C:WINNTsystem32,再運(yùn)行Ipconfig如

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

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

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

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

8、的IP地址對(duì)象static InetAddress getLocalHost()throws UnknownHostException返回本地主機(jī)的IP地址對(duì)象String getHostName()返回此 InetAddress 對(duì)象的主機(jī)名稱網(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 /獲得本地主機(jī)的IP地址 InetAddress add1 = InetAddress.getLocalHost(

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

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

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

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

14、tFile()獲得文件名,如果文件沒(méi)有設(shè)置,返回nullBoolean equals(Object obj)與指定的URL對(duì)象obj 進(jìn)行比較,如果相同返回true,否則返回false Final InputStreamOpenStream()獲得一個(gè)輸入流,若獲取失敗,則拋出一個(gè)java.io.Exception異常String toString()將此URL對(duì)象轉(zhuǎn)換為字符串的形式URL程序例一程序例一/URLReader, 獲取網(wǎng)頁(yè)并按行打印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對(duì)象對(duì)象 - BufferedReader對(duì)象對(duì)象 - 程序處理程序處理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ǎn)單地獲得信息,但如果在獲取到信息的同時(shí)還能向遠(yuǎn)程的計(jì)算機(jī)節(jié)點(diǎn),就需要使用URLConnection類。創(chuàng)建URLConnection類的對(duì)象,先創(chuàng)建一個(gè)URL對(duì)象,然后調(diào)用該對(duì)象的openConnection()方法就會(huì)返回一個(gè)對(duì)應(yīng)URL地址的URLConnection對(duì)象。/創(chuàng)建URL對(duì)象URL url=new URL(“http:/”); /創(chuàng)建鏈接通道URLConnection connect=url.openConnection();內(nèi)容詳見(jiàn)內(nèi)容詳見(jiàn).URL

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

18、ader/使用使用.URLConnection連接到互連網(wǎng),獲取網(wǎng)頁(yè)并按行打印連接到互連網(wǎng),獲取網(wǎng)頁(yè)并按行打印import .*;import java.io.*;public class Network_2 public static void main(String args) throws Exception /URL對(duì)象對(duì)象- URLConnection對(duì)象對(duì)象 - 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ò)通訊的過(guò)程網(wǎng)絡(luò)通訊的過(guò)程網(wǎng)絡(luò)通訊基于“請(qǐng)求-響應(yīng)”模型。為了理解這個(gè)模型,先來(lái)看一個(gè)審訊的場(chǎng)面警察:姓名 嫌疑犯:XXX 警察:性別 嫌疑犯:男 警察:年齡 嫌疑犯:29 在這個(gè)例子中,警察問(wèn)一句,嫌疑犯回答一句,如果警察不問(wèn),則嫌疑犯

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

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

22、端網(wǎng)絡(luò)編程步驟 建立網(wǎng)絡(luò)連接建立網(wǎng)絡(luò)連接 在建立網(wǎng)絡(luò)連接時(shí)需要指定連接到的服務(wù)器的IP地址和端口號(hào),建立完成以后,會(huì)形成一條虛擬的連接,后續(xù)的操作就可以通過(guò)該連接實(shí)現(xiàn)數(shù)據(jù)交換了。 交換數(shù)據(jù)交換數(shù)據(jù) 交換數(shù)據(jù)嚴(yán)格按照請(qǐng)求響應(yīng)模型進(jìn)行,由客戶端發(fā)送一個(gè)請(qǐng)求數(shù)據(jù)到服務(wù)器,服務(wù)器反饋一個(gè)響應(yīng)數(shù)據(jù)給客戶端,如果客戶端不發(fā)送請(qǐng)求則服務(wù)器端就不響應(yīng)。 根據(jù)邏輯需要,可以多次交換數(shù)據(jù),但是還是必須遵循請(qǐng)求響應(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ò)上計(jì)算機(jī)通過(guò)TCP/IP協(xié)議進(jìn)行通信,而套接字(socket)則將這些通

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

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

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

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

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

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

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

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

31、t) ,向服務(wù)器的偵聽(tīng)端口發(fā)出請(qǐng)求;與服務(wù)器正確連接后,調(diào)用Socket的getInputStream和getOutputStream方法,獲得輸入/輸出流,開(kāi)始網(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)建一個(gè)監(jiān)聽(tīng)服務(wù)端創(chuàng)建一個(gè)監(jiān)聽(tīng)服務(wù) ServerSocketServerSocket myServermyServer=new ServerSocket(=new ServerSocket(50005000););l 調(diào)用調(diào)用監(jiān)聽(tīng)服務(wù)的監(jiān)聽(tīng)服務(wù)的accept( )accept( )方法在方法在 Server Server 端創(chuàng)建一個(gè)端創(chuàng)建一個(gè)SocketSocket對(duì)象隨時(shí)監(jiān)聽(tīng)可能的對(duì)象隨時(shí)監(jiān)聽(tīng)可能的 ClientClient端請(qǐng)求端請(qǐng)求 Socket Sock

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

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

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

36、blic class Server private static final int SERVER_PORT = 9001; /指定偵聽(tīng)端口 public Server() try ServerSocket ss = new ServerSocket(SERVER_PORT); /創(chuàng)建服務(wù)器套接字 System.out.println(服務(wù)端已啟動(dòng),正在等待客戶端服務(wù)端已啟動(dòng),正在等待客戶端.); Socket s = ss.accept(); /偵聽(tīng)來(lái)自客戶端的請(qǐng)求 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(來(lái)自客戶端的信息來(lái)自客戶端的信息); 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ù)器的偵聽(tīng)端口 public Cl

39、ient() try /由于服務(wù)端也是運(yùn)行在本機(jī),所以創(chuàng)建本機(jī)的InetAddress對(duì)象 InetAddress address = InetAddress.getByName(localhost); Socket s = new Socket(address, SERVER_PORT); /向服務(wù)器偵聽(tīng)端口發(fā)出請(qǐng)求 System.out.println(客戶端已啟動(dòng)??蛻舳艘褑?dòng)。); InputStream in = s.getInputStream(); /獲得輸入流,用來(lái)接收數(shù)據(jù) OutputStream out = s.getOutputStream(); /獲得輸出流,用來(lái)發(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(來(lái)自服務(wù)端的回答來(lái)自服務(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(未找到指定主機(jī)未找到指定主機(jī).); catch (IOException ioe) ioe.printStackTrace(); public static void main(String args) new Client(); 示例(客戶端)示例(客戶端)作業(yè)作業(yè)編寫(xiě)聊天程序客戶端程序客戶端程序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ù)器端說(shuō):服務(wù)器端說(shuō):+new String(buf,0,len)+n); catch (Exception e) e.printStackTrace();finallytry socket.close(); catch (IOException e) e.printStackTrace();接收服務(wù)器端發(fā)來(lái)的信息public void actionPerform

44、ed(ActionEvent arg0) clientframe.ta.append(我說(shuō):我說(shuō):+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是通過(guò)使用流模式來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)信息交互的,這種模式下,一個(gè)接口同時(shí)擁有兩個(gè)流輸入流和輸出流??蛻舳嗽次?/p>

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

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

47、來(lái)處理,包括網(wǎng)絡(luò)終端(網(wǎng)卡)也不例外;在兩臺(tái)主機(jī)之間通過(guò)socket建立握手連接之后,主要是通過(guò)輸入/輸出流來(lái)接收和發(fā)送數(shù)據(jù),實(shí)際上,對(duì)于網(wǎng)絡(luò)的操作,絕大部分是在操作IO流;實(shí)際上操作網(wǎng)絡(luò)端口流與操作磁盤(pán)文件流的原理是相似的;出于效率的考慮,scoket使用的是字節(jié)流,但是在實(shí)際操作中,字節(jié)往往會(huì)帶來(lái)不便,所以我們一般會(huì)把字節(jié)流改造成字符流后進(jìn)行操作。輸入輸入對(duì)于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);/用來(lái)輸入要說(shuō)的話用來(lái)輸入要說(shuō)的話 TextArea ta=new TextArea( );/用來(lái)顯示聊天過(guò)程用來(lái)顯示聊天過(guò)程服務(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(已連接的客戶機(jī)已連接的客戶機(jī): +client.getInetAddress( ).getHostName( )+nn); in=client.getInputStream( );

51、out=client.getOutputStream( ); catch(IOException ioe) while(true)/接受客戶端說(shuō)的話接受客戶端說(shuō)的話 try byte buf=new byte256; in.read(buf); String str=new String(buf); ta.append(客戶機(jī)說(shuō):客戶機(jī)說(shuō):+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ù)器說(shuō)的話發(fā)送服務(wù)器說(shuō)的話 ta.append(我說(shuō):我說(shuō):+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(客戶機(jī)客戶機(jī)); 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ù)器端說(shuō)的話接受服務(wù)器端說(shuō)的話 try byte buf=new byte256; in.read(buf); String str=new String(buf); ta.append(服務(wù)器說(shuō)服務(wù)器說(shuō):+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(我說(shuō)我說(shuō):+str); ta.append(n); catch(IOException ioe) public static void main(String args ) new chatClient( ); 6.多線程的多線程的TCP服務(wù)器服務(wù)器在典型的服務(wù)器中,我們希望同時(shí)能處理多個(gè)客戶的請(qǐng)求。解決這個(gè)問(wèn)題的關(guān)鍵就是多線程處理機(jī)制最基本的方法是:在服務(wù)器(程序)里創(chuàng)建單個(gè)ServerSocket,并調(diào)用acc

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

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

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

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

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論