![Java網(wǎng)絡(luò)程序設(shè)計 課件 單元9-04Socket編程_第1頁](http://file4.renrendoc.com/view12/M04/09/13/wKhkGWaiI5GAW9jEAAGiYQkDpNc647.jpg)
![Java網(wǎng)絡(luò)程序設(shè)計 課件 單元9-04Socket編程_第2頁](http://file4.renrendoc.com/view12/M04/09/13/wKhkGWaiI5GAW9jEAAGiYQkDpNc6472.jpg)
![Java網(wǎng)絡(luò)程序設(shè)計 課件 單元9-04Socket編程_第3頁](http://file4.renrendoc.com/view12/M04/09/13/wKhkGWaiI5GAW9jEAAGiYQkDpNc6473.jpg)
![Java網(wǎng)絡(luò)程序設(shè)計 課件 單元9-04Socket編程_第4頁](http://file4.renrendoc.com/view12/M04/09/13/wKhkGWaiI5GAW9jEAAGiYQkDpNc6474.jpg)
![Java網(wǎng)絡(luò)程序設(shè)計 課件 單元9-04Socket編程_第5頁](http://file4.renrendoc.com/view12/M04/09/13/wKhkGWaiI5GAW9jEAAGiYQkDpNc6475.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Socket編程單元九基于TCP的Socket編程目錄CONTENTS1基于UDP的Socket編程29.4.1基于TCP的Socket編程
根據(jù)ServerSocket用于服務(wù)器端,而Socket是建立網(wǎng)絡(luò)連接時使用的。在連接成功時,應(yīng)用程序兩端都會產(chǎn)生一個Socket實例,操作這個實例,完成所需的會話。對于一個網(wǎng)絡(luò)連接來說,套接字是平等的,不因為在服務(wù)器端或在客戶端而產(chǎn)生不同級別。不管是Socket還是ServerSocket,它們的工作都是通過Socketlmp1類及其子類完成的。關(guān)于Socket、ServerSocket及Socketlmp1類的具體方法,這里不再一一介紹,需要這些類時,請大家自行查閱JDKAPI文檔。9.4.1基于TCP的Socket編程
圖9.7展示了基于TCP的Socket編程的示意圖。圖9.7基于TCP的Socket編程
在服務(wù)器端,創(chuàng)建一個ServerSocket對象,并指定一個端口號,使用ServerSocket類的accept()服務(wù)器處于阻塞狀態(tài),等待用戶請求。
在客戶端,通過指定一個InetAddress對象和一個端口號,創(chuàng)建一個Socket對象,通過這個Socket對象,連接到服務(wù)器。9.4.1基于TCP的Socket編程
首先我們來看服務(wù)器端程序,具體代碼如下:import.*;importjava.io.*;publicclassTestServer{publicsaticvoidmain(Stringargs[]){try{//創(chuàng)建一個ServerSocket對象,并端口號8888ServerSockets=newServerSocket(8888);while(true){//偵聽并接受到此套接字的連接Sockets1=s.accept();OutputStreamos=s1.getOutputStream();DataOutputStreamdos=newDataOutputStream(os);dos.writeUTF("客戶端IP:"+s1.getInetAddress().getHostAddress()+"客戶端端口號:"+s1.getPort());dos.close();sl.close();}}catch(IOExceptione){e.printStackTrace();System.out.println("程序運行出錯!");}}}9.4.1基于TCP的Socket編程
該服務(wù)器端程序的作用就是監(jiān)聽8888端口,當(dāng)有發(fā)送到本機8888端口的Socket請求時,建立輸出流,將通過accept()方法創(chuàng)建的Socket對象的IP地址和端口號輸出到客戶端。編譯、運行程序,使服務(wù)器啟動并處于監(jiān)聽狀態(tài)。下面編寫客戶端程序9.4.1基于TCP的Socket編程
import.*;importjava.io.*;publicclassTestClient{publicstaticvoidmain(Stringargs[]){try{//通過IP地址和端口號,創(chuàng)建一個Socket對象Sockets1=newSocket("127.0,0.1",8888);//建立輸入數(shù)據(jù)流InputStreamis=s1.getInputStream();DataInputStreamdis=newDataInputStream(is);System.out.println(dis.readUTF());dis.close();s1.close();}catch(ConnectExceptione){e.printStackTrace();System.err.println("服務(wù)器連接失敗!");}catch(IOExceptione){e.printStackTrace();}}}9.4.1基于TCP的Socket編程
該客戶端程序通過IP地址和端口號8888,創(chuàng)建一個客戶端Socket對象,建立輸入數(shù)據(jù)流,通過輸入數(shù)據(jù)流讀取指定1P地址和端口號上服務(wù)器端程序的輸出,并在控制臺將服務(wù)器的輸出顯示出來。編譯、運行程序,結(jié)果如圖9.8所示。圖9.8使用JavaSocket編程9.4.1基于TCP的Socket編程
在這個通過JavaSocket編程實現(xiàn)的客戶端、服務(wù)器端程序中,客戶端沒有請求的具體內(nèi)容,只要有請求,服務(wù)器就將指定的內(nèi)容發(fā)送給客戶端,客戶端將接收的內(nèi)容顯示出來。接下來對上面的案例進(jìn)行調(diào)整,服務(wù)器端可以接收客戶端請求的內(nèi)容,并顯示在服務(wù)器端控制臺上。具體服務(wù)器端程序代碼如下:importjava.io.*;import.*;publicclassTestSockServer{publicstaticvoidmain(String[]args){InputStreamin=null;OutputStreamout==null;try{ServerSockets=newServerSocket(8888);Sockets1=s.accept();in=s1.getInputStream();out=s1.getOutputStream();DataOutputStreamdos=newDataOutputStream(out);DataInputStreamdis=newDataInputStream(in);Stringstr=null;if((str=dis.readUTF())!=null){System.out.println("客戶端輸入內(nèi)容:"+str);System.out.println("客戶端IP:"+s1.getInetA,ddress().getHostAddress());System.out.println("客戶端端口號:"u+s1.getPort());}dos.writeUTF("服務(wù)器端反饋客戶端!");dis.close();dos.close();s1.olose();}catch(IOExceptione){e.printStackTrace();}}}9.4.1基于TCP的Socket編程
客戶端代碼如下:import.*;importjava.io.*;publicclassTestSockClient{publicstaticvoidmain(String[]args){InputStreamis=null;OutputStreamos=null;Strings=null;try{Socketsocket=newSocket("localhost",8888);is=socket.getInputStream();os=socket.getOutputStream();DataInputStreamdis=newDataInputStream(is);DataOutputStxeamdos=newDataOutputStream(os);//客戶端向服務(wù)器端發(fā)送請求的內(nèi)容dos.writeUTF("客戶端提交服務(wù)器");if((s=dis.readUTF())!=null)System.out.println(s);dos.close();dis.close();socket.close();}catch(UnknownHostExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}}9.4.1基于TCP的Socket編程
編譯、運行服務(wù)器端、客戶端程序,運行結(jié)果如圖9.9和圖9.10所示。圖9.9Socket編程服務(wù)器端圖9.10Socket編程客戶端9.4.2基于UDP的Socket編程
UDP是用戶數(shù)據(jù)報協(xié)議,它提供的是無連接、不可靠信息傳送服務(wù)。Java主要提供了兩個類來實現(xiàn)基于UDP的Socket編程。 DatagramSocket:此類表示用來發(fā)送和接收數(shù)據(jù)報包的套接字。數(shù)據(jù)報套接字是包投遞服務(wù)的發(fā)送或接收點,每個在數(shù)據(jù)報套接字上發(fā)送或接收的包都是單獨編址和路由的。從一臺機器發(fā)送到另一臺機器的多個包可能選擇不同的路由,也可能按不同的順序到達(dá)。在DatagramSocket上總是啟用UDP廣播發(fā)送。 DatagramPacket:此類表示數(shù)據(jù)報包。數(shù)據(jù)報包用來實現(xiàn)無連接包投遞服務(wù),每條報文僅根據(jù)該包中包含的信息從一臺機器路由到另一臺機器。9.4.2基于UDP的Socket編程
圖9.11展示了基于UDP的Socket編程的示意圖。圖9.11基于UDP的Socket編程9.4.2基于UDP的Socket編程
DatagramPacket類主要有兩個構(gòu)造函數(shù)。
一個用來接收數(shù)據(jù)DatagramPacket(byte[]recyBuf,intreadLength),用一個字節(jié)數(shù)組接收UDP包,recyBuf數(shù)組在傳遞給構(gòu)造函數(shù)時是空的,而readLength值用來設(shè)定要讀取的字節(jié)數(shù)。
一個用來發(fā)送數(shù)據(jù)DatagramPacket(byte[]sendBuf,intsendLength,InetAddressiaddr,intport),建立將要傳輸?shù)腢DP包,并指定IP地址和端口號。
接下來通過一個案例,演示Java如何實現(xiàn)基于UDP的Socket編程9.4.2基于UDP的Socket編程import.*;importjava.io.*;publicclassTestUDPServer{publicstaticvoidmain(Stringargs[])throwsException{//創(chuàng)建數(shù)據(jù)報包的套接字,端口號8888DatagramSocketds=newDatagramSocket(8888);bytebuf[]=newbyte[1024];//創(chuàng)建接收的數(shù)據(jù)報包DatagramPacketdp=newDatagramPacket(buf,buf.length);System.out,println("務(wù)器端:");while(true){//從此套接字接收數(shù)據(jù)報包ds.receive(dp);ByteArrayInputStreambais=newByteAirayInputStream(buf);DataInputStreamdis=newDataInputStream(bais);System.out.println(dis.readLong());}}}import.*;importjava.io.*;publicclassTestUDPClient{publicstaticvoidmain(Stringargs[])throwsException{longn=10000L;ByeArrayOutputStreambaos=newByteArrayOutputStream();DataOutputStreamdos=newDataOutputStream(baos);dos.writeLong(n);byte[]buf=baos.toByteArray();System.cmt.println("客戶端:");System.out.println(buf.length);//創(chuàng)建數(shù)據(jù)報包的套接字,端口號9999DatagramSocketds=newDatagramSocket(9999);//創(chuàng)建發(fā)送的數(shù)據(jù)報包DatagramPacketdp=newDatagramPacket(buf,buf.length,newInetSock
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年銅材熱擠壓件項目投資可行性研究分析報告
- 金威啤酒公司的成本管理絕技
- 中國汽車HUD行業(yè)競爭格局分析及投資規(guī)劃研究報告
- 2025年度共享工作人員社會保險繳納合同
- 代理配股合同范例
- 勞動合同范本養(yǎng)殖
- 伐木砍伐工程合同范例
- 農(nóng)村舊房拆遷合同范本
- 代養(yǎng)鵝合同范本
- 公司轉(zhuǎn)讓協(xié)議合同范本
- 5城市軌道交通服務(wù)禮儀之儀態(tài)禮儀ppt課件
- 投標(biāo)流程及注意事項(課堂PPT)
- 日照功率半導(dǎo)體項目投資計劃書范文
- 統(tǒng)編版三年級語文下冊第三單元《綜合性學(xué)習(xí):中華傳統(tǒng)節(jié)日》教案
- 兒童注意力測試表
- 大學(xué)生預(yù)征對象登記表
- EN50317-2002-鐵路應(yīng)用集電系統(tǒng)受電弓和接觸網(wǎng)的動力交互
- 人教版美術(shù)八下課程綱要
- 項目部組織機構(gòu)框圖(共2頁)
- 機動車登記證書
- 鉭鈮礦開采項目可行性研究報告寫作范文
評論
0/150
提交評論