java網(wǎng)絡(luò)程序設(shè)計(jì)第4章_第1頁(yè)
java網(wǎng)絡(luò)程序設(shè)計(jì)第4章_第2頁(yè)
java網(wǎng)絡(luò)程序設(shè)計(jì)第4章_第3頁(yè)
java網(wǎng)絡(luò)程序設(shè)計(jì)第4章_第4頁(yè)
java網(wǎng)絡(luò)程序設(shè)計(jì)第4章_第5頁(yè)
已閱讀5頁(yè),還剩27頁(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)介

第4章套接字套接字概述套接字(Socket)是由加利福尼亞大學(xué)伯克利分校(UniversityofCalifornia,Berkeley)首創(chuàng)的,它允許程序把網(wǎng)絡(luò)連接看成一個(gè)流(Stream),可以向這個(gè)流寫字節(jié),也可以從這個(gè)流讀取字節(jié)。套接字為程序員屏蔽了網(wǎng)絡(luò)的底層細(xì)節(jié),例如媒體類型、信息包的大小、網(wǎng)絡(luò)地址、信息的重發(fā)等。套接字概述Socket是網(wǎng)絡(luò)上運(yùn)行的兩個(gè)程序間雙向通信的一端,它既可以接受請(qǐng)求,也可以發(fā)送請(qǐng)求,利用它可以較為方便地編寫程序使數(shù)據(jù)在網(wǎng)絡(luò)傳遞。

.Socket類是Java的基礎(chǔ)類,用于執(zhí)行客戶端的TCP操作。套接字有兩種:一種套接字在服務(wù)器端創(chuàng)建,叫做服務(wù)器套接字(ServerSocket);還有一種在客戶端被創(chuàng)建,就是客戶端套接字。套接字概述可以認(rèn)為Socket是應(yīng)用程序創(chuàng)建的一個(gè)港口碼頭,應(yīng)用程序只要把裝著貨物的集裝箱(要發(fā)送的數(shù)據(jù))放在碼頭上,就算完成了貨物的運(yùn)送,剩下的工作就由貨運(yùn)公司(驅(qū)動(dòng)程序)去處理了。對(duì)接收方來(lái)說(shuō),應(yīng)用程序也要?jiǎng)?chuàng)建一個(gè)碼頭,然后就一直等待該碼頭的貨物到達(dá),最后從碼頭上取走貨物(數(shù)據(jù))。

套接字概述Socket在應(yīng)用程序中創(chuàng)建,通過(guò)一個(gè)綁定機(jī)制與驅(qū)動(dòng)程序建立關(guān)系,告訴自己所對(duì)應(yīng)的IP和Port。此后,應(yīng)用程序送給Socket的數(shù)據(jù),由Socket交給驅(qū)動(dòng)程序向網(wǎng)絡(luò)上發(fā)送。計(jì)算機(jī)從網(wǎng)絡(luò)收到與該Socket綁定的IP+Port相關(guān)數(shù)據(jù)后,由驅(qū)動(dòng)程序交給Socket,應(yīng)用程序便可以從該Sokcet中取得接收到的數(shù)據(jù)。套接字概述Socket能執(zhí)行7種基本操作:連接到遠(yuǎn)程機(jī)器。綁定到端口。接收從遠(yuǎn)程機(jī)器來(lái)的綁定端口上的連接。監(jiān)聽到達(dá)的數(shù)據(jù)。發(fā)送數(shù)據(jù)。接收數(shù)據(jù)。關(guān)閉連接。4.1客戶端套接字(Socket)當(dāng)客戶程序需要與服務(wù)器程序通訊的時(shí)候,客戶程序在客戶機(jī)通過(guò)構(gòu)造函數(shù)創(chuàng)建一個(gè)Socket對(duì)象。publicSocket(Stringhost,intport)throwsunknownHostExceptionIOException這個(gè)方法建立一個(gè)到主機(jī)host、端口號(hào)為port的套接字,連接到遠(yuǎn)程主機(jī)。4.1客戶端套接字(Socket)try{Socketsoc=newSocket("",9090);….//發(fā)送數(shù)據(jù)}catch(unknownHostExceptionuex){}catch(IOExceptione){}4.1客戶端套接字(Socket)publicInputStreamgetInputStream()throwsIOException這個(gè)方法返回一個(gè)輸入流,利用這個(gè)流就可以從套接字讀取數(shù)據(jù)。通常鏈接這個(gè)流到一個(gè)BufferedInputStream或者BufferedReader。publicOutputStreamgetOutputStream()throwsIOException返回一個(gè)原始的OutputStream,可以從應(yīng)用程序?qū)憯?shù)據(jù)到套接字的另一端。通常將它鏈接到DataOutputStream或者OutputStreamWriter等更方便的類,還可以利用緩沖。4.1客戶端套接字(Socket)publicintgetPort()返回Socket連接到遠(yuǎn)程主機(jī)的端口號(hào)。publicintgetLocalPort()

一個(gè)Socket連接兩個(gè)終端,方法getLocalPort()返回本地連接終端的端口號(hào)。4.2服務(wù)器套接字(ServerSocket)每個(gè)服務(wù)器套接字運(yùn)行在服務(wù)器上特定的端口,監(jiān)聽在這個(gè)端口的TCP連接。當(dāng)遠(yuǎn)程客戶端的Socket試圖與服務(wù)器指定端口建立連接時(shí),服務(wù)器被激活,判定客戶程序的連接,并打開兩個(gè)主機(jī)之間固有的連接。一旦客戶端與服務(wù)器建立了連接,則兩者之間就可以傳送數(shù)據(jù),而數(shù)據(jù)是通過(guò)這個(gè)固有的套接字傳遞的。ServerSocket的工作過(guò)程用ServerSocket()方法在指定端口創(chuàng)建一個(gè)新的ServerSocket對(duì)象。ServerSocket對(duì)象調(diào)用accept()方法在指定的端口監(jiān)聽到來(lái)的連接。accept()一直處于阻塞狀態(tài),直到有客戶端試圖建立連接。這時(shí)accept()方法返回連接客戶端與服務(wù)器的Socket對(duì)象。調(diào)用getInputStream()方法或者getOutputStream()方法或者兩者全調(diào)用建立與客戶端交互的輸入流和輸出流。具體情況要看服務(wù)器的類型而定。服務(wù)器與客戶端根據(jù)一定的協(xié)議交互,直到關(guān)閉連接。服務(wù)器、客戶機(jī)或者兩者都關(guān)閉連接。服務(wù)器回到第2步,繼續(xù)監(jiān)聽下一次的連接。

4.2服務(wù)器套接字(ServerSocket)ServerSocket構(gòu)造函數(shù)中最簡(jiǎn)單的是ServerSocket(intport),當(dāng)使用它創(chuàng)建一個(gè)ServerSocket對(duì)象,port參數(shù)傳遞端口號(hào),這個(gè)端口就是服務(wù)器監(jiān)聽連接請(qǐng)求的端口,如果在這時(shí)出現(xiàn)錯(cuò)誤將拋出IOException異常對(duì)象,否則將創(chuàng)建ServerSocket對(duì)象并開始準(zhǔn)備接收連接請(qǐng)求。這里端口號(hào)port須與客戶端指定的一致。默認(rèn)最大連接數(shù)目為504.2服務(wù)器套接字(ServerSocket)ServerSocketserver=newServerSocket(9090);While(true){ Socketconnection=server.accept();OutputStreamout=newOutputStream(connection.getOutputStream()); out.write("thejavanetworking"); connection.close();}4.2服務(wù)器套接字(ServerSocket)接下來(lái)服務(wù)程序進(jìn)入無(wú)限循環(huán)之中,無(wú)限循環(huán)從調(diào)用ServerSocket的accept()方法開始,在調(diào)用開始后accept()方法將導(dǎo)致調(diào)用線程阻塞直到連接建立。在建立連接后accept()返回一個(gè)最近創(chuàng)建的Socket對(duì)象,該Socket對(duì)象綁定了客戶程序的IP地址或端口號(hào)。4.2服務(wù)器套接字(ServerSocket)publicServerSocket(intport,intqueuelength)throwsIOExceptionBindException構(gòu)造方法允許指定端口,用來(lái)保存到來(lái)連接請(qǐng)求隊(duì)列的長(zhǎng)度,綁定本地網(wǎng)絡(luò)的地址。4.2服務(wù)器套接字(ServerSocket)如果想在端口5300創(chuàng)建一個(gè)服務(wù)器端口,同時(shí)使隊(duì)列中所能存儲(chǔ)的到來(lái)的請(qǐng)求數(shù)為100,則示范代碼如下:try{ServerSocketsocket=newServerSocket(5300,100);}catch(IOExceptione){//異常處理}4.3利用Socket進(jìn)行網(wǎng)絡(luò)編程Socket可以理解為客戶端或者服務(wù)器端的一個(gè)特殊的對(duì)象,這個(gè)對(duì)象有兩個(gè)關(guān)鍵的方法,一個(gè)是getInputStream()方法,另一個(gè)是getOutputStream()方法。getInputStream()方法可以得到一個(gè)輸入流,客戶端的Socket對(duì)象上的getInputStream()方法得到的輸入流其實(shí)就是從服務(wù)器端發(fā)回的數(shù)據(jù)流。getOutputStream()方法得到一個(gè)輸出流,客戶端Socket對(duì)象上的getOutputStream()方法返回的輸出流就是將要發(fā)送到服務(wù)器端的數(shù)據(jù)流服務(wù)器端使用ServerSocket監(jiān)聽指定的端口,端口可以隨意指定(由于1024以下的端口通常屬于保留端口,在一些操作系統(tǒng)中不可以隨意使用,所以建議使用大于1024的端口),等待客戶連接請(qǐng)求,客戶連接后,會(huì)話產(chǎn)生;在完成會(huì)話后,關(guān)閉連接??蛻舳耸褂肧ocket對(duì)網(wǎng)絡(luò)上某一個(gè)服務(wù)器的某一個(gè)端口發(fā)出連接請(qǐng)求,一旦連接成功,打開會(huì)話;會(huì)話完成后,關(guān)閉Socket??蛻舳瞬恍枰付ù蜷_的端口,通常臨時(shí)的、動(dòng)態(tài)的分配一個(gè)1024以上的端口。編寫服務(wù)器程序ServerSocketserver=null;try{ server=newServerSocket(PortNumber); } }catch(IOExceptionioe){ ioe.printStackTrace(); }編寫客戶程序Socketclient=null;try{client=newSocket(“host”,PortNumber);}catch(UnknowHostExceptionuhe){uhe.PrintStackTrace();}catch(IOExceptione){e.PrintStackTrace();}創(chuàng)建一個(gè)數(shù)據(jù)輸入流BufferedReaderis=null;try{is=newBufferedReader(newInputStreamReader(client.getInputStream()));}catch(IOExceptione){e.printStackTrace();}創(chuàng)建一個(gè)數(shù)據(jù)輸出流DataOutputStreamos=null;try{ os=newDataOutputStream(client.getOutputStream()); }catch(IOExceptione){e.printStackTrace();}4.4Socket編程示例【例4-1】在本程序中,客戶端從命令行輸入一個(gè)半徑值并傳送到服務(wù)器。服務(wù)器根據(jù)這個(gè)半徑值,計(jì)算出圓面積發(fā)送給客戶,客戶端顯示這個(gè)值;客戶端輸入“bye”命令將結(jié)束通信。4.4Socket編程示例

while(goon){outStr=buf.readLine();//讀入用戶的輸入

outToServer.writeUTF(outStr);//寫到socket中

outToServer.flush();//清空緩沖區(qū),立即發(fā)送

inStr=inFromServer.readUTF();//從socket中讀數(shù)據(jù)

if(!inStr.equals("bye"))System.out.println("從服務(wù)器返回的結(jié)果是"+inStr);elsegoon=false;}簡(jiǎn)單的聊天程序

publicvoidactionPerformed(ActionEvente){Strings=msgText.getText();if(s.length()>0){try{outToClient.writeUTF(s);outToClient.flush();showArea.append("我說(shuō):"+msgText.getText()+"\n");msgText.setText(null);}catch(IOExceptionel){showArea.append("你的消息:“"+msgText.getText()+"”未能發(fā)送出去\n");}}

簡(jiǎn)單的聊天程序

publicvoidrun(){try{while(true){showArea.append("對(duì)方說(shuō):"+inFromClient.readUTF()+"\n");Thread.sleep(1000);}}catch(IOExceptionel){}catch(InterruptedExceptione){}}}本章小結(jié)Socket是TCP/IP中的基本概念,它負(fù)責(zé)將TCP/IP包發(fā)送到指定的IP地址。也可以看成是在兩個(gè)程序進(jìn)行通信連接中的一個(gè)端點(diǎn),一個(gè)程序?qū)⑿畔懭隨ocket中(類似于插座),該Socket將這段信息發(fā)送到另一個(gè)Socket中(類似于插頭),使這段信息能夠傳送到其他程序。這兩端的程序可以是在一臺(tái)計(jì)算機(jī)上,也可以在因特網(wǎng)的遠(yuǎn)程計(jì)算機(jī)上。本章小結(jié)(1)首先調(diào)用ServerSocket類以某個(gè)端口號(hào)為參數(shù),創(chuàng)建一個(gè)ServerSocket對(duì)象。(2)服務(wù)器端程序使用ServerSocket

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論