Java_socket介紹_第1頁
Java_socket介紹_第2頁
Java_socket介紹_第3頁
Java_socket介紹_第4頁
Java_socket介紹_第5頁
已閱讀5頁,還剩51頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、12本次課程主要內(nèi)容本次課程主要內(nèi)容網(wǎng)絡(luò)基礎(chǔ)知識網(wǎng)絡(luò)基礎(chǔ)知識Socket&TCPSocket&TCP應(yīng)用應(yīng)用Socket&UDPSocket&UDP應(yīng)用應(yīng)用3基礎(chǔ)知識及基礎(chǔ)知識及TCPTCP應(yīng)用主要內(nèi)容應(yīng)用主要內(nèi)容網(wǎng)絡(luò)基礎(chǔ)概念神密的套接字Java中網(wǎng)絡(luò)編程主要API介紹Socket與ServerSocket介紹高級應(yīng)用4網(wǎng)絡(luò)基礎(chǔ)概念計算機(jī)組網(wǎng)Tcp/Ip網(wǎng)絡(luò)層次介紹網(wǎng)絡(luò)端口號介紹套接字簡介(socket)51.1.1 計算機(jī)組網(wǎng)簡介計算機(jī)以一種非常簡單的方式進(jìn)行相互間的操作和通信。計算機(jī)芯片是以 1 和 0 的形式存儲并傳輸數(shù)據(jù)的開閉轉(zhuǎn)換器的集合。當(dāng)計算機(jī)想共享

2、數(shù)據(jù)時,它們所需做的全部就是以一致的速度、順序、定時等等來回傳輸幾百萬比特和字節(jié)的數(shù)據(jù)流。每次想在兩個應(yīng)用程序之間進(jìn)行信息通信時,您怎么會愿意擔(dān)心那些細(xì)節(jié)呢?為免除這些擔(dān)心,我們需要每次都以相同方式完成該項工作的一組包協(xié)議。這將允許我們處理應(yīng)用程序級的工作,而不必?fù)?dān)心低級網(wǎng)絡(luò)細(xì)節(jié)。這些成包協(xié)議稱為協(xié)議棧(stack)。TCP/IP 是當(dāng)今最常見的協(xié)議棧。多數(shù)協(xié)議棧(包括 TCP/IP)都大致對應(yīng)于國際標(biāo)準(zhǔn)化組織(International Standards Organization,ISO)的開放系統(tǒng)互連參考模型(Open Systems Interconnect Reference Mod

3、el,OSIRM)。OSIRM 認(rèn)為在一個可靠的計算機(jī)組網(wǎng)中有七個邏輯層(見圖)。各個地方的公司都對這個模型某些層的實現(xiàn)做了一些貢獻(xiàn),從生成電子信號(光脈沖、射頻等等)到提供數(shù)據(jù)給應(yīng)用程序。TCP/IP 映射到 OSI 模型中的兩層的情形如圖所示。我們不想涉及層的太多細(xì)節(jié),但您應(yīng)該知道套接字位于什么地方。61.1.1計算機(jī)組網(wǎng)簡介n 套接字位于什么地方套接字位于什么地方套接字大致駐留在 OSI 模型的會話層(見圖)。會話層夾在其上面向應(yīng)用的層和其下的實時數(shù)據(jù)通信層之間。會話層為兩臺計算機(jī)之間的數(shù)據(jù)流提供管理和控制服務(wù)。作為該層的一部分,套接字提供一個隱藏從導(dǎo)線上獲取比特和字節(jié)的復(fù)雜性的抽象。換

4、句話說,套接字允許我們讓應(yīng)用程序表明它想發(fā)送一些字節(jié)即可傳輸數(shù)據(jù)。套接字隱藏了完成該項工作的具體細(xì)節(jié)。當(dāng)您打電話時,您的聲音傳到傳感器,傳感器把它轉(zhuǎn)換成可以傳輸?shù)碾姅?shù)據(jù)。電話機(jī)是人與電信網(wǎng)絡(luò)的接口。您無須知道聲音如何傳輸?shù)募?xì)節(jié),只要知道想打電話給誰就行了。同樣地,套接字扮演隱藏在未知通道上傳輸 1 和 0 的復(fù)雜性的高級接口的角色。 71.1.1計算機(jī)組網(wǎng)簡介使用套接字的代碼工作于表示層。表示層提供應(yīng)用層能夠使用的信息的公共表示。假設(shè)您打算把應(yīng)用程序連接到只能識別 EBCDIC 的舊的銀行系統(tǒng)。應(yīng)用程序的域?qū)ο笠?ASCII 格式存儲信息。在這種情況下,您得負(fù)責(zé)在表示層上編寫把數(shù)據(jù)從 EBCD

5、IC 轉(zhuǎn)換成 ASCII 的代碼,然后(比方說)給應(yīng)用層提供域?qū)ο?。?yīng)用層然后就可以用域?qū)ο髞碜鏊胱龅娜魏问虑椤D帉懙奶捉幼痔幚泶a只存在于表示層中。您的應(yīng)用層無須知道套接字如何工作的任何事情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ò)層對TCP/IP網(wǎng)絡(luò)中的硬件資源進(jìn)行標(biāo)識。連接到TCP/IP網(wǎng)絡(luò)中的每臺計算機(jī)(或其他設(shè)備)都有唯一的地址,這就是IPIP地址地址。IP地址實質(zhì)上是一個32位的整數(shù),通常以“%d.%d.%d.

6、%d%d.%d.%d.%d”的形式表示,每個d是一個8位整數(shù)。n 傳輸層在TCP/IP網(wǎng)絡(luò)中,不同的機(jī)器之間進(jìn)行通信時,數(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ò)端口號介紹-為什么會產(chǎn)生端口?n 為什么會產(chǎn)生端口?一臺機(jī)器通常只通過一條鏈路連接到網(wǎng)絡(luò)上,即它只有一個IP地址,但一臺機(jī)器中往往有很多應(yīng)用程序需要進(jìn)行網(wǎng)絡(luò)通信,如何區(qū)分呢?這就要靠網(wǎng)絡(luò)端口號網(wǎng)絡(luò)端口

7、號(port)了。端口號是用整數(shù)來表達(dá)的,其范圍為065535,其中01023為系統(tǒng)所保留,專門給那些通用的服務(wù)(well-known services),如http服務(wù)的端口號為80,telnet服務(wù)的端口號為21,ftp服務(wù)的端口為23,因此,當(dāng)我們編寫通信程序時,應(yīng)選擇一個大于1023的數(shù)作為端口號,以免發(fā)生沖突。IP與端口號組合而得出的Socket,可以完全分辨Internet上運行的程序。網(wǎng)絡(luò)服務(wù)網(wǎng)絡(luò)服務(wù)httpftp其他服務(wù)23telnet端端口口2180客戶程序客戶程序SocketIP,port101.1.3 網(wǎng)絡(luò)端口號介紹-什么是端口?n 什么是端口?一臺機(jī)器通常只通過一條鏈路

8、連接到網(wǎng)絡(luò)上,即它只有一個IP地址,但一臺機(jī)器中往往有很多應(yīng)用程序需要進(jìn)行網(wǎng)絡(luò)通信,如何區(qū)分呢?這就要靠網(wǎng)絡(luò)端網(wǎng)絡(luò)端口號口號(port)了。 端口號是一個標(biāo)記機(jī)器的邏輯通信信道邏輯通信信道的正整數(shù),端口號不是物理實體。IP地址和端口號組成了所謂的SocketSocket,Socket是網(wǎng)絡(luò)上運行的程序之間雙向通信鏈路的最后終結(jié)點,它是TCP和UDP的基礎(chǔ)。111.1.4套接字簡介(socket)n 什么是套接字?套接字是一種軟件抽象,用于表達(dá)兩臺機(jī)器之間的連接“終端”。對于一個給定的連接,每臺機(jī)器上都有一個套接字,您也可以想象它們之間有一條虛擬的“電纜”,“電纜”的每一端都插入到套接字中。當(dāng)然

9、,機(jī)器之間的物理硬件和電纜連接都是完全未知的。抽象的全部目的是使我們無須知道不必知道的細(xì)節(jié)。 簡言之,一臺機(jī)器上的套接字與另一臺機(jī)器上的套接字交談就創(chuàng)建一條通信通道。程序員可以用該通道來在兩臺機(jī)器之間發(fā)送數(shù)據(jù)。當(dāng)您發(fā)送數(shù)據(jù)時,TCP/IP 協(xié)議棧的每一層都會添加適當(dāng)?shù)膱箢^信息來包裝數(shù)據(jù)。這些報頭幫助協(xié)議棧把您的數(shù)據(jù)送到目的地。好消息是 Java 語言通過流為您的代碼提供數(shù)據(jù),從而隱藏了所有這些細(xì)節(jié),這也是為什么它們有時候被做流套接字(streaming socket)的原因。把套接字想成兩端電話上的聽筒 我和您通過專用通道在我們的電話聽筒上講話和聆聽。直到我們決定掛斷電話,對話才會結(jié)束(除非我

10、們在使用蜂窩電話)。而且我們各自的電話線路都占線,直到我們掛斷電話。121.1.4套接字簡介(socket)n 套接字的類型套接字的類型 一般而言,Java 語言中的套接字有以下兩種形式:TCP 套接字(由 Socket 類實現(xiàn),稍后我們將討論這個類) UDP 套接字(由 DatagramSocket 類實現(xiàn)) TCP 和 UDP 扮演相同角色,但做法不同。兩者都接收傳輸協(xié)議數(shù)據(jù)包并將其內(nèi)容向前傳送到表示層。TCP 把消息分解成數(shù)據(jù)包(數(shù)據(jù)報,datagrams)并在接收端以正確的順序把它們重新裝配起來。TCP 還處理對遺失數(shù)據(jù)包的重傳請求。有了 TCP,位于上層的層要擔(dān)心的事情就少多了。UD

11、P 不提供裝配和重傳請求這些功能。它只是向前傳送信息包。位于上層的層必須確保消息是完整的并且是以正確的順序裝配的。與TCP協(xié)議不同,用戶數(shù)據(jù)報協(xié)議(UDP)則是一種無連接無連接的傳輸協(xié)議。利用UDP協(xié)議進(jìn)行數(shù)據(jù)傳輸時,首先需要將要傳輸?shù)臄?shù)據(jù)定義成數(shù)據(jù)報(Datagram),在數(shù)據(jù)報中指明數(shù)據(jù)所要達(dá)到的端點(Socket,主機(jī)地址和端口號),然后再將數(shù)據(jù)報發(fā)送出去。這種傳輸方式是無序的,也不能確保絕對的安全可靠,但它很簡單也具有比較高的效率,這與通過郵局發(fā)送郵件郵局發(fā)送郵件的情形非常相似一般而言,UDP 強(qiáng)加給您的應(yīng)用程序的性能開銷更小,但只在應(yīng)用程序不會突然交換大量數(shù)據(jù)并且不必裝配大量數(shù)據(jù)報以

12、完成一條消息的時候。否則,TCP 才是最簡單或許也是最高效的選擇。13java平臺套接字實現(xiàn)URLConnection類簡介URL連接實例演示SocketServerSocket142.1.1 URLConnection-類簡介n 什么是URL?URL是統(tǒng)一資源定位符(Uniform Resource Locator)的簡稱,它表示Internet上某一資源的地址。通過URL,就可以訪問Internet。瀏覽器或其他程序通過解析給定的URL就可以在網(wǎng)絡(luò)上查找相應(yīng)的文件或其他資源。n URL的格式一個URL包括兩部分內(nèi)容:協(xié)議名稱和資源名稱協(xié)議名稱和資源名稱,中間用冒號隔開:Protocol:r

13、esourceName 如:http:/152.1.1 URLConnection-類簡介n URL的操作在包中,提供了類URL來表示URL。類URL提供了很多構(gòu)造方法來生成一個URL對象: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)造實例:URLurl1=newURL(“http:/ URLConnection-類簡介n URL的操作一個URL對象生成后,其屬性是不能被改變屬性是不能被改變的(與String對象相似),但可以通過它給定的方法來獲取這些屬性: 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的端口號的端口號 public String getPath() public String getPath() :獲取該:獲取該URLURL的文件路徑的文件路徑 public String getFile() public String getFile() :獲取

16、該:獲取該URLURL的文件名的文件名 public String getRef() public String getRef() :獲取該:獲取該URLURL在文件中的相對位置在文件中的相對位置 public String getQuery() public String getQuery() :獲取該:獲取該URLURL的查詢名的查詢名172.1.1 URLConnection-類簡介n通過URL讀取www信息URL類提供的方法openStream(),就可以讀取一個URL對象所指定的資源。public final InputStream openStreamopenStream();方法

17、openStream()與指定的URL建立連接并返回一個InputStream對象,將URL位置的資源轉(zhuǎn)成一個輸入數(shù)據(jù)流。通過這個InputStream對象,就可以讀取資源中的數(shù)據(jù)。URLJava 程序程序InputStream182.1.2 URL連接URLConnection 類是所有在應(yīng)用程序和 URL 之間創(chuàng)建通信鏈路的類的抽象超類。URLConnection 在獲取 Web 服務(wù)器上的文檔方面特別有用,但也可用于連接由 URL 標(biāo)識的任何資源。該類的實例既可用于從資源中讀,也可用于往資源中寫。例如,您可以連接到一個 servlet 并發(fā)送一個格式良好的 XML String 到服務(wù)器

18、上進(jìn)行處理。URLConnection 的具體子類(例如 HttpURLConnection)提供特定于它們實現(xiàn)的額外功能。對于我們的示例,我們不想做任何特別的事情,所以我們將使用 URLConnection 本身提供的缺省行為。 連接到連接到 URL URL 包括幾個步驟:包括幾個步驟:創(chuàng)建創(chuàng)建 URLConnection URLConnection 用各種用各種 setter setter 方法配置它方法配置它 連接到連接到 URL URL用各種用各種 getter getter 方法與它交互方法與它交互 192.1.3 演示事例getDocumentAt() getDocumentAt(

19、) 方法處理方法處理獲取獲取 Web Web 上的文檔的實際上的文檔的實際工作工作 打開該打開該 URL URL 上的一個連接上的一個連接 且用且用 BufferedReader BufferedReader 讀文檔讀文檔 然后關(guān)閉然后關(guān)閉 BufferedReaderBufferedReader 202.1.4 URL連接總結(jié)實際上,URLConnection 使用套接字從我們指定的 URL 中讀取信息(它只是解析成 IP 地址),但我們無須了解它,我們也不關(guān)心。但有很多事;我們馬上就去看看。在繼續(xù)往前講之前,讓我們回顧一下創(chuàng)建和使用 URLConnection 的步驟:1.用您想連接的資源

20、的有效 URL String 實例化一個 URL(如有問題則拋出 MalformedURLException)。2.打開該 URL 上的一個連接。3.把該連接的 InputStream 包裝進(jìn) BufferedReader 以使您 能夠讀取行。4.用 BufferedReader 讀文檔。5.關(guān)閉 BufferedReader。21Java中網(wǎng)絡(luò)編程主要API介紹n 面向IP層的類InetAddress (Inet4Address,Inet6Address)n 面向應(yīng)用層的類面向應(yīng)用層的類URLURL、URLConnectionURLConnectionn 面向網(wǎng)絡(luò)層的類面向網(wǎng)絡(luò)層的類 TCP

21、協(xié)議相關(guān)類: Socket、ServerSocket UDP協(xié)議相關(guān)類: DatagramPacket、DatagramSocket、MulticastSocketn 異常異常BindException、ConnectException、MalformedURLException、NoRouteToHostException、ProtocolException、SocketException、UnknownHostException、UnknownServiceException22Socket與ServerSocket介紹相關(guān)知識簡介Socket相關(guān)主要方法介紹演示案例總結(jié)ServerSoc

22、ket相關(guān)主要方法介紹演示案例總結(jié)234.1 相關(guān)知識簡介在Java中,基于TCP協(xié)議實現(xiàn)網(wǎng)絡(luò)通信的類有兩個:在客戶端的Socket類和在服務(wù)器端的ServerSocket類。 在服務(wù)器端通過指定一個用來等待的連接的端口號創(chuàng)建一個 ServerSocket實例。 在客戶端通過規(guī)定一個主機(jī)和端口號創(chuàng)建一個 Socket實例,連到服務(wù)器上。 ServerSocket類的accept方法使服務(wù)器處于阻塞狀態(tài),等待用戶請求。244.1.1相關(guān)知識簡介無論一個Socket通信程序的功能多么齊全、程序多么復(fù)雜,其基本結(jié)構(gòu)都是一樣的,都包括以下四個基本步驟:1、在客戶方和服務(wù)器方創(chuàng)建Socket/Serve

23、rSocket實例。2、打開連接到Socket的輸入/輸出流。3、利用輸入/輸出流,按照一定的協(xié)議對Socket進(jìn)行讀/寫操作。4、關(guān)閉輸入/輸出流和Socket。注:通常,程序員的主要工作是針對所要完成的功能在第3步進(jìn)行編程,第1、2、4步對所有的通信程序來說幾乎都是一樣的。Server端程序端程序ServerSocket(port #)Socket socket = ServerSocket.accept()接收連接接收連接OutputStreamInputStreamClose SocketClient端程序端程序Socket(host, port #)與服務(wù)器建立連接與服務(wù)器建立連接O

24、utputStreamInputStreamClose Socketsocket254.2.1 Socket主要方法簡介-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ī)器上的指定端口上運行在指定的機(jī)器上的指定端口上運行這些方法都將拋出例外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 偵聽??蛻魴C(jī)請求服務(wù)器 C: 驅(qū)動器上的文件內(nèi)容。為清楚起見,我們把示例分解成客戶機(jī)端和服務(wù)器端。最后我們將把它們組合起來以使您能看到整體模樣。注:

28、客戶機(jī)和服務(wù)器將只在一臺機(jī)器上運行,所以您不必?fù)?dān)心是否有一個可用的網(wǎng)絡(luò)。 274.2.2 Socket演示案例-Socketn 背景介紹下面是整個類的結(jié)構(gòu):服務(wù)器IP地址變量網(wǎng)絡(luò)連接端口創(chuàng)建連接等操作獲取文件284.2.2 Socket演示案例-Socketn 建立連接建立連接 實例化一個socket對象將socket的輸入輸出流進(jìn)行封裝294.2.2 Socket演示案例-Socketn 與主機(jī)進(jìn)行交互它將告訴服務(wù)器我們想要什么文件并在服務(wù)器傳回其內(nèi)容時接收該內(nèi)容。 向服務(wù)器發(fā)送消息從服務(wù)器接收內(nèi)容304.2.2 Socket演示案例-Socketn 斷開連接tearDownConnecti

29、on() 方法只是分別關(guān)閉我們在 Socket 的 InputStream 和 OutputStream 上創(chuàng)建的 BufferedReader 和 PrintWriter。這樣做會關(guān)閉我們從這樣做會關(guān)閉我們從 Socket 獲取的底層流獲取的底層流,所以我們必須捕捉可能的 IOException。思考:思考:1.1.為什么這么沒有調(diào)用為什么這么沒有調(diào)用socket.close()socket.close()方法方法? ? 2. 2.怎么實現(xiàn)怎么實現(xiàn)main()main()方法或方法或JunitJunit單元測試用例單元測試用例! !314.2.2 Socket演示案例-Socketn客戶端操

30、作總結(jié)在這里我們回顧一下創(chuàng)建和使用 Socket 的步驟: 用您想連接的機(jī)器的 IP 地址和端口實例化 Socket(如有問題則拋出 Exception)。 獲取 Socket 上的流以進(jìn)行讀寫。把流包裝進(jìn) BufferedReader/PrintWriter 的實例 。對 Socket 進(jìn)行讀寫 。關(guān)閉打開的流。 324.3.1 ServerSocket類主要方法介紹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ī)器上運行在指定的機(jī)器上運行 這些方法都將拋出例外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 背景介紹接受客戶端的請求,將服務(wù)器c盤目錄下面的某個文件返回給客戶端。n 服務(wù)器端類結(jié)構(gòu)接受連接方法業(yè)務(wù)處理方法344.3.2 ServerSocket演示案例n 接受連接接受連接創(chuàng)建一個 ServerSocket 并等待連接請求 。 實例化一個ServerSocket對象偵聽端口并接受請求354.3.2 ServerSocket演示案例n 處理連接處理連接 封裝輸入輸出流業(yè)務(wù)處理釋放相關(guān)資源364.3.3 ServerSocket總結(jié)回顧一下創(chuàng)建和使用 ServerSocket 的步驟:用一個您想讓它偵聽傳入客戶機(jī)連接的端口來實例化一個 Se

34、rverSocket(如有問題則拋出 Exception)。 調(diào)用 ServerSocket 的 accept() 以在等待連接期間造成阻塞。 獲取位于該底層 Socket 的流以進(jìn)行讀寫操作。按使事情簡單化的原則包裝流。 1.對 Socket 進(jìn)行讀寫。關(guān)閉打開的流(并請記住,永遠(yuǎn)不要在關(guān)閉 Writer 之前關(guān)閉 Reader)。 思考:思考:1.1.如何實現(xiàn)啟動上述服務(wù)器端代碼如何實現(xiàn)啟動上述服務(wù)器端代碼? ? 2. 2.服務(wù)器端如何實現(xiàn)多客戶端同時連接服務(wù)器端如何實現(xiàn)多客戶端同時連接? ?37Socket高級應(yīng)用多線程服務(wù)器如何處理多個連接請求?案例分析帶連接池的服務(wù)器背景分析案例分析

35、385.1.1如何處理多個連接請求?處理方法:將服務(wù)器寫成多線程的,不同的處理線程為不同的客戶服務(wù)。主線程只負(fù)責(zé)循環(huán)等待,處理線程負(fù)責(zé)網(wǎng)絡(luò)連接,接收客戶輸入的信息。Serverclient1client2serverthread2serverthread1395.1.2 案例分析n 接受連接請求我們將在前面所講的服務(wù)器端的案例進(jìn)行重構(gòu),將期重構(gòu)成一個滿足成多并發(fā)服務(wù)器程序。指定客戶機(jī)請求的最大數(shù)目 變化重點所在405.1.2 案例分析n 處理連接:第處理連接:第 1 1 部分部分 這里我們將討論 handleConnection() 方法的結(jié)構(gòu),這個方法生成一個新的 Thread 來處理每個連

36、接。我們將分兩部分討論這個問題。這一屏我們將著重該方法本身,然后在下一屏研究該方法所使用的 ConnectionHandler 助手類的結(jié)構(gòu)。 思考思考:1.:1.與單并發(fā)處理的區(qū)別與單并發(fā)處理的區(qū)別? ? 2.ConnectionHandler 2.ConnectionHandler應(yīng)該怎么實現(xiàn)應(yīng)該怎么實現(xiàn)? ?415.1.2 案例分析n 處理連接:第處理連接:第 2 2 部分部分我們對我們對 RemoteFileServer RemoteFileServer 所做的大改動就體現(xiàn)所做的大改動就體現(xiàn)在這個方法上。我們?nèi)匀辉诜?wù)器接受一個連接之后在這個方法上。我們?nèi)匀辉诜?wù)器接受一個連接之后調(diào)用

37、調(diào)用 handleConnection() handleConnection(),但現(xiàn)在我們把該,但現(xiàn)在我們把該 Socket Socket 傳遞給傳遞給 ConnectionHandler ConnectionHandler 的一個實例,它是的一個實例,它是 Runnable Runnable 的。我們用的。我們用 ConnectionHandler ConnectionHandler 創(chuàng)建一個創(chuàng)建一個新新 Thread Thread 并啟動它。并啟動它。ConnectionHandler ConnectionHandler 的的 run() run() 方法包含方法包含Socket Soc

38、ket 讀寫和讀讀寫和讀 File File 的代碼,這些代碼的代碼,這些代碼原來在原來在 RemoteFileServer RemoteFileServer 的的 handleConnection() handleConnection() 中中。思考:如何實現(xiàn)run()方法?與前面的任務(wù)有什么區(qū)別嗎與前面的任務(wù)有什么區(qū)別嗎? ?425.1.3 案例分析總結(jié)創(chuàng)建和使用“多線程版”的服務(wù)器的步驟:修改 acceptConnections() 以用缺省為 50(或任何您想要的大于 1 的指定數(shù)字)實例化ServerSocket。 修改 ServerSocket 的 handleConnection

39、() 以用 ConnectionHandler 的一個實例生成一個新的 Thread。 一 借用 RemoteFileServer 的 handleConnection() 方法的代碼實現(xiàn) ConnectionHandler 類。 43神秘的套接字現(xiàn)實生活中的套接字客戶端原理服務(wù)器端原理發(fā)送消息到服務(wù)器端原理接收客戶端的消息原理總結(jié)java平臺套接字實現(xiàn)URLConnection類Socket類ServerSocket類總結(jié)441.2.1 現(xiàn)實生活中的套接字n 客戶端原理我們創(chuàng)建了一個 ClientSocketFacade,它是 Runnable 的并且擁有一個 Socket 實例。我們的應(yīng)用

40、程序可以用一個特定的主機(jī) IP 地址和端口號來實例化一個 ClientSocketFacade,并在一個新 Thread 中運行它。ClientSocketFacade 的 run() 方法調(diào)用 connect(),connect() 惰性初始化一個 Socket。有了 Socket 實例,我們的 ClientSocketFacade 就調(diào)用自己的 receive(),receive() 將造成阻塞直到服務(wù)器在 Socket 上發(fā)送數(shù)據(jù)。一旦服務(wù)器發(fā)送數(shù)據(jù),我們的 ClientSocketFacade 就將醒來并處理傳入的數(shù)據(jù)。數(shù)據(jù)的發(fā)送是直接的。我們的應(yīng)用程序可以通過用一個 StreamOb

41、ject 調(diào)用 send() 方法來簡單地告訴它的 ClientSocketFacade 把數(shù)據(jù)發(fā)送到服務(wù)器。上述討論中唯一遺漏的一個是 StreamAdapter。當(dāng)應(yīng)用程序告訴 ClientSocketFacade 發(fā)送數(shù)據(jù)時,該 Facade 將委派 StreamAdapter 的實例處理有關(guān)操作。ClientSocketFacade 委派 StreamAdapter 的同一個實例處理接收數(shù)據(jù)的操作。StreamAdapter 把消息加工成最終格式并將它放到 Socket 的 OutputStream 上,并以逆過程處理從 Socket 的 InputStream 傳入的消息。例如,或許

42、您的服務(wù)器需要知道發(fā)送中的消息的字節(jié)數(shù)。StreamAdapter 可以在發(fā)送之前計算消息的長度并將它附加在消息的前端。當(dāng)服務(wù)器接收消息時,同樣的 StreamAdapter 能夠剝離長度信息并讀取正確數(shù)量的字節(jié)以構(gòu)建一個 StreamReadyObject。451.2.1 現(xiàn)實生活中的套接字n 服務(wù)器端原理我們把 ServerSocket 包裝進(jìn) ServerSocketFacade,ServerSocketFacade 是 Runnable 的并且擁有一個 ServerSocket 實例。我們的應(yīng)用程序可以用一個特定的服務(wù)器端偵聽端口和客戶機(jī)連接的最大允許數(shù)目(缺省值是 50)來實例化一個

43、 ServerSocketFacade。應(yīng)用程序然后在一個新 Thread 中運行 Facade 以隱藏 ServerSocket 的交互操作細(xì)節(jié)。ServerSocketFacade 上的 run() 方法調(diào)用 acceptConnections(),acceptConnections() 創(chuàng)建一個新的 ServerSocket,并調(diào)用 ServerSocket 上的 accept() 以造成阻塞直到有客戶機(jī)請求一個連接。每當(dāng)有客戶機(jī)請求連接,我們的 ServerSocketFacade 就醒來并通過調(diào)用 handleSocket() 來把 accept() 返回的新 Socket 傳遞給

44、SocketHandler 的實例。SocketHandler 的分內(nèi)工作是處理從客戶機(jī)到服務(wù)器的新通道。461.2.1 現(xiàn)實生活中的套接字n 發(fā)送消息到服務(wù)器端原理發(fā)送消息的 UML 交互作用圖 471.2.1 現(xiàn)實生活中的套接字n 接收來自服務(wù)器的消息接收來自服務(wù)器的消息 481.2.1 現(xiàn)實生活中的套接字n 總結(jié)Java 語言簡化了套接字在應(yīng)用程序中的使用。它的基礎(chǔ)實際上是 包中的 Socket 和 ServerSocket 類。一旦您理解了表象背后發(fā)生的情況,就能容易地使用這些類。在現(xiàn)實生活中使用套接字只是這樣一件事,即通過貫徹優(yōu)秀的 OO 設(shè)計原則來保護(hù)應(yīng)用程序中各層間的封裝。我們?yōu)?/p>

45、您展示了一些有幫助的類。這些類的結(jié)構(gòu)對我們的應(yīng)用程序隱藏了 Socket 交互作用的低級細(xì)節(jié) 使應(yīng)用程序能只使用可插入的 ClientSocketFacade 和 ServerSocketFacade。在有些地方(在 Facade 內(nèi)),您仍然必須管理稍顯雜亂的字節(jié)細(xì)節(jié),但您只須做一次就可以了。更好的是,您可以在將來的項目中重用這些低級別的助手類。495.2 帶連接池的服務(wù)器n 背景分析我們現(xiàn)在已經(jīng)擁有的 MultithreadedServer 每當(dāng)有客戶機(jī)申請一個連接時都在一個新 Thread 中創(chuàng)建一個新 ConnectionHandler。這意味著可能有一捆 Thread “躺”在我們周

46、圍。而且創(chuàng)建 Thread 的系統(tǒng)開銷并不是微不足道的。如果性能成為了問題(也請不要事到臨頭才意識到它),更高效地處理我們的服務(wù)器是件好事。那么,我們?nèi)绾胃咝У毓芾矸?wù)器端呢?我們可以維護(hù)一個進(jìn)入的連接池,一定數(shù)量的 ConnectionHandler 將為它提供服務(wù)。這種設(shè)計能帶來以下好處:l 它限定了允許同時連接的數(shù)目。 l 我們只需啟動 ConnectionHandler Thread 一次 。 我們在服務(wù)器啟動時創(chuàng)建一定數(shù)量的 ConnectionHandler,我們把進(jìn)入的連接放入“池”中并讓 ConnectionHandler 打理剩下的事情。 505.2 帶連接池的服務(wù)器帶線程

47、池的服務(wù)器類結(jié)構(gòu)1.同時處理的活動客戶機(jī)連接的最大數(shù)目 2.進(jìn)入的連接的偵聽端口 3.將接受客戶機(jī)連接請求的 ServerSocket 1.啟動線程池2.接受連接請求515.2 帶連接池的服務(wù)器n 建立連接處理程序建立連接處理程序-setUpHandlers()-setUpHandlers()方法的實現(xiàn): setUpHandlers() 方法創(chuàng)建 maxConnections(例如 3)個 PooledConnectionHandler 并在新 Thread 中激活它們。用實現(xiàn)了 Runnable 的對象來創(chuàng)建 Thread 使我們可以在 Thread 調(diào)用 start() 并且可以期望在 Runnable 上調(diào)用了 run()。換句話說,我們的 PooledConnectionHandler 將等著處理進(jìn)入的連接,每個都在它自己的 Thread 中進(jìn)行。 思考:PooledConnectionHandler類如何實現(xiàn)?需要處理哪些業(yè)務(wù)?525.2 帶連接池的服務(wù)器PooledConnectionHandler的類結(jié)構(gòu):該類有兩個實例變量: connection 是當(dāng)前正在處理的 Socket 1. 名為 pool 的靜態(tài) LinkedList 保存需被處理的連接 將把傳入請求添加到池中,將把傳入請求添加到池中,并告訴其它正在等待的對象并告訴其它正在等待的

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論