




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、高級 Internet實驗報告題目:Socket 網絡編程學生姓名 :班級:軟件 1202 班學號:指導老師:王文浪成績:西安郵電大學計算機學院2015年4月27日一、實驗目的 熟悉 Socket網絡編程 熟悉 CS 客戶機模式 熟悉 ServerSocket編寫服務端熟悉使用多 線程機制處理業(yè)務了解客戶機之間通信方式二、實驗內容及要求采用 CS 模式,通過客戶機向服務器端發(fā)送消息;采用 Socket來實現(xiàn)客戶機之間的網絡通信;通過 ServerSocket創(chuàng)建服務端來處理接受客 戶機請求;通過多線程方式來 處理客戶機之間的通信請求;實現(xiàn)通信的界面窗口; 實驗內容有發(fā)送私聊消息、向選中用戶發(fā)送
2、文件、用戶接受文件。三、實驗過程1.首先學習了在 JAVA 語言中 TCP/IP 協(xié)議下的 Socket網絡模式圖如 1.1 所示圖 1.1TCP/IP 協(xié)議下的 Socket 網絡模式圖由圖 1.1 可以得到,Socket 通信的步 驟如下:(1)在服務器端創(chuàng)建一個 ServerSocket對象并且指定端口號。(2)運行 ServerSocket的 accept()方法,等候客戶端的請求。(3)客戶端創(chuàng)建一個 Socket 對象,指定計算機的地址和端口號,向服務器端發(fā)出連接請求。(4)服務器端接收到來自客 戶端的請求后,創(chuàng)建 Socket 對象與客戶端建立連接。(5)服務器端和客 戶端分別建
3、立輸入輸出流進行數(shù)據傳輸 。(6)通信結束后,服務器端和客 戶端分別關閉相應的 Socket 連接。(7)服務器端程序運行 結束后,調用 ServerSocket對象的 close()方法停止等待客 戶端請求。由此可以看出,對于一個網 絡通信程序來 說,需要編寫服務器端和客 戶端兩個程序才能 夠實現(xiàn)相互通信,為了實現(xiàn)一個服務端程序能夠對多個客戶進行服務,需要使用到多線程,在服務器端創(chuàng)建客戶請求的監(jiān)聽線程,一旦客戶發(fā)起請求連接,在服務器端創(chuàng)建用于服務的 Socket,利用改 Socket 完成與客 戶的通信,即每個線程針對一個客戶進行服務,數(shù)據傳輸結束后,終止運行該 Socket 通信的線程,繼
4、續(xù)在服務器端指定的端口 進行監(jiān)聽。2.數(shù)據報的通信的 發(fā)送和接收 過程:應用程序的工作流程如下:1()首先要建立數(shù)據報通信的 Socket,我們可以通過創(chuàng)建一個DatagramSocket對象實現(xiàn)它,在Java中 DatagramSocket類有如下兩種構造方法:public DatagramSocket() 構造一個數(shù)據 報 socket,并使其與本地主機任一可用的端口連接。若打不開 socket則拋出 SocketException異常。public DatagramSocket(int port) 構造一個數(shù)據 報,并使其與本地主機指定的端口 連接。若打不開 socket或 socket
5、無法與指定的端口連接則拋出 SocketException異常。2()創(chuàng)建一個數(shù)據 報文包,用來實現(xiàn)無連接的包傳送服務。每個數(shù)據報文包用 DatagramPacket類創(chuàng)建,DatagramPacket對象封裝了數(shù)據報包數(shù)據、包長度、目標地址和目 標端口。客戶端要發(fā)送數(shù)據報文包,要調用 DatagramPacket類以如下形式的構造 創(chuàng)建DatagramPacket對象,將要發(fā)送的數(shù)據和包文目的地址信息放入 對象之中。DatagramPacket(byte bufferedarray,int length,InetAddress address,int port)即構造一個包長度為 lengt
6、h 的包傳送到指定主機指定端口號上的數(shù)據 報文包,參數(shù) length 必須小于等于 bufferedarry.length。DatagramPacket類提供了 4 個類獲取信息:public byte getData() 返回一個字 節(jié)數(shù)組,包含收到或要發(fā)送的數(shù)據報中的數(shù)據。public int getLength() 返回發(fā)送或接收到的數(shù)據的 長度。public InetAddress getAddress() 返回一個 發(fā)送或接收此數(shù)據報包文的機器的 IP 地址。public int getPort() 返回發(fā)送或接收數(shù)據 報的遠程主機的端口號。3()創(chuàng)建完 DatagramSocket
7、和 DatagramPacket對象,就可以發(fā)送數(shù)據報文包了。發(fā)送是通過調用 DatagramSocket對象的 send方法實現(xiàn),它需要以 DatagramPacket對象為參數(shù),將剛才封裝進DatagramPacket對象中的數(shù)據 組成數(shù)據報發(fā)出。4()當然,我們也可以接收數(shù)據 報文包。為了接收從服 務器返回的結果數(shù)據報文包,我們需要創(chuàng)建一個新的 DatagramPacket對象,這就需要用到 DatagramPacket的另一種構造方式 DatagramPacket (byte bufferedarray,int length),即只需指明存放接收的數(shù)據報的緩沖區(qū)和長度。調用 Datag
8、ramSocket對象的 receive()方法完成接收數(shù)據報的工作,此時需要將上面 創(chuàng)建的 DatagramPacket對象作為參數(shù),該方法會一直阻塞直到收到一個數(shù)據 報文包,此時 DatagramPacket的緩沖區(qū)中包含的就是接收到的數(shù)據,數(shù)據 報文包中也包含 發(fā)送者的 IP 地址,發(fā)送者機器上的端口號等信息。5()處理接收內的數(shù)據,獲取服務結果。6()當通信完成后,可以使用 DatagramSocket對象的 close()方法關閉數(shù)據報通信 Socket。當然,Java會自動關閉 Socket,釋放DatagramSocket和 DatagramPacket所占用的 資源。但是作為一
9、種良好的習慣,還是要顯式地予以關 閉。3.DatagramSocket 類詳解Java使用 DatagramSocket代表 UDP 協(xié)議的 Socket,DatagramSocket本身只是 碼頭,不能產生 IO 流,它的唯一作用就是接收和發(fā)送數(shù)據報,Java使用 DatagramPacket來代表數(shù)據 報,DatagramSocket接收和發(fā)送的數(shù)據都是通 過 DatagramPacket對象完成的。DatagramSocket():創(chuàng)建一個 DatagramSocket實例,并將該對象綁定到本機默 認 IP 地址、本機所有可用端口中隨機 選擇的某個端口。DatagramSocket(in
10、t prot):創(chuàng)建一個 DatagramSocket實例,并將該對象綁定到本機默 認 IP 地址、指定端口。DatagramSocket(int port, InetAddress laddr):創(chuàng)建一個DatagramSocket實例,并將該對象綁定到指定 IP 地址、指定端口。通過上面三個構造器中的任意一個構造器即可 創(chuàng)建一個DatagramSocket實例,通常在創(chuàng)建服務器時,創(chuàng)建指定端口的DatagramSocket實例-這樣保證其他客戶端可以將數(shù)據 發(fā)送到該服務器。一旦得到了 DatagramSocket實例之后,就可以通過如下兩個方法來接收和 發(fā)送數(shù)據。receive(Datag
11、ramPacket p):從該 DatagramSocket中接收數(shù)據 報。send(DatagramPacket p):以該 DatagramSocket對象向外發(fā)送數(shù)據報。從上面兩個方法可以看出,使用 DatagramSocket發(fā)送數(shù)據報時,DatagramSocket并不知道將 該數(shù)據報發(fā)送到哪里,而是由DatagramPacket自身決定數(shù)據 報的目的地。就像碼頭并不知道每個集裝箱的目的地,碼頭只是將這些集裝箱 發(fā)送出去,而集裝箱本身包含了該集裝箱的目的地。DatagramPacket的構造器:DatagramPacket(byte buf,int length):以一個空數(shù)組來創(chuàng)建
12、DatagramPacket對象,該對象的作用是接收 DatagramSocket中的數(shù)據。DatagramPacket(byte buf, int length, InetAddress addr, int port):以一個包含數(shù)據的數(shù) 組來創(chuàng)建 DatagramPacket對象,創(chuàng)建該DatagramPacket對象時還指定了 IP 地址和端口 -這就決定了 該數(shù)據報的目的地。DatagramPacket(byte buf, int offset, int length):以一個空數(shù)組來創(chuàng)建 DatagramPacket對象,并指定接收到的數(shù)據放入 buf 數(shù)組中時從offset 開始,
13、最多放 length 個字節(jié)。DatagramPacket(byte buf, int offset, int length, InetAddressaddress, int port):創(chuàng)建一個用于 發(fā)送的 DatagramPacket對象,指定發(fā)送 buf 數(shù)組中從 offset 開始,總共 length 個字節(jié)。當 Client/Server 程序使用 UDP 協(xié)議時,實際上并沒有明 顯的服務器端和客 戶端,因為兩方都需要先建立一個 DatagramSocket對象,用來接收或 發(fā)送數(shù)據報,然后使用 DatagramPacket對象作為傳輸數(shù)據的載體。通常固定 IP 地址、固定端口的 D
14、atagramSocket對象所在的程序被稱為服務器,因為該 DatagramSocket可以主動接收客戶端數(shù)據。在接收數(shù)據之前,應該采用上面的第一個或第三個構造器生成一個 DatagramPacket對象,給出接收數(shù)據的字 節(jié)數(shù)組及其長度。然后調用 DatagramSocket 的 receive()方法等待數(shù)據 報的到來,receive()將一直等待(該方法會阻塞 調用該方法的線程),直到收到一個數(shù)據報為止。如下代碼所示:/ 創(chuàng)建一個接收數(shù)據的 DatagramPacket對象DatagramPacketpacket=new DatagramPacket(buf, 256);/ 接收數(shù)據
15、報socket.receive(packet);在發(fā)送數(shù)據之前,調用第二個或第四個構造器 創(chuàng)建DatagramPacket對象,此時的字節(jié)數(shù)組里存放了想 發(fā)送的數(shù)據。除此之外,還要給出完整的目的地址,包括 IP 地址和端口號。發(fā)送數(shù)據是通過 DatagramSocket的 send()方法實現(xiàn)的,send()方法根據數(shù)據 報的目的地址來 尋徑以傳送數(shù)據報。如下代碼所示:/ 創(chuàng)建一個發(fā)送數(shù)據的 DatagramPacket對象DatagramPacketpacket = new DatagramPacket(buf, length, address, port);/ 發(fā)送數(shù)據報socket.se
16、nd(packet);使用 DatagramPacket接收數(shù)據 時,會感覺 DatagramPacket設計得過于煩瑣 。開發(fā)者只關心 該 DatagramPacket能放多少數(shù)據,而DatagramPacket是否采用字 節(jié)數(shù)組來存儲數(shù)據完全不想關心。但 Java 要求創(chuàng)建接收數(shù)據用的 DatagramPacket時,必須傳入一個空的字 節(jié)數(shù)組,該數(shù)組的長度決定了 該 DatagramPacket能放多少數(shù)據,這實際上暴露了 DatagramPacket的實現(xiàn)細節(jié) 。接著DatagramPacket又提供了一個 getData()方法,該方法又可以返回 Datagram Packet對象里
17、封裝的字節(jié)數(shù)組,該方法更顯得有些多余 -如果程序需要 獲取DatagramPacket里封裝的字 節(jié)數(shù)組,直接訪問傳給 DatagramPacket構造器的字 節(jié)數(shù)組實參即可,無須調用該方法。當服務器端(也可以是客戶端)接收到一個 DatagramPacket對象后,如果想向 該數(shù)據報的發(fā)送者反饋一些信息,但由于 UDP 協(xié)議是面向非連接的,所以接收者并不知道每個數(shù)據 報由誰發(fā)送過來,但程序可以調用 DatagramPacket的如下 3 個方法來 獲取發(fā)送者的 IP 地址和端口。InetAddress getAddress():當程序準備發(fā)送此數(shù)據 報時,該方法返回此數(shù)據 報的目標機器的 I
18、P 地址;當程序剛接收到一個數(shù)據 報時,該方法返回 該數(shù)據報的發(fā)送主機的 IP 地址。int getPort():當程序準備發(fā)送此數(shù)據 報時,該方法返回此數(shù)據 報的目標機器的端口;當程序剛接收到一個數(shù)據 報時,該方法返回 該數(shù)據報的發(fā)送主機的端口。SocketAddress getSocketAddress():當程序準備發(fā)送此數(shù)據 報時,該方法返回此數(shù)據 報的目標 SocketAddress;當程序剛接收到一個數(shù)據報時,該方法返回 該數(shù)據報的發(fā)送主機的 SocketAddress。getSocketAddress()方法的返回 值是一個 SocketAddress對象,該對象實際上就是一個 IP 地址和一個端口號。也就是 說,SocketAddress對象封裝了一個 InetAddress對象和一個代表端口的整數(shù),所以使用SocketAddre
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- Unit 1 what's the matter Section A 2a-2d教學設計 2023-2024學年人教版英語八年級下冊
- 2025臨時工作合同
- 制作德國教育
- 傳媒行業(yè)工作總結
- Module10 教學設計2024-2025學年外研版九年級英語上冊
- 安防協(xié)會培訓課件視頻
- 2023六年級英語上冊 Unit 6 Keep our city clean第2課時教學實錄 牛津譯林版
- 28《有的人-紀念魯迅先生有感》教學設計-2024-2025學年統(tǒng)編版語文六年級上冊
- 2023-2024學年二年級下冊《生命.生態(tài).安全》教學設計+教學設計(川教版)
- 培訓機構面試攻略
- 學校三公經費管理制度
- 新外研版高中英語選擇性必修一Unit5 developing ideas課件
- 2024年中考語文備考之基礎專項語言運用:擬寫新聞標題(方法+真題解析)
- 語言表達與運用 試卷(含答案解析)-1
- 蘇教版二年級數(shù)學下冊第二三單元測試卷含答案
- 金沙江白鶴灘水電站工程防洪度汛應急預案第五
- 修建性詳細規(guī)劃設計成果內容深度編制要求
- 2023山東地理高考答題卡涂準考證號加條形碼word版
- GB/T 20933-2007熱軋U型鋼板樁
- 抗腫瘤藥物臨床合理使用培訓課件
- 妞康特牛奶蛋白過敏診治-課件
評論
0/150
提交評論