




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、12本次課程主要內(nèi)容本次課程主要內(nèi)容網(wǎng)絡(luò)基礎(chǔ)知識(shí)網(wǎng)絡(luò)基礎(chǔ)知識(shí)Socket&TCPSocket&TCP應(yīng)用應(yīng)用Socket&UDPSocket&UDP應(yīng)用應(yīng)用3基礎(chǔ)知識(shí)及基礎(chǔ)知識(shí)及TCPTCP應(yīng)用主要內(nèi)容應(yīng)用主要內(nèi)容網(wǎng)絡(luò)基礎(chǔ)概念神密的套接字Java中網(wǎng)絡(luò)編程主要API介紹Socket與ServerSocket介紹高級(jí)應(yīng)用4網(wǎng)絡(luò)基礎(chǔ)概念計(jì)算機(jī)組網(wǎng)Tcp/Ip網(wǎng)絡(luò)層次介紹網(wǎng)絡(luò)端口號(hào)介紹套接字簡(jiǎn)介(socket)51.1.1 計(jì)算機(jī)組網(wǎng)簡(jiǎn)介計(jì)算機(jī)以一種非常簡(jiǎn)單的方式進(jìn)行相互間的操作和通信。計(jì)算機(jī)芯片是以 1 和 0 的形式存儲(chǔ)并傳輸數(shù)據(jù)的開(kāi)閉轉(zhuǎn)換器的集合。當(dāng)計(jì)算機(jī)想共享
2、數(shù)據(jù)時(shí),它們所需做的全部就是以一致的速度、順序、定時(shí)等等來(lái)回傳輸幾百萬(wàn)比特和字節(jié)的數(shù)據(jù)流。每次想在兩個(gè)應(yīng)用程序之間進(jìn)行信息通信時(shí),您怎么會(huì)愿意擔(dān)心那些細(xì)節(jié)呢?為免除這些擔(dān)心,我們需要每次都以相同方式完成該項(xiàng)工作的一組包協(xié)議。這將允許我們處理應(yīng)用程序級(jí)的工作,而不必?fù)?dān)心低級(jí)網(wǎng)絡(luò)細(xì)節(jié)。這些成包協(xié)議稱(chēng)為協(xié)議棧(stack)。TCP/IP 是當(dāng)今最常見(jiàn)的協(xié)議棧。多數(shù)協(xié)議棧(包括 TCP/IP)都大致對(duì)應(yīng)于國(guó)際標(biāo)準(zhǔn)化組織(International Standards Organization,ISO)的開(kāi)放系統(tǒng)互連參考模型(Open Systems Interconnect Reference Mod
3、el,OSIRM)。OSIRM 認(rèn)為在一個(gè)可靠的計(jì)算機(jī)組網(wǎng)中有七個(gè)邏輯層(見(jiàn)圖)。各個(gè)地方的公司都對(duì)這個(gè)模型某些層的實(shí)現(xiàn)做了一些貢獻(xiàn),從生成電子信號(hào)(光脈沖、射頻等等)到提供數(shù)據(jù)給應(yīng)用程序。TCP/IP 映射到 OSI 模型中的兩層的情形如圖所示。我們不想涉及層的太多細(xì)節(jié),但您應(yīng)該知道套接字位于什么地方。61.1.1計(jì)算機(jī)組網(wǎng)簡(jiǎn)介n 套接字位于什么地方套接字位于什么地方套接字大致駐留在 OSI 模型的會(huì)話層(見(jiàn)圖)。會(huì)話層夾在其上面向應(yīng)用的層和其下的實(shí)時(shí)數(shù)據(jù)通信層之間。會(huì)話層為兩臺(tái)計(jì)算機(jī)之間的數(shù)據(jù)流提供管理和控制服務(wù)。作為該層的一部分,套接字提供一個(gè)隱藏從導(dǎo)線上獲取比特和字節(jié)的復(fù)雜性的抽象。換
4、句話說(shuō),套接字允許我們讓?xiě)?yīng)用程序表明它想發(fā)送一些字節(jié)即可傳輸數(shù)據(jù)。套接字隱藏了完成該項(xiàng)工作的具體細(xì)節(jié)。當(dāng)您打電話時(shí),您的聲音傳到傳感器,傳感器把它轉(zhuǎn)換成可以傳輸?shù)碾姅?shù)據(jù)。電話機(jī)是人與電信網(wǎng)絡(luò)的接口。您無(wú)須知道聲音如何傳輸?shù)募?xì)節(jié),只要知道想打電話給誰(shuí)就行了。同樣地,套接字扮演隱藏在未知通道上傳輸 1 和 0 的復(fù)雜性的高級(jí)接口的角色。 71.1.1計(jì)算機(jī)組網(wǎng)簡(jiǎn)介使用套接字的代碼工作于表示層。表示層提供應(yīng)用層能夠使用的信息的公共表示。假設(shè)您打算把應(yīng)用程序連接到只能識(shí)別 EBCDIC 的舊的銀行系統(tǒng)。應(yīng)用程序的域?qū)ο笠?ASCII 格式存儲(chǔ)信息。在這種情況下,您得負(fù)責(zé)在表示層上編寫(xiě)把數(shù)據(jù)從 EBCD
5、IC 轉(zhuǎn)換成 ASCII 的代碼,然后(比方說(shuō))給應(yīng)用層提供域?qū)ο蟆?yīng)用層然后就可以用域?qū)ο髞?lái)做它想做的任何事情。您編寫(xiě)的套接字處理代碼只存在于表示層中。您的應(yīng)用層無(wú)須知道套接字如何工作的任何事情81.1.2 Tcp/Ip網(wǎng)絡(luò)層次介紹n 應(yīng)用層大多數(shù)基于Internet的應(yīng)用程序被看作TCP/IP網(wǎng)絡(luò)的最上層應(yīng)用層應(yīng)用層, 如:ftp,http,smtp,pop3,telnet,nntp等。n 網(wǎng)絡(luò)層網(wǎng)絡(luò)層對(duì)TCP/IP網(wǎng)絡(luò)中的硬件資源進(jìn)行標(biāo)識(shí)。連接到TCP/IP網(wǎng)絡(luò)中的每臺(tái)計(jì)算機(jī)(或其他設(shè)備)都有唯一的地址,這就是IPIP地址地址。IP地址實(shí)質(zhì)上是一個(gè)32位的整數(shù),通常以“%d.%d.%d.
6、%d%d.%d.%d.%d”的形式表示,每個(gè)d是一個(gè)8位整數(shù)。n 傳輸層在TCP/IP網(wǎng)絡(luò)中,不同的機(jī)器之間進(jìn)行通信時(shí),數(shù)據(jù)的傳輸是由傳輸層傳輸層控制的,這包括數(shù)據(jù)要發(fā)往的目標(biāo)機(jī)器及應(yīng)用程序、數(shù)據(jù)的質(zhì)量控制等。 TCP/IP網(wǎng)絡(luò)中最常用的傳輸協(xié)議就是TCPTCP(Transport Control Protocol)和UDPUDP(User Datagram Protocol)。91.1.3 網(wǎng)絡(luò)端口號(hào)介紹-為什么會(huì)產(chǎn)生端口?n 為什么會(huì)產(chǎn)生端口?一臺(tái)機(jī)器通常只通過(guò)一條鏈路連接到網(wǎng)絡(luò)上,即它只有一個(gè)IP地址,但一臺(tái)機(jī)器中往往有很多應(yīng)用程序需要進(jìn)行網(wǎng)絡(luò)通信,如何區(qū)分呢?這就要靠網(wǎng)絡(luò)端口號(hào)網(wǎng)絡(luò)端口
7、號(hào)(port)了。端口號(hào)是用整數(shù)來(lái)表達(dá)的,其范圍為065535,其中01023為系統(tǒng)所保留,專(zhuān)門(mén)給那些通用的服務(wù)(well-known services),如http服務(wù)的端口號(hào)為80,telnet服務(wù)的端口號(hào)為21,ftp服務(wù)的端口為23,因此,當(dāng)我們編寫(xiě)通信程序時(shí),應(yīng)選擇一個(gè)大于1023的數(shù)作為端口號(hào),以免發(fā)生沖突。IP與端口號(hào)組合而得出的Socket,可以完全分辨Internet上運(yùn)行的程序。網(wǎng)絡(luò)服務(wù)網(wǎng)絡(luò)服務(wù)httpftp其他服務(wù)23telnet端端口口2180客戶程序客戶程序SocketIP,port101.1.3 網(wǎng)絡(luò)端口號(hào)介紹-什么是端口?n 什么是端口?一臺(tái)機(jī)器通常只通過(guò)一條鏈路
8、連接到網(wǎng)絡(luò)上,即它只有一個(gè)IP地址,但一臺(tái)機(jī)器中往往有很多應(yīng)用程序需要進(jìn)行網(wǎng)絡(luò)通信,如何區(qū)分呢?這就要靠網(wǎng)絡(luò)端網(wǎng)絡(luò)端口號(hào)口號(hào)(port)了。 端口號(hào)是一個(gè)標(biāo)記機(jī)器的邏輯通信信道邏輯通信信道的正整數(shù),端口號(hào)不是物理實(shí)體。IP地址和端口號(hào)組成了所謂的SocketSocket,Socket是網(wǎng)絡(luò)上運(yùn)行的程序之間雙向通信鏈路的最后終結(jié)點(diǎn),它是TCP和UDP的基礎(chǔ)。111.1.4套接字簡(jiǎn)介(socket)n 什么是套接字?套接字是一種軟件抽象,用于表達(dá)兩臺(tái)機(jī)器之間的連接“終端”。對(duì)于一個(gè)給定的連接,每臺(tái)機(jī)器上都有一個(gè)套接字,您也可以想象它們之間有一條虛擬的“電纜”,“電纜”的每一端都插入到套接字中。當(dāng)然
9、,機(jī)器之間的物理硬件和電纜連接都是完全未知的。抽象的全部目的是使我們無(wú)須知道不必知道的細(xì)節(jié)。 簡(jiǎn)言之,一臺(tái)機(jī)器上的套接字與另一臺(tái)機(jī)器上的套接字交談就創(chuàng)建一條通信通道。程序員可以用該通道來(lái)在兩臺(tái)機(jī)器之間發(fā)送數(shù)據(jù)。當(dāng)您發(fā)送數(shù)據(jù)時(shí),TCP/IP 協(xié)議棧的每一層都會(huì)添加適當(dāng)?shù)膱?bào)頭信息來(lái)包裝數(shù)據(jù)。這些報(bào)頭幫助協(xié)議棧把您的數(shù)據(jù)送到目的地。好消息是 Java 語(yǔ)言通過(guò)流為您的代碼提供數(shù)據(jù),從而隱藏了所有這些細(xì)節(jié),這也是為什么它們有時(shí)候被做流套接字(streaming socket)的原因。把套接字想成兩端電話上的聽(tīng)筒 我和您通過(guò)專(zhuān)用通道在我們的電話聽(tīng)筒上講話和聆聽(tīng)。直到我們決定掛斷電話,對(duì)話才會(huì)結(jié)束(除非我
10、們?cè)谑褂梅涓C電話)。而且我們各自的電話線路都占線,直到我們掛斷電話。121.1.4套接字簡(jiǎn)介(socket)n 套接字的類(lèi)型套接字的類(lèi)型 一般而言,Java 語(yǔ)言中的套接字有以下兩種形式:TCP 套接字(由 Socket 類(lèi)實(shí)現(xiàn),稍后我們將討論這個(gè)類(lèi)) UDP 套接字(由 DatagramSocket 類(lèi)實(shí)現(xiàn)) TCP 和 UDP 扮演相同角色,但做法不同。兩者都接收傳輸協(xié)議數(shù)據(jù)包并將其內(nèi)容向前傳送到表示層。TCP 把消息分解成數(shù)據(jù)包(數(shù)據(jù)報(bào),datagrams)并在接收端以正確的順序把它們重新裝配起來(lái)。TCP 還處理對(duì)遺失數(shù)據(jù)包的重傳請(qǐng)求。有了 TCP,位于上層的層要擔(dān)心的事情就少多了。UD
11、P 不提供裝配和重傳請(qǐng)求這些功能。它只是向前傳送信息包。位于上層的層必須確保消息是完整的并且是以正確的順序裝配的。與TCP協(xié)議不同,用戶數(shù)據(jù)報(bào)協(xié)議(UDP)則是一種無(wú)連接無(wú)連接的傳輸協(xié)議。利用UDP協(xié)議進(jìn)行數(shù)據(jù)傳輸時(shí),首先需要將要傳輸?shù)臄?shù)據(jù)定義成數(shù)據(jù)報(bào)(Datagram),在數(shù)據(jù)報(bào)中指明數(shù)據(jù)所要達(dá)到的端點(diǎn)(Socket,主機(jī)地址和端口號(hào)),然后再將數(shù)據(jù)報(bào)發(fā)送出去。這種傳輸方式是無(wú)序的,也不能確保絕對(duì)的安全可靠,但它很簡(jiǎn)單也具有比較高的效率,這與通過(guò)郵局發(fā)送郵件郵局發(fā)送郵件的情形非常相似一般而言,UDP 強(qiáng)加給您的應(yīng)用程序的性能開(kāi)銷(xiāo)更小,但只在應(yīng)用程序不會(huì)突然交換大量數(shù)據(jù)并且不必裝配大量數(shù)據(jù)報(bào)以
12、完成一條消息的時(shí)候。否則,TCP 才是最簡(jiǎn)單或許也是最高效的選擇。13java平臺(tái)套接字實(shí)現(xiàn)URLConnection類(lèi)簡(jiǎn)介URL連接實(shí)例演示SocketServerSocket142.1.1 URLConnection-類(lèi)簡(jiǎn)介n 什么是URL?URL是統(tǒng)一資源定位符(Uniform Resource Locator)的簡(jiǎn)稱(chēng),它表示Internet上某一資源的地址。通過(guò)URL,就可以訪問(wèn)Internet。瀏覽器或其他程序通過(guò)解析給定的URL就可以在網(wǎng)絡(luò)上查找相應(yīng)的文件或其他資源。n URL的格式一個(gè)URL包括兩部分內(nèi)容:協(xié)議名稱(chēng)和資源名稱(chēng)協(xié)議名稱(chēng)和資源名稱(chēng),中間用冒號(hào)隔開(kāi):Protocol:r
13、esourceName 如:http:/152.1.1 URLConnection-類(lèi)簡(jiǎn)介n URL的操作在包中,提供了類(lèi)URL來(lái)表示URL。類(lèi)URL提供了很多構(gòu)造方法來(lái)生成一個(gè)URL對(duì)象:public URL(Stringpublic URL(Stringspec) spec) public URL(URL context, String spec)public URL(URL context, String spec)public URL(Stringpublic URL(Stringprotocol, Stringprotocol, Stringhost, Stringhost, Str
14、ingfile) file) public URL(Stringpublic URL(Stringprotocol, Stringprotocol, Stringhost, inthost, intport, port, StringStringfile)file)以下是一些具體的構(gòu)造實(shí)例:URLurl1=newURL(“http:/ URLConnection-類(lèi)簡(jiǎn)介n URL的操作一個(gè)URL對(duì)象生成后,其屬性是不能被改變屬性是不能被改變的(與String對(duì)象相似),但可以通過(guò)它給定的方法來(lái)獲取這些屬性: public String getProtocol()public String ge
15、tProtocol():獲取該:獲取該URLURL的協(xié)議名的協(xié)議名 public String getHost() public String getHost() :獲取該:獲取該URLURL的主機(jī)名的主機(jī)名 public String getPort() public String getPort() :獲取該:獲取該URLURL的端口號(hào)的端口號(hào) public String getPath() public String getPath() :獲取該:獲取該URLURL的文件路徑的文件路徑 public String getFile() public String getFile() :獲取
16、該:獲取該URLURL的文件名的文件名 public String getRef() public String getRef() :獲取該:獲取該URLURL在文件中的相對(duì)位置在文件中的相對(duì)位置 public String getQuery() public String getQuery() :獲取該:獲取該URLURL的查詢(xún)名的查詢(xún)名172.1.1 URLConnection-類(lèi)簡(jiǎn)介n通過(guò)URL讀取www信息URL類(lèi)提供的方法openStream(),就可以讀取一個(gè)URL對(duì)象所指定的資源。public final InputStream openStreamopenStream();方法
17、openStream()與指定的URL建立連接并返回一個(gè)InputStream對(duì)象,將URL位置的資源轉(zhuǎn)成一個(gè)輸入數(shù)據(jù)流。通過(guò)這個(gè)InputStream對(duì)象,就可以讀取資源中的數(shù)據(jù)。URLJava 程序程序InputStream182.1.2 URL連接URLConnection 類(lèi)是所有在應(yīng)用程序和 URL 之間創(chuàng)建通信鏈路的類(lèi)的抽象超類(lèi)。URLConnection 在獲取 Web 服務(wù)器上的文檔方面特別有用,但也可用于連接由 URL 標(biāo)識(shí)的任何資源。該類(lèi)的實(shí)例既可用于從資源中讀,也可用于往資源中寫(xiě)。例如,您可以連接到一個(gè) servlet 并發(fā)送一個(gè)格式良好的 XML String 到服務(wù)器
18、上進(jìn)行處理。URLConnection 的具體子類(lèi)(例如 HttpURLConnection)提供特定于它們實(shí)現(xiàn)的額外功能。對(duì)于我們的示例,我們不想做任何特別的事情,所以我們將使用 URLConnection 本身提供的缺省行為。 連接到連接到 URL URL 包括幾個(gè)步驟:包括幾個(gè)步驟:創(chuàng)建創(chuàng)建 URLConnection URLConnection 用各種用各種 setter setter 方法配置它方法配置它 連接到連接到 URL URL用各種用各種 getter getter 方法與它交互方法與它交互 192.1.3 演示事例getDocumentAt() getDocumentAt(
19、) 方法處理方法處理獲取獲取 Web Web 上的文檔的實(shí)際上的文檔的實(shí)際工作工作 打開(kāi)該打開(kāi)該 URL URL 上的一個(gè)連接上的一個(gè)連接 且用且用 BufferedReader BufferedReader 讀文檔讀文檔 然后關(guān)閉然后關(guān)閉 BufferedReaderBufferedReader 202.1.4 URL連接總結(jié)實(shí)際上,URLConnection 使用套接字從我們指定的 URL 中讀取信息(它只是解析成 IP 地址),但我們無(wú)須了解它,我們也不關(guān)心。但有很多事;我們馬上就去看看。在繼續(xù)往前講之前,讓我們回顧一下創(chuàng)建和使用 URLConnection 的步驟:1.用您想連接的資源
20、的有效 URL String 實(shí)例化一個(gè) URL(如有問(wèn)題則拋出 MalformedURLException)。2.打開(kāi)該 URL 上的一個(gè)連接。3.把該連接的 InputStream 包裝進(jìn) BufferedReader 以使您 能夠讀取行。4.用 BufferedReader 讀文檔。5.關(guān)閉 BufferedReader。21Java中網(wǎng)絡(luò)編程主要API介紹n 面向IP層的類(lèi)InetAddress (Inet4Address,Inet6Address)n 面向應(yīng)用層的類(lèi)面向應(yīng)用層的類(lèi)URLURL、URLConnectionURLConnectionn 面向網(wǎng)絡(luò)層的類(lèi)面向網(wǎng)絡(luò)層的類(lèi) TCP
21、協(xié)議相關(guān)類(lèi): Socket、ServerSocket UDP協(xié)議相關(guān)類(lèi): DatagramPacket、DatagramSocket、MulticastSocketn 異常異常BindException、ConnectException、MalformedURLException、NoRouteToHostException、ProtocolException、SocketException、UnknownHostException、UnknownServiceException22Socket與ServerSocket介紹相關(guān)知識(shí)簡(jiǎn)介Socket相關(guān)主要方法介紹演示案例總結(jié)ServerSoc
22、ket相關(guān)主要方法介紹演示案例總結(jié)234.1 相關(guān)知識(shí)簡(jiǎn)介在Java中,基于TCP協(xié)議實(shí)現(xiàn)網(wǎng)絡(luò)通信的類(lèi)有兩個(gè):在客戶端的Socket類(lèi)和在服務(wù)器端的ServerSocket類(lèi)。 在服務(wù)器端通過(guò)指定一個(gè)用來(lái)等待的連接的端口號(hào)創(chuàng)建一個(gè) ServerSocket實(shí)例。 在客戶端通過(guò)規(guī)定一個(gè)主機(jī)和端口號(hào)創(chuàng)建一個(gè) Socket實(shí)例,連到服務(wù)器上。 ServerSocket類(lèi)的accept方法使服務(wù)器處于阻塞狀態(tài),等待用戶請(qǐng)求。244.1.1相關(guān)知識(shí)簡(jiǎn)介無(wú)論一個(gè)Socket通信程序的功能多么齊全、程序多么復(fù)雜,其基本結(jié)構(gòu)都是一樣的,都包括以下四個(gè)基本步驟:1、在客戶方和服務(wù)器方創(chuàng)建Socket/Serve
23、rSocket實(shí)例。2、打開(kāi)連接到Socket的輸入/輸出流。3、利用輸入/輸出流,按照一定的協(xié)議對(duì)Socket進(jìn)行讀/寫(xiě)操作。4、關(guān)閉輸入/輸出流和Socket。注:通常,程序員的主要工作是針對(duì)所要完成的功能在第3步進(jìn)行編程,第1、2、4步對(duì)所有的通信程序來(lái)說(shuō)幾乎都是一樣的。Server端程序端程序ServerSocket(port #)Socket socket = ServerSocket.accept()接收連接接收連接OutputStreamInputStreamClose SocketClient端程序端程序Socket(host, port #)與服務(wù)器建立連接與服務(wù)器建立連接O
24、utputStreamInputStreamClose Socketsocket254.2.1 Socket主要方法簡(jiǎn)介-Socket 構(gòu)造方法:publicSocket(Stringhost,intport)/遠(yuǎn)程服務(wù)器遠(yuǎn)程服務(wù)器IP及響應(yīng)端口及響應(yīng)端口publicSocket(InetAddressaddress,intport)publicSocket(Stringhost,intport,InetAddresslocalAddr,intlocalPort)publicSocket(InetAddressaddress,intport,InetAddresslocalAddr,intlo
25、calPort)/在指定的機(jī)器上的指定端口上運(yùn)行在指定的機(jī)器上的指定端口上運(yùn)行這些方法都將拋出例外IOException,程序中需要捕獲處理。Socket的輸入/輸出流管理public InputStream getInputStream()public InputStream getInputStream()public void shutdownInput() public void shutdownInput() public OutputStream getOutputStream() public OutputStream getOutputStream() public void
26、shutdownOutput()public void shutdownOutput() 這些方法都將拋出例外IOException,程序中需要捕獲處理。 關(guān)閉Socket:public void close() throws IOExceptionpublic void close() throws IOException 設(shè)置/獲取Socket數(shù)據(jù)public InetAddress getInetAddress()public InetAddress getInetAddress()、public int getPort()public int getPort(),public void
27、 setSoTimeout(intpublic void setSoTimeout(int timeout)timeout), 這些方法都將拋出例外SocketException,程序中需要捕獲處理。264.2.2 Socket演示案例-Socketn 背景介紹在本部分討論的示例將闡明在 Java 代碼中如何使用 Socket 和 ServerSocket??蛻魴C(jī)用 Socket 連接到服務(wù)器。服務(wù)器用 ServerSocket 在端口 3000 偵聽(tīng)??蛻魴C(jī)請(qǐng)求服務(wù)器 C: 驅(qū)動(dòng)器上的文件內(nèi)容。為清楚起見(jiàn),我們把示例分解成客戶機(jī)端和服務(wù)器端。最后我們將把它們組合起來(lái)以使您能看到整體模樣。注:
28、客戶機(jī)和服務(wù)器將只在一臺(tái)機(jī)器上運(yùn)行,所以您不必?fù)?dān)心是否有一個(gè)可用的網(wǎng)絡(luò)。 274.2.2 Socket演示案例-Socketn 背景介紹下面是整個(gè)類(lèi)的結(jié)構(gòu):服務(wù)器IP地址變量網(wǎng)絡(luò)連接端口創(chuàng)建連接等操作獲取文件284.2.2 Socket演示案例-Socketn 建立連接建立連接 實(shí)例化一個(gè)socket對(duì)象將socket的輸入輸出流進(jìn)行封裝294.2.2 Socket演示案例-Socketn 與主機(jī)進(jìn)行交互它將告訴服務(wù)器我們想要什么文件并在服務(wù)器傳回其內(nèi)容時(shí)接收該內(nèi)容。 向服務(wù)器發(fā)送消息從服務(wù)器接收內(nèi)容304.2.2 Socket演示案例-Socketn 斷開(kāi)連接tearDownConnecti
29、on() 方法只是分別關(guān)閉我們?cè)?Socket 的 InputStream 和 OutputStream 上創(chuàng)建的 BufferedReader 和 PrintWriter。這樣做會(huì)關(guān)閉我們從這樣做會(huì)關(guān)閉我們從 Socket 獲取的底層流獲取的底層流,所以我們必須捕捉可能的 IOException。思考:思考:1.1.為什么這么沒(méi)有調(diào)用為什么這么沒(méi)有調(diào)用socket.close()socket.close()方法方法? ? 2. 2.怎么實(shí)現(xiàn)怎么實(shí)現(xiàn)main()main()方法或方法或JunitJunit單元測(cè)試用例單元測(cè)試用例! !314.2.2 Socket演示案例-Socketn客戶端操
30、作總結(jié)在這里我們回顧一下創(chuàng)建和使用 Socket 的步驟: 用您想連接的機(jī)器的 IP 地址和端口實(shí)例化 Socket(如有問(wèn)題則拋出 Exception)。 獲取 Socket 上的流以進(jìn)行讀寫(xiě)。把流包裝進(jìn) BufferedReader/PrintWriter 的實(shí)例 。對(duì) Socket 進(jìn)行讀寫(xiě) 。關(guān)閉打開(kāi)的流。 324.3.1 ServerSocket類(lèi)主要方法介紹n 構(gòu)造方法:public ServerSocket(intpublic ServerSocket(intport)port)public ServerSocket(intpublic ServerSocket(intport,
31、 port, intintbacklogbacklog) /) /支持指定支持指定數(shù)目的連接數(shù)目的連接public ServerSocket(intpublic ServerSocket(intport, intport, intbacklog, backlog, InetAddressInetAddressbindAddrbindAddr) ) /在指定的機(jī)器上運(yùn)行在指定的機(jī)器上運(yùn)行 這些方法都將拋出例外IOException,程序中需要捕獲處理n 主要方法:public Socket accept()public Socket accept():等待客戶端的連接:等待客戶端的連接publi
32、c void close()public void close():關(guān)閉:關(guān)閉SocketSocketn 設(shè)置/獲取Socket數(shù)據(jù):public InetAddress getInetAddress()public InetAddress getInetAddress()、public int public int getLocalPort()getLocalPort(),public void setSoTimeout(intpublic void setSoTimeout(inttimeout)timeout), 這些方法都將拋出例外SocketException,程序中需要捕獲處理。3
33、34.3.2 ServerSocket演示案例n 背景介紹接受客戶端的請(qǐng)求,將服務(wù)器c盤(pán)目錄下面的某個(gè)文件返回給客戶端。n 服務(wù)器端類(lèi)結(jié)構(gòu)接受連接方法業(yè)務(wù)處理方法344.3.2 ServerSocket演示案例n 接受連接接受連接創(chuàng)建一個(gè) ServerSocket 并等待連接請(qǐng)求 。 實(shí)例化一個(gè)ServerSocket對(duì)象偵聽(tīng)端口并接受請(qǐng)求354.3.2 ServerSocket演示案例n 處理連接處理連接 封裝輸入輸出流業(yè)務(wù)處理釋放相關(guān)資源364.3.3 ServerSocket總結(jié)回顧一下創(chuàng)建和使用 ServerSocket 的步驟:用一個(gè)您想讓它偵聽(tīng)傳入客戶機(jī)連接的端口來(lái)實(shí)例化一個(gè) Se
34、rverSocket(如有問(wèn)題則拋出 Exception)。 調(diào)用 ServerSocket 的 accept() 以在等待連接期間造成阻塞。 獲取位于該底層 Socket 的流以進(jìn)行讀寫(xiě)操作。按使事情簡(jiǎn)單化的原則包裝流。 1.對(duì) Socket 進(jìn)行讀寫(xiě)。關(guān)閉打開(kāi)的流(并請(qǐng)記住,永遠(yuǎn)不要在關(guān)閉 Writer 之前關(guān)閉 Reader)。 思考:思考:1.1.如何實(shí)現(xiàn)啟動(dòng)上述服務(wù)器端代碼如何實(shí)現(xiàn)啟動(dòng)上述服務(wù)器端代碼? ? 2. 2.服務(wù)器端如何實(shí)現(xiàn)多客戶端同時(shí)連接服務(wù)器端如何實(shí)現(xiàn)多客戶端同時(shí)連接? ?37Socket高級(jí)應(yīng)用多線程服務(wù)器如何處理多個(gè)連接請(qǐng)求?案例分析帶連接池的服務(wù)器背景分析案例分析
35、385.1.1如何處理多個(gè)連接請(qǐng)求?處理方法:將服務(wù)器寫(xiě)成多線程的,不同的處理線程為不同的客戶服務(wù)。主線程只負(fù)責(zé)循環(huán)等待,處理線程負(fù)責(zé)網(wǎng)絡(luò)連接,接收客戶輸入的信息。Serverclient1client2serverthread2serverthread1395.1.2 案例分析n 接受連接請(qǐng)求我們將在前面所講的服務(wù)器端的案例進(jìn)行重構(gòu),將期重構(gòu)成一個(gè)滿足成多并發(fā)服務(wù)器程序。指定客戶機(jī)請(qǐng)求的最大數(shù)目 變化重點(diǎn)所在405.1.2 案例分析n 處理連接:第處理連接:第 1 1 部分部分 這里我們將討論 handleConnection() 方法的結(jié)構(gòu),這個(gè)方法生成一個(gè)新的 Thread 來(lái)處理每個(gè)連
36、接。我們將分兩部分討論這個(gè)問(wèn)題。這一屏我們將著重該方法本身,然后在下一屏研究該方法所使用的 ConnectionHandler 助手類(lèi)的結(jié)構(gòu)。 思考思考:1.:1.與單并發(fā)處理的區(qū)別與單并發(fā)處理的區(qū)別? ? 2.ConnectionHandler 2.ConnectionHandler應(yīng)該怎么實(shí)現(xiàn)應(yīng)該怎么實(shí)現(xiàn)? ?415.1.2 案例分析n 處理連接:第處理連接:第 2 2 部分部分我們對(duì)我們對(duì) RemoteFileServer RemoteFileServer 所做的大改動(dòng)就體現(xiàn)所做的大改動(dòng)就體現(xiàn)在這個(gè)方法上。我們?nèi)匀辉诜?wù)器接受一個(gè)連接之后在這個(gè)方法上。我們?nèi)匀辉诜?wù)器接受一個(gè)連接之后調(diào)用
37、調(diào)用 handleConnection() handleConnection(),但現(xiàn)在我們把該,但現(xiàn)在我們把該 Socket Socket 傳遞給傳遞給 ConnectionHandler ConnectionHandler 的一個(gè)實(shí)例,它是的一個(gè)實(shí)例,它是 Runnable Runnable 的。我們用的。我們用 ConnectionHandler ConnectionHandler 創(chuàng)建一個(gè)創(chuàng)建一個(gè)新新 Thread Thread 并啟動(dòng)它。并啟動(dòng)它。ConnectionHandler ConnectionHandler 的的 run() run() 方法包含方法包含Socket Soc
38、ket 讀寫(xiě)和讀讀寫(xiě)和讀 File File 的代碼,這些代碼的代碼,這些代碼原來(lái)在原來(lái)在 RemoteFileServer RemoteFileServer 的的 handleConnection() handleConnection() 中中。思考:如何實(shí)現(xiàn)run()方法?與前面的任務(wù)有什么區(qū)別嗎與前面的任務(wù)有什么區(qū)別嗎? ?425.1.3 案例分析總結(jié)創(chuàng)建和使用“多線程版”的服務(wù)器的步驟:修改 acceptConnections() 以用缺省為 50(或任何您想要的大于 1 的指定數(shù)字)實(shí)例化ServerSocket。 修改 ServerSocket 的 handleConnection
39、() 以用 ConnectionHandler 的一個(gè)實(shí)例生成一個(gè)新的 Thread。 一 借用 RemoteFileServer 的 handleConnection() 方法的代碼實(shí)現(xiàn) ConnectionHandler 類(lèi)。 43神秘的套接字現(xiàn)實(shí)生活中的套接字客戶端原理服務(wù)器端原理發(fā)送消息到服務(wù)器端原理接收客戶端的消息原理總結(jié)java平臺(tái)套接字實(shí)現(xiàn)URLConnection類(lèi)Socket類(lèi)ServerSocket類(lèi)總結(jié)441.2.1 現(xiàn)實(shí)生活中的套接字n 客戶端原理我們創(chuàng)建了一個(gè) ClientSocketFacade,它是 Runnable 的并且擁有一個(gè) Socket 實(shí)例。我們的應(yīng)用
40、程序可以用一個(gè)特定的主機(jī) IP 地址和端口號(hào)來(lái)實(shí)例化一個(gè) ClientSocketFacade,并在一個(gè)新 Thread 中運(yùn)行它。ClientSocketFacade 的 run() 方法調(diào)用 connect(),connect() 惰性初始化一個(gè) Socket。有了 Socket 實(shí)例,我們的 ClientSocketFacade 就調(diào)用自己的 receive(),receive() 將造成阻塞直到服務(wù)器在 Socket 上發(fā)送數(shù)據(jù)。一旦服務(wù)器發(fā)送數(shù)據(jù),我們的 ClientSocketFacade 就將醒來(lái)并處理傳入的數(shù)據(jù)。數(shù)據(jù)的發(fā)送是直接的。我們的應(yīng)用程序可以通過(guò)用一個(gè) StreamOb
41、ject 調(diào)用 send() 方法來(lái)簡(jiǎn)單地告訴它的 ClientSocketFacade 把數(shù)據(jù)發(fā)送到服務(wù)器。上述討論中唯一遺漏的一個(gè)是 StreamAdapter。當(dāng)應(yīng)用程序告訴 ClientSocketFacade 發(fā)送數(shù)據(jù)時(shí),該 Facade 將委派 StreamAdapter 的實(shí)例處理有關(guān)操作。ClientSocketFacade 委派 StreamAdapter 的同一個(gè)實(shí)例處理接收數(shù)據(jù)的操作。StreamAdapter 把消息加工成最終格式并將它放到 Socket 的 OutputStream 上,并以逆過(guò)程處理從 Socket 的 InputStream 傳入的消息。例如,或許
42、您的服務(wù)器需要知道發(fā)送中的消息的字節(jié)數(shù)。StreamAdapter 可以在發(fā)送之前計(jì)算消息的長(zhǎng)度并將它附加在消息的前端。當(dāng)服務(wù)器接收消息時(shí),同樣的 StreamAdapter 能夠剝離長(zhǎng)度信息并讀取正確數(shù)量的字節(jié)以構(gòu)建一個(gè) StreamReadyObject。451.2.1 現(xiàn)實(shí)生活中的套接字n 服務(wù)器端原理我們把 ServerSocket 包裝進(jìn) ServerSocketFacade,ServerSocketFacade 是 Runnable 的并且擁有一個(gè) ServerSocket 實(shí)例。我們的應(yīng)用程序可以用一個(gè)特定的服務(wù)器端偵聽(tīng)端口和客戶機(jī)連接的最大允許數(shù)目(缺省值是 50)來(lái)實(shí)例化一個(gè)
43、 ServerSocketFacade。應(yīng)用程序然后在一個(gè)新 Thread 中運(yùn)行 Facade 以隱藏 ServerSocket 的交互操作細(xì)節(jié)。ServerSocketFacade 上的 run() 方法調(diào)用 acceptConnections(),acceptConnections() 創(chuàng)建一個(gè)新的 ServerSocket,并調(diào)用 ServerSocket 上的 accept() 以造成阻塞直到有客戶機(jī)請(qǐng)求一個(gè)連接。每當(dāng)有客戶機(jī)請(qǐng)求連接,我們的 ServerSocketFacade 就醒來(lái)并通過(guò)調(diào)用 handleSocket() 來(lái)把 accept() 返回的新 Socket 傳遞給
44、SocketHandler 的實(shí)例。SocketHandler 的分內(nèi)工作是處理從客戶機(jī)到服務(wù)器的新通道。461.2.1 現(xiàn)實(shí)生活中的套接字n 發(fā)送消息到服務(wù)器端原理發(fā)送消息的 UML 交互作用圖 471.2.1 現(xiàn)實(shí)生活中的套接字n 接收來(lái)自服務(wù)器的消息接收來(lái)自服務(wù)器的消息 481.2.1 現(xiàn)實(shí)生活中的套接字n 總結(jié)Java 語(yǔ)言簡(jiǎn)化了套接字在應(yīng)用程序中的使用。它的基礎(chǔ)實(shí)際上是 包中的 Socket 和 ServerSocket 類(lèi)。一旦您理解了表象背后發(fā)生的情況,就能容易地使用這些類(lèi)。在現(xiàn)實(shí)生活中使用套接字只是這樣一件事,即通過(guò)貫徹優(yōu)秀的 OO 設(shè)計(jì)原則來(lái)保護(hù)應(yīng)用程序中各層間的封裝。我們?yōu)?/p>
45、您展示了一些有幫助的類(lèi)。這些類(lèi)的結(jié)構(gòu)對(duì)我們的應(yīng)用程序隱藏了 Socket 交互作用的低級(jí)細(xì)節(jié) 使應(yīng)用程序能只使用可插入的 ClientSocketFacade 和 ServerSocketFacade。在有些地方(在 Facade 內(nèi)),您仍然必須管理稍顯雜亂的字節(jié)細(xì)節(jié),但您只須做一次就可以了。更好的是,您可以在將來(lái)的項(xiàng)目中重用這些低級(jí)別的助手類(lèi)。495.2 帶連接池的服務(wù)器n 背景分析我們現(xiàn)在已經(jīng)擁有的 MultithreadedServer 每當(dāng)有客戶機(jī)申請(qǐng)一個(gè)連接時(shí)都在一個(gè)新 Thread 中創(chuàng)建一個(gè)新 ConnectionHandler。這意味著可能有一捆 Thread “躺”在我們周
46、圍。而且創(chuàng)建 Thread 的系統(tǒng)開(kāi)銷(xiāo)并不是微不足道的。如果性能成為了問(wèn)題(也請(qǐng)不要事到臨頭才意識(shí)到它),更高效地處理我們的服務(wù)器是件好事。那么,我們?nèi)绾胃咝У毓芾矸?wù)器端呢?我們可以維護(hù)一個(gè)進(jìn)入的連接池,一定數(shù)量的 ConnectionHandler 將為它提供服務(wù)。這種設(shè)計(jì)能帶來(lái)以下好處:l 它限定了允許同時(shí)連接的數(shù)目。 l 我們只需啟動(dòng) ConnectionHandler Thread 一次 。 我們?cè)诜?wù)器啟動(dòng)時(shí)創(chuàng)建一定數(shù)量的 ConnectionHandler,我們把進(jìn)入的連接放入“池”中并讓 ConnectionHandler 打理剩下的事情。 505.2 帶連接池的服務(wù)器帶線程
47、池的服務(wù)器類(lèi)結(jié)構(gòu)1.同時(shí)處理的活動(dòng)客戶機(jī)連接的最大數(shù)目 2.進(jìn)入的連接的偵聽(tīng)端口 3.將接受客戶機(jī)連接請(qǐng)求的 ServerSocket 1.啟動(dòng)線程池2.接受連接請(qǐng)求515.2 帶連接池的服務(wù)器n 建立連接處理程序建立連接處理程序-setUpHandlers()-setUpHandlers()方法的實(shí)現(xiàn): setUpHandlers() 方法創(chuàng)建 maxConnections(例如 3)個(gè) PooledConnectionHandler 并在新 Thread 中激活它們。用實(shí)現(xiàn)了 Runnable 的對(duì)象來(lái)創(chuàng)建 Thread 使我們可以在 Thread 調(diào)用 start() 并且可以期望在 Runnable 上調(diào)用了 run()。換句話說(shuō),我們的 PooledConnectionHandler 將等著處理進(jìn)入的連接,每個(gè)都在它自己的 Thread 中進(jìn)行。 思考:PooledConnectionHandler類(lèi)如何實(shí)現(xiàn)?需要處理哪些業(yè)務(wù)?525.2 帶連接池的服務(wù)器PooledConnectionHandler的類(lèi)結(jié)構(gòu):該類(lèi)有兩個(gè)實(shí)例變量: connection 是當(dāng)前正在處理的 Socket 1. 名為 pool 的靜態(tài) LinkedList 保存需被處理的連接 將把傳入請(qǐng)求添加到池中,將把傳入請(qǐng)求添加到池中,并告訴其它正在等待的對(duì)象并告訴其它正在等待的
溫馨提示
- 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年全球氣候變化與環(huán)境政策的考核試題及答案
- 2025年法務(wù)工作實(shí)務(wù)考試題及答案
- 2025年產(chǎn)業(yè)與經(jīng)濟(jì)關(guān)系研究相關(guān)知識(shí)考試試題及答案
- 2024年度浙江省護(hù)師類(lèi)之主管護(hù)師綜合練習(xí)試卷A卷附答案
- 2024年度浙江省護(hù)師類(lèi)之主管護(hù)師通關(guān)提分題庫(kù)及完整答案
- 2024年度浙江省二級(jí)造價(jià)工程師之建設(shè)工程造價(jià)管理基礎(chǔ)知識(shí)通關(guān)提分題庫(kù)及完整答案
- 2024年度浙江省二級(jí)造價(jià)工程師之建設(shè)工程造價(jià)管理基礎(chǔ)知識(shí)全真模擬考試試卷A卷含答案
- 2024年度浙江省二級(jí)造價(jià)工程師之土建建設(shè)工程計(jì)量與計(jì)價(jià)實(shí)務(wù)綜合練習(xí)試卷B卷附答案
- 2024年度浙江省二級(jí)造價(jià)工程師之土建建設(shè)工程計(jì)量與計(jì)價(jià)實(shí)務(wù)能力提升試卷A卷附答案
- 胃鏡前后健康教育
- 2024年湖北省武漢市中考道德與法治·歷史試題(含答案解析)
- 2024年天津市初中學(xué)業(yè)水平考試語(yǔ)文試卷及參考答案
- 山東省聊城市2023-2024學(xué)年高一下學(xué)期期末考試英語(yǔ)試題
- 公路水運(yùn)工程施工企業(yè)主要負(fù)責(zé)人和安全生產(chǎn)管理人員考核大綱和模擬試題庫(kù)1
- 預(yù)應(yīng)力混凝土管樁(L21G404)
- 企業(yè)法務(wù)概論智慧樹(shù)知到期末考試答案章節(jié)答案2024年溫州大學(xué)
- 第1課 多姿與多彩(生活色彩)課件-2023-2024學(xué)年高中美術(shù)人教版(2019)選擇性必修1《繪畫(huà)》
- 海拔高度與氣壓、空氣密度、重力加速度對(duì)照表
- 考評(píng)員職業(yè)道德課件
- 物控培訓(xùn)教程預(yù)防呆滯料與庫(kù)存控制的實(shí)用方法
- 天氣數(shù)據(jù)分析與氣象預(yù)測(cè)
評(píng)論
0/150
提交評(píng)論