




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第4章套接字套接字概述套接字(Socket)是由加利福尼亞大學伯克利分校(UniversityofCalifornia,Berkeley)首創(chuàng)的,它允許程序把網(wǎng)絡(luò)連接看成一個流(Stream),可以向這個流寫字節(jié),也可以從這個流讀取字節(jié)。套接字為程序員屏蔽了網(wǎng)絡(luò)的底層細節(jié),例如媒體類型、信息包的大小、網(wǎng)絡(luò)地址、信息的重發(fā)等。套接字概述Socket是網(wǎng)絡(luò)上運行的兩個程序間雙向通信的一端,它既可以接受請求,也可以發(fā)送請求,利用它可以較為方便地編寫程序使數(shù)據(jù)在網(wǎng)絡(luò)傳遞。
.Socket類是Java的基礎(chǔ)類,用于執(zhí)行客戶端的TCP操作。套接字有兩種:一種套接字在服務(wù)器端創(chuàng)建,叫做服務(wù)器套接字(ServerSocket);還有一種在客戶端被創(chuàng)建,就是客戶端套接字。套接字概述可以認為Socket是應(yīng)用程序創(chuàng)建的一個港口碼頭,應(yīng)用程序只要把裝著貨物的集裝箱(要發(fā)送的數(shù)據(jù))放在碼頭上,就算完成了貨物的運送,剩下的工作就由貨運公司(驅(qū)動程序)去處理了。對接收方來說,應(yīng)用程序也要創(chuàng)建一個碼頭,然后就一直等待該碼頭的貨物到達,最后從碼頭上取走貨物(數(shù)據(jù))。
套接字概述Socket在應(yīng)用程序中創(chuàng)建,通過一個綁定機制與驅(qū)動程序建立關(guān)系,告訴自己所對應(yīng)的IP和Port。此后,應(yīng)用程序送給Socket的數(shù)據(jù),由Socket交給驅(qū)動程序向網(wǎng)絡(luò)上發(fā)送。計算機從網(wǎng)絡(luò)收到與該Socket綁定的IP+Port相關(guān)數(shù)據(jù)后,由驅(qū)動程序交給Socket,應(yīng)用程序便可以從該Sokcet中取得接收到的數(shù)據(jù)。套接字概述Socket能執(zhí)行7種基本操作:連接到遠程機器。綁定到端口。接收從遠程機器來的綁定端口上的連接。監(jiān)聽到達的數(shù)據(jù)。發(fā)送數(shù)據(jù)。接收數(shù)據(jù)。關(guān)閉連接。4.1客戶端套接字(Socket)當客戶程序需要與服務(wù)器程序通訊的時候,客戶程序在客戶機通過構(gòu)造函數(shù)創(chuàng)建一個Socket對象。publicSocket(Stringhost,intport)throwsunknownHostExceptionIOException這個方法建立一個到主機host、端口號為port的套接字,連接到遠程主機。4.1客戶端套接字(Socket)try{Socketsoc=newSocket("",9090);….//發(fā)送數(shù)據(jù)}catch(unknownHostExceptionuex){}catch(IOExceptione){}4.1客戶端套接字(Socket)publicInputStreamgetInputStream()throwsIOException這個方法返回一個輸入流,利用這個流就可以從套接字讀取數(shù)據(jù)。通常鏈接這個流到一個BufferedInputStream或者BufferedReader。publicOutputStreamgetOutputStream()throwsIOException返回一個原始的OutputStream,可以從應(yīng)用程序?qū)憯?shù)據(jù)到套接字的另一端。通常將它鏈接到DataOutputStream或者OutputStreamWriter等更方便的類,還可以利用緩沖。4.1客戶端套接字(Socket)publicintgetPort()返回Socket連接到遠程主機的端口號。publicintgetLocalPort()
一個Socket連接兩個終端,方法getLocalPort()返回本地連接終端的端口號。4.2服務(wù)器套接字(ServerSocket)每個服務(wù)器套接字運行在服務(wù)器上特定的端口,監(jiān)聽在這個端口的TCP連接。當遠程客戶端的Socket試圖與服務(wù)器指定端口建立連接時,服務(wù)器被激活,判定客戶程序的連接,并打開兩個主機之間固有的連接。一旦客戶端與服務(wù)器建立了連接,則兩者之間就可以傳送數(shù)據(jù),而數(shù)據(jù)是通過這個固有的套接字傳遞的。ServerSocket的工作過程用ServerSocket()方法在指定端口創(chuàng)建一個新的ServerSocket對象。ServerSocket對象調(diào)用accept()方法在指定的端口監(jiān)聽到來的連接。accept()一直處于阻塞狀態(tài),直到有客戶端試圖建立連接。這時accept()方法返回連接客戶端與服務(wù)器的Socket對象。調(diào)用getInputStream()方法或者getOutputStream()方法或者兩者全調(diào)用建立與客戶端交互的輸入流和輸出流。具體情況要看服務(wù)器的類型而定。服務(wù)器與客戶端根據(jù)一定的協(xié)議交互,直到關(guān)閉連接。服務(wù)器、客戶機或者兩者都關(guān)閉連接。服務(wù)器回到第2步,繼續(xù)監(jiān)聽下一次的連接。
4.2服務(wù)器套接字(ServerSocket)ServerSocket構(gòu)造函數(shù)中最簡單的是ServerSocket(intport),當使用它創(chuàng)建一個ServerSocket對象,port參數(shù)傳遞端口號,這個端口就是服務(wù)器監(jiān)聽連接請求的端口,如果在這時出現(xiàn)錯誤將拋出IOException異常對象,否則將創(chuàng)建ServerSocket對象并開始準備接收連接請求。這里端口號port須與客戶端指定的一致。默認最大連接數(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)接下來服務(wù)程序進入無限循環(huán)之中,無限循環(huán)從調(diào)用ServerSocket的accept()方法開始,在調(diào)用開始后accept()方法將導(dǎo)致調(diào)用線程阻塞直到連接建立。在建立連接后accept()返回一個最近創(chuàng)建的Socket對象,該Socket對象綁定了客戶程序的IP地址或端口號。4.2服務(wù)器套接字(ServerSocket)publicServerSocket(intport,intqueuelength)throwsIOExceptionBindException構(gòu)造方法允許指定端口,用來保存到來連接請求隊列的長度,綁定本地網(wǎng)絡(luò)的地址。4.2服務(wù)器套接字(ServerSocket)如果想在端口5300創(chuàng)建一個服務(wù)器端口,同時使隊列中所能存儲的到來的請求數(shù)為100,則示范代碼如下:try{ServerSocketsocket=newServerSocket(5300,100);}catch(IOExceptione){//異常處理}4.3利用Socket進行網(wǎng)絡(luò)編程Socket可以理解為客戶端或者服務(wù)器端的一個特殊的對象,這個對象有兩個關(guān)鍵的方法,一個是getInputStream()方法,另一個是getOutputStream()方法。getInputStream()方法可以得到一個輸入流,客戶端的Socket對象上的getInputStream()方法得到的輸入流其實就是從服務(wù)器端發(fā)回的數(shù)據(jù)流。getOutputStream()方法得到一個輸出流,客戶端Socket對象上的getOutputStream()方法返回的輸出流就是將要發(fā)送到服務(wù)器端的數(shù)據(jù)流服務(wù)器端使用ServerSocket監(jiān)聽指定的端口,端口可以隨意指定(由于1024以下的端口通常屬于保留端口,在一些操作系統(tǒng)中不可以隨意使用,所以建議使用大于1024的端口),等待客戶連接請求,客戶連接后,會話產(chǎn)生;在完成會話后,關(guān)閉連接??蛻舳耸褂肧ocket對網(wǎng)絡(luò)上某一個服務(wù)器的某一個端口發(fā)出連接請求,一旦連接成功,打開會話;會話完成后,關(guān)閉Socket??蛻舳瞬恍枰付ù蜷_的端口,通常臨時的、動態(tài)的分配一個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)建一個數(shù)據(jù)輸入流BufferedReaderis=null;try{is=newBufferedReader(newInputStreamReader(client.getInputStream()));}catch(IOExceptione){e.printStackTrace();}創(chuàng)建一個數(shù)據(jù)輸出流DataOutputStreamos=null;try{ os=newDataOutputStream(client.getOutputStream()); }catch(IOExceptione){e.printStackTrace();}4.4Socket編程示例【例4-1】在本程序中,客戶端從命令行輸入一個半徑值并傳送到服務(wù)器。服務(wù)器根據(jù)這個半徑值,計算出圓面積發(fā)送給客戶,客戶端顯示這個值;客戶端輸入“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;}簡單的聊天程序
publicvoidactionPerformed(ActionEvente){Strings=msgText.getText();if(s.length()>0){try{outToClient.writeUTF(s);outToClient.flush();showArea.append("我說:"+msgText.getText()+"\n");msgText.setText(null);}catch(IOExceptionel){showArea.append("你的消息:“"+msgText.getText()+"”未能發(fā)送出去\n");}}
簡單的聊天程序
publicvoidrun(){try{while(true){showArea.append("對方說:"+inFromClient.readUTF()+"\n");Thread.sleep(1000);}}catch(IOExceptionel){}catch(InterruptedExceptione){}}}本章小結(jié)Socket是TCP/IP中的基本概念,它負責將TCP/IP包發(fā)送到指定的IP地址。也可以看成是在兩個程序進行通信連接中的一個端點,一個程序?qū)⑿畔懭隨ocket中(類似于插座),該Socket將這段信息發(fā)送到另一個Socket中(類似于插頭),使這段信息能夠傳送到其他程序。這兩端的程序可以是在一臺計算機上,也可以在因特網(wǎng)的遠程計算機上。本章小結(jié)(1)首先調(diào)用ServerSocket類以某個端口號為參數(shù),創(chuàng)建一個ServerSocket對象。(2)服務(wù)器端程序使用ServerSocket
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年保安證考試前期準備試題及答案
- 做好準備的保安證考試試題及答案
- 政府投資項目可行性研究報告編寫大綱
- 2025年保安證考試相關(guān)法規(guī)試題及答案
- 商丘醫(yī)學高等??茖W?!痘@球理論與實踐》2023-2024學年第二學期期末試卷
- 云浮市云城區(qū)2024-2025學年數(shù)學三下期末達標檢測試題含解析
- 合肥學院《遠程教育學》2023-2024學年第二學期期末試卷
- 華東師大版2025年高三化學試題第一次聯(lián)考試題含解析
- 貴州工業(yè)職業(yè)技術(shù)學院《鋼琴即興伴奏(4)》2023-2024學年第一學期期末試卷
- 保安證考試復(fù)習的黃金法則試題及答案
- 中國詩詞線索題
- 數(shù)學家華羅庚課件
- 西方經(jīng)濟學考試題庫(含參考答案)
- 2024至2030年中國冷鐓鋼行業(yè)市場全景分析及投資前景展望報告
- 國企集團公司各崗位廉潔風險點防控表格(廉政)范本
- 中醫(yī)師承跟師筆記50篇
- GB/T 44099-2024學生基本運動能力測評規(guī)范
- 上海高中自招簡歷模板范文
- 施工技術(shù)創(chuàng)新實施措施方案
- 滬教版八年級英語下冊Unit8-Life-in-the-future課件
- 部編版語文二年級下冊第三單元教材解讀大單元集體備課
評論
0/150
提交評論