




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第4章套接字套接字概述套接字(Socket)是由加利福尼亞大學伯克利分校(UniversityofCalifornia,Berkeley)首創(chuàng)的,它允許程序把網絡連接看成一個流(Stream),可以向這個流寫字節(jié),也可以從這個流讀取字節(jié)。套接字為程序員屏蔽了網絡的底層細節(jié),例如媒體類型、信息包的大小、網絡地址、信息的重發(fā)等。套接字概述Socket是網絡上運行的兩個程序間雙向通信的一端,它既可以接受請求,也可以發(fā)送請求,利用它可以較為方便地編寫程序使數據在網絡傳遞。
.Socket類是Java的基礎類,用于執(zhí)行客戶端的TCP操作。套接字有兩種:一種套接字在服務器端創(chuàng)建,叫做服務器套接字(ServerSocket);還有一種在客戶端被創(chuàng)建,就是客戶端套接字。套接字概述可以認為Socket是應用程序創(chuàng)建的一個港口碼頭,應用程序只要把裝著貨物的集裝箱(要發(fā)送的數據)放在碼頭上,就算完成了貨物的運送,剩下的工作就由貨運公司(驅動程序)去處理了。對接收方來說,應用程序也要創(chuàng)建一個碼頭,然后就一直等待該碼頭的貨物到達,最后從碼頭上取走貨物(數據)。
套接字概述Socket在應用程序中創(chuàng)建,通過一個綁定機制與驅動程序建立關系,告訴自己所對應的IP和Port。此后,應用程序送給Socket的數據,由Socket交給驅動程序向網絡上發(fā)送。計算機從網絡收到與該Socket綁定的IP+Port相關數據后,由驅動程序交給Socket,應用程序便可以從該Sokcet中取得接收到的數據。套接字概述Socket能執(zhí)行7種基本操作:連接到遠程機器。綁定到端口。接收從遠程機器來的綁定端口上的連接。監(jiān)聽到達的數據。發(fā)送數據。接收數據。關閉連接。4.1客戶端套接字(Socket)當客戶程序需要與服務器程序通訊的時候,客戶程序在客戶機通過構造函數創(chuàng)建一個Socket對象。publicSocket(Stringhost,intport)throwsunknownHostExceptionIOException這個方法建立一個到主機host、端口號為port的套接字,連接到遠程主機。4.1客戶端套接字(Socket)try{Socketsoc=newSocket("",9090);….//發(fā)送數據}catch(unknownHostExceptionuex){}catch(IOExceptione){}4.1客戶端套接字(Socket)publicInputStreamgetInputStream()throwsIOException這個方法返回一個輸入流,利用這個流就可以從套接字讀取數據。通常鏈接這個流到一個BufferedInputStream或者BufferedReader。publicOutputStreamgetOutputStream()throwsIOException返回一個原始的OutputStream,可以從應用程序寫數據到套接字的另一端。通常將它鏈接到DataOutputStream或者OutputStreamWriter等更方便的類,還可以利用緩沖。4.1客戶端套接字(Socket)publicintgetPort()返回Socket連接到遠程主機的端口號。publicintgetLocalPort()
一個Socket連接兩個終端,方法getLocalPort()返回本地連接終端的端口號。4.2服務器套接字(ServerSocket)每個服務器套接字運行在服務器上特定的端口,監(jiān)聽在這個端口的TCP連接。當遠程客戶端的Socket試圖與服務器指定端口建立連接時,服務器被激活,判定客戶程序的連接,并打開兩個主機之間固有的連接。一旦客戶端與服務器建立了連接,則兩者之間就可以傳送數據,而數據是通過這個固有的套接字傳遞的。ServerSocket的工作過程用ServerSocket()方法在指定端口創(chuàng)建一個新的ServerSocket對象。ServerSocket對象調用accept()方法在指定的端口監(jiān)聽到來的連接。accept()一直處于阻塞狀態(tài),直到有客戶端試圖建立連接。這時accept()方法返回連接客戶端與服務器的Socket對象。調用getInputStream()方法或者getOutputStream()方法或者兩者全調用建立與客戶端交互的輸入流和輸出流。具體情況要看服務器的類型而定。服務器與客戶端根據一定的協(xié)議交互,直到關閉連接。服務器、客戶機或者兩者都關閉連接。服務器回到第2步,繼續(xù)監(jiān)聽下一次的連接。
4.2服務器套接字(ServerSocket)ServerSocket構造函數中最簡單的是ServerSocket(intport),當使用它創(chuàng)建一個ServerSocket對象,port參數傳遞端口號,這個端口就是服務器監(jiān)聽連接請求的端口,如果在這時出現錯誤將拋出IOException異常對象,否則將創(chuàng)建ServerSocket對象并開始準備接收連接請求。這里端口號port須與客戶端指定的一致。默認最大連接數目為504.2服務器套接字(ServerSocket)ServerSocketserver=newServerSocket(9090);While(true){ Socketconnection=server.accept();OutputStreamout=newOutputStream(connection.getOutputStream()); out.write("thejavanetworking"); connection.close();}4.2服務器套接字(ServerSocket)接下來服務程序進入無限循環(huán)之中,無限循環(huán)從調用ServerSocket的accept()方法開始,在調用開始后accept()方法將導致調用線程阻塞直到連接建立。在建立連接后accept()返回一個最近創(chuàng)建的Socket對象,該Socket對象綁定了客戶程序的IP地址或端口號。4.2服務器套接字(ServerSocket)publicServerSocket(intport,intqueuelength)throwsIOExceptionBindException構造方法允許指定端口,用來保存到來連接請求隊列的長度,綁定本地網絡的地址。4.2服務器套接字(ServerSocket)如果想在端口5300創(chuàng)建一個服務器端口,同時使隊列中所能存儲的到來的請求數為100,則示范代碼如下:try{ServerSocketsocket=newServerSocket(5300,100);}catch(IOExceptione){//異常處理}4.3利用Socket進行網絡編程Socket可以理解為客戶端或者服務器端的一個特殊的對象,這個對象有兩個關鍵的方法,一個是getInputStream()方法,另一個是getOutputStream()方法。getInputStream()方法可以得到一個輸入流,客戶端的Socket對象上的getInputStream()方法得到的輸入流其實就是從服務器端發(fā)回的數據流。getOutputStream()方法得到一個輸出流,客戶端Socket對象上的getOutputStream()方法返回的輸出流就是將要發(fā)送到服務器端的數據流服務器端使用ServerSocket監(jiān)聽指定的端口,端口可以隨意指定(由于1024以下的端口通常屬于保留端口,在一些操作系統(tǒng)中不可以隨意使用,所以建議使用大于1024的端口),等待客戶連接請求,客戶連接后,會話產生;在完成會話后,關閉連接??蛻舳耸褂肧ocket對網絡上某一個服務器的某一個端口發(fā)出連接請求,一旦連接成功,打開會話;會話完成后,關閉Socket。客戶端不需要指定打開的端口,通常臨時的、動態(tài)的分配一個1024以上的端口。編寫服務器程序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)建一個數據輸入流BufferedReaderis=null;try{is=newBufferedReader(newInputStreamReader(client.getInputStream()));}catch(IOExceptione){e.printStackTrace();}創(chuàng)建一個數據輸出流DataOutputStreamos=null;try{ os=newDataOutputStream(client.getOutputStream()); }catch(IOExceptione){e.printStackTrace();}4.4Socket編程示例【例4-1】在本程序中,客戶端從命令行輸入一個半徑值并傳送到服務器。服務器根據這個半徑值,計算出圓面積發(fā)送給客戶,客戶端顯示這個值;客戶端輸入“bye”命令將結束通信。4.4Socket編程示例
while(goon){outStr=buf.readLine();//讀入用戶的輸入
outToServer.writeUTF(outStr);//寫到socket中
outToServer.flush();//清空緩沖區(qū),立即發(fā)送
inStr=inFromServer.readUTF();//從socket中讀數據
if(!inStr.equals("bye"))System.out.println("從服務器返回的結果是"+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){}}}本章小結Socket是TCP/IP中的基本概念,它負責將TCP/IP包發(fā)送到指定的IP地址。也可以看成是在兩個程序進行通信連接中的一個端點,一個程序將信息寫入Socket中(類似于插座),該Socket將這段信息發(fā)送到另一個Socket中(類似于插頭),使這段信息能夠傳送到其他程序。這兩端的程序可以是在一臺計算機上,也可以在因特網的遠程計算機上。本章小結(1)首先調用ServerSocket類以某個端口號為參數,創(chuàng)建一個ServerSocket對象。(2)服務器端程序使用ServerSocket
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 移動公司退費管理辦法
- 舟山企業(yè)能耗管理辦法
- 土壤檢測資質管理辦法
- 肩周炎的中醫(yī)治療
- 肥胖慢病課件
- 廣東24年一模數學試卷
- 瘋狂李老師課堂數學試卷
- 巔峰訓練初一數學試卷
- 東林中學數學試卷
- 廣東到福建中考數學試卷
- 外賣餐飲平臺管理制度
- 2025年青浦區(qū)區(qū)管企業(yè)統(tǒng)一招聘55人筆試參考題庫附帶答案詳解
- 2025年河南省鐵路建設投資集團有限公司招聘筆試參考題庫附帶答案詳解
- 2025年中考語文作文終極押題(附范文5篇)
- 一網一平臺電大《西方經濟學(經濟學)》形考任務1-6終結性考試題庫答案
- 股權質押合同違約處理協(xié)議
- 初中德育教育家長會
- 道路危險貨物運輸企業(yè)安全風險辨識清單
- 2025春季學期國開電大??啤豆芾碛⒄Z1》一平臺在線形考(綜合測試)試題及答案
- 2025CSCO膽道惡性腫瘤診療指南解讀
- 2025年國家保安員試考試題庫(附答案)
評論
0/150
提交評論