




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、大學大學Java講義第講義第9章章主要內(nèi)容主要內(nèi)容n1、網(wǎng)絡編程基礎、網(wǎng)絡編程基礎n2、基于、基于TCP網(wǎng)絡程序設計網(wǎng)絡程序設計n3、基于、基于UDP網(wǎng)絡程序設計網(wǎng)絡程序設計n4、* * 基于基于C/S模式的分布計算模式的分布計算一、一、 Java與網(wǎng)絡與網(wǎng)絡 IP協(xié)議、協(xié)議、 TCP協(xié)議和協(xié)議和UDP協(xié)議。協(xié)議。1、網(wǎng)絡數(shù)據(jù)通信的幾個重要協(xié)議、網(wǎng)絡數(shù)據(jù)通信的幾個重要協(xié)議 源源IP地址地址 目的目的IP地址地址 IP 數(shù)據(jù)報結構數(shù)據(jù)報結構傳輸層數(shù)據(jù)報文結構:傳輸層數(shù)據(jù)報文結構:TCP傳輸層數(shù)據(jù)報結構:傳輸層數(shù)據(jù)報結構:UDP報文報文2、端口號、端口號n端口號端口號:TCP/IP協(xié)議為每種服務協(xié)
2、議為每種服務定義了一個端口。定義了一個端口。服務端口號服務端口號ftp 21http 80pop3 110 83、 套接字套接字SocketnSocket是網(wǎng)絡程序中最常用的方式,是網(wǎng)絡程序中最常用的方式,用于建立兩個不同程序之間通過網(wǎng)絡用于建立兩個不同程序之間通過網(wǎng)絡進行通信的信道。進行通信的信道。2、 套接字套接字Socket什么是什么是socket ?網(wǎng)絡服務網(wǎng)絡服務Mailftpfinger20telnet數(shù)據(jù)結構數(shù)據(jù)結構I/O緩沖區(qū)緩沖區(qū)端口端口2123客戶程序客戶程序SocketIP,port套接字是套接字是IP與端口的組與端口的組合合,可以分辨在可以分辨在internet上運行的
3、程序上運行的程序進程與進程之間建立起連接進程與進程之間建立起連接建立套接字建立套接字Socketn在客戶端使用在客戶端使用socket類,指定服務器類,指定服務器IP和端口號和端口號,以便連到服務器上以便連到服務器上: Socket(host_IP, prot); 在服務器端使用在服務器端使用ServerSocket類,類,以等待客戶端的連接以等待客戶端的連接: ServerSocket(port);客戶端呼叫客戶端呼叫服務器等待服務器等待12Socket主要方法:主要方法:在客戶端:建立在客戶端:建立socket連接后連接后,還應該還應該建立輸入輸出數(shù)據(jù)流。建立輸入輸出數(shù)據(jù)流。 getInp
4、utStream( ) 獲得輸入流獲得輸入流 getOutputStream( ) 獲得輸出流獲得輸出流在服務器端:在服務器端:ServerSocket類的類的accept( )方法使服務方法使服務器處于阻塞狀態(tài)器處于阻塞狀態(tài),等待用戶請求。等待用戶請求。ClientSocket(host, port #)Attempt the connectionOutputStreamInputStreamClose Socket二、二、TCP協(xié)議協(xié)議 Socket編程編程ServerServerSocket(port #)Server Socket.accept()Socket()OutputStrea
5、mInputStreamClose Socket例例1:演示服務器與客戶之間的:演示服務器與客戶之間的交互交互,服務器等待服務器等待,客戶訪問客戶訪問,相互相互通一次信息。通一次信息。 客戶端向服務器發(fā)出信息:客戶端向服務器發(fā)出信息:“你好你好”,服務器接收到信,服務器接收到信息后,給出回應:息后,給出回應:“你好,你好,我是服務器。我是服務器?!?1.5 Socket. 21.5 Socket創(chuàng)建服務器創(chuàng)建服務器(端口號端口號)定義數(shù)據(jù)成員定義數(shù)據(jù)成員服務器等待服務器等待網(wǎng)絡連接網(wǎng)絡連接建立建立socket流流讀客戶讀客戶 端信息端信息向用戶發(fā)出確認字符串向用戶發(fā)出確認字符串創(chuàng)建創(chuàng)建Sock
6、et實例實例定義數(shù)據(jù)成員定義數(shù)據(jù)成員建立建立socket流流讀讀socket流流(接收并顯示接收并顯示)送用戶名給送用戶名給服務器服務器關閉流關閉流waiting for user 43314331“這里是服務器這里是服務器connetcting client.你好你好提示用戶登錄成功提示用戶登錄成功讀讀socket流流16客戶機端客戶機端nimport java.io.*;nimport .*;nclass C nnpublic static void main(String args) nn tryn Socket socket=new Socket(,
7、6565);n DataOutputStream out=new DataOutputStream(socket.getOutputStream();n out.writeUTF(我是客戶機我是客戶機);n DataInputStream in=new DataInputStream(socket.getInputStream();n String s=in.readUTF();n System.out.println(客戶機收到:客戶機收到:+s);n catch(Exception e)nn17服務器端服務器端nimport java.io.*;nimport .*;nclass Snnp
8、ublic static void main(String args) nn tryn ServerSocket s_socket=new ServerSocket(6565);n Socket socket=s_socket.accept();n DataInputStream in=new DataInputStream(socket.getInputStream();n String s=in.readUTF();n System.out.println(服務器收到:服務器收到:+s);n DataOutputStream out=new DataOutputStream(socket.
9、getOutputStream();n out.writeUTF(我是服務器我是服務器);n catch(Exception e)nn21.5 Socketn顯示服務器與客戶機間的通信顯示服務器與客戶機間的通信( (服務器端服務器端) )DataOutputStream out=null;DataOutputStream out=null;DataInputStream in=null;DataInputStream in=null;ServerSocket s_socket=null;ServerSocket s_socket=null;Socket c_socket=null;Socket
10、 c_socket=null;String s; String s; /存放讀取到的信息存放讀取到的信息try s_socket=new ServerSocket(4331);try s_socket=new ServerSocket(4331); catch (IOException e) catch (IOException e) try c_socket=s_socket.accept();try c_socket=s_socket.accept(); catch (IOException e) catch (IOException e) 創(chuàng)建服務器創(chuàng)建服務器(端口號端口號)定義數(shù)據(jù)成員
11、定義數(shù)據(jù)成員服務器等待服務器等待網(wǎng)絡連接網(wǎng)絡連接用循環(huán)語句收用循環(huán)語句收發(fā)信息發(fā)信息(見下頁見下頁)in=new DataInPutStream(clientSocket.getInputStream();out=new DataOutputStream(clientSocket.getOutputStream(); 創(chuàng)建服務器創(chuàng)建服務器(端口號端口號)定義數(shù)據(jù)成員定義數(shù)據(jù)成員服務器等待服務器等待網(wǎng)絡連接網(wǎng)絡連接建立建立socket流流等待客戶登錄等待客戶登錄 out.writeUTF(“這里是服務器這里是服務器); clientSocket.close();While (true) s=in
12、.readUTF( ); if ( s!=null ) break; 讀客戶讀客戶 端信息端信息創(chuàng)建創(chuàng)建Socket實例實例DataOutputStream out=null;DataInputStream in=null;String string;Socket socket=null;定義數(shù)據(jù)成員定義數(shù)據(jù)成員trysocket=new Socket(,4331);input=new DataInputStream(socket.getInputStream();output=new PrintStream(socket.getOutputStream();建立建立sock
13、et流流catch(IOException e) System.out.println(“無法連接無法連接 ”); Out.writeUTF(“你好你好”);System.out.println(input.readLine();創(chuàng)建創(chuàng)建Socket實例實例定義數(shù)據(jù)成員定義數(shù)據(jù)成員建立建立socket流流讀讀socket流流(看到提示看到提示)從鍵盤上讀送用戶從鍵盤上讀送用戶名送給服務器端名送給服務器端關閉流關閉流mysocket.close();System.out.println(“s);讀服務器反饋讀服務器反饋While (true) s=in.readUTF( ); if ( s!=n
14、ull ) break; 考慮多用戶考慮多用戶第一種解決方案第一種解決方案:n一臺計算機上一次啟動多個服務器一臺計算機上一次啟動多個服務器程序程序,只是端口號不同。只是端口號不同。nmyserver myclient-f21.batnmyserver2myclient2-f9.batServer1(1111)client(2222)Server2(2222)client(1111)多用戶的第二種方案多用戶的第二種方案(支持多客戶支持多客戶)Serverclient1client2serverthreadserverthread將服務器寫成多線程的將服務器寫成多線程的,不同的線程為不不同的線程為
15、不同的客戶服務同的客戶服務.main()只負責循環(huán)等待只負責循環(huán)等待線程負責網(wǎng)絡連接線程負責網(wǎng)絡連接,接收客戶輸入的信息接收客戶輸入的信息 客戶客戶1客戶客戶2服務器服務器線程線程run()線程線程1( )線程線程2( )下面簡單分析下面簡單分析 教材教材P276 例例4 client()Run( )Out.writeUTF()In.readUTF()客戶端客戶端writer.start()按鈕事件按鈕事件()socketgetInputStreamgetOutputStream服務器服務器端服務器端n.服務器服務器(4321)acceptsocket客客戶戶IP client1線程線程客客戶
16、戶IP client2線程線程服務器一端為了能接收多個客戶的信息服務器一端為了能接收多個客戶的信息,它的輸入它的輸入流流,輸出流都是數(shù)組型的輸出流都是數(shù)組型的.ServerSocket.accept()等待用戶連接等待用戶連接,一旦連接上一旦連接上,則調(diào)用服務程序則調(diào)用服務程序.服務程序的主要內(nèi)容是網(wǎng)絡的讀寫服務程序的主要內(nèi)容是網(wǎng)絡的讀寫,多客戶的原因多客戶的原因,網(wǎng)絡讀寫的功能用多線程實現(xiàn)網(wǎng)絡讀寫的功能用多線程實現(xiàn),因此將此部分功因此將此部分功能單獨分離出來能單獨分離出來,構成線程類構成線程類服務器端服務器端client1client2serviceRequestserverServerSo
17、cketSocketgetOutputStreamgetInputStreamreader.runreader.runaccept()reader.start()read_net_inputwrite_net_output()n在在Java中中,網(wǎng)絡類都在網(wǎng)絡類都在 類庫中。類庫中。n用來存儲用來存儲internet地址的類地址的類InetAddress. 其主要方法:其主要方法:ngetHostName( ) 獲取獲取InetAddress對象的對象的主機名或域名主機名或域名ngetHostAddress( ) 獲取獲取InetAddress對象對象的的IP地址地址ngetLocalHost
18、( )獲取本機的獲取本機的IP地址地址n例例:獲取本機的獲取本機的IP地址地址import .*;public class getLocalHostTest public static void main(String args) InetAddress myIP=null; try myIP=InetAddress.getLocalHost(); catch(UnknownHostException e) System.out.println(myIP); 創(chuàng)建創(chuàng)建inetAddress類不用構造函數(shù)類不用構造函數(shù)(不用不用new)Java與網(wǎng)絡與網(wǎng)絡下面的例子演示下面的例子演示java如何
19、根據(jù)域名自動到如何根據(jù)域名自動到DNS上查找上查找IP地址地址(與與DNS服務器的連接減至一行服務器的連接減至一行)import .*;public class getIP public static void main(String args) InetAddress pku=null; try pku= InetAddress.getByName(“”); catch(UnknownHostException e) System.out.println(pku); 三、基于數(shù)據(jù)報三、基于數(shù)據(jù)報DatagramnTCP/IP傳輸層由兩個并列的協(xié)傳輸層由兩個并列的協(xié)議議:TCP,UDP.UDP
20、數(shù)據(jù)報的每個數(shù)據(jù)包要包含目的數(shù)據(jù)報的每個數(shù)據(jù)包要包含目的地址和端口號地址和端口號.socketserverclientDatagram數(shù)據(jù)報數(shù)據(jù)報serverclient在在UDP中,要使用二個類:中,要使用二個類: (1) DatagramSocket 類類發(fā)送時,用發(fā)送時,用 send( )方法發(fā)送數(shù)據(jù);方法發(fā)送數(shù)據(jù);接收時,用接收時,用 receive( )方法接收數(shù)據(jù)。方法接收數(shù)據(jù)。(2) DatagramPacket 類類 用于打包或拆包用于打包或拆包 發(fā)送時打包:發(fā)送時打包: 包由數(shù)據(jù)、接收地址、端口號組成;包由數(shù)據(jù)、接收地址、端口號組成; 接收時拆包:接收時拆包: 取出包中的數(shù)據(jù)
21、、接收地址、端口號。取出包中的數(shù)據(jù)、接收地址、端口號。Datagram 工作過程工作過程建立數(shù)據(jù)報建立數(shù)據(jù)報socket();建立一個報文包建立一個報文包packet等待請求報文等待請求報文建立數(shù)據(jù)報建立數(shù)據(jù)報socket建立一個請求包建立一個請求包發(fā)出請求發(fā)出請求獲得對方地址獲得對方地址構成信息包構成信息包發(fā)送出去發(fā)送出去創(chuàng)建接收包創(chuàng)建接收包等待接收等待接收Datagramn一、服務器端發(fā)出報文的步驟如下一、服務器端發(fā)出報文的步驟如下:n1. 定義數(shù)據(jù)成員定義數(shù)據(jù)成員n DatagramSocket socket;n DatagramPacket packet;n InetAddress a
22、ddress;(用來存放接收方的地址用來存放接收方的地址)n int port; ;(用來存放接收方的端口號用來存放接收方的端口號)n2. 創(chuàng)建數(shù)據(jù)報文創(chuàng)建數(shù)據(jù)報文Socket對象對象n try socket=new DatagramSocket(1111);n catch(.SocketException e) n socket 綁定到一個本地的可用端口綁定到一個本地的可用端口,等待接收客等待接收客戶的請求戶的請求.Datagramn3.分配并填寫數(shù)據(jù)緩沖區(qū)分配并填寫數(shù)據(jù)緩沖區(qū)(一個字節(jié)類型的數(shù)組一個字節(jié)類型的數(shù)組)n byte Buf=new byte256; n 存放從客戶端接收的請求信
23、息存放從客戶端接收的請求信息.n4.創(chuàng)建一個創(chuàng)建一個DatagramPacketn packet=new DatagramPacket(Buf數(shù)組數(shù)組, 256長度長度);n 用來從用來從socket接收數(shù)據(jù)接收數(shù)據(jù),它只有兩個參數(shù)它只有兩個參數(shù)n 5. 服務器阻塞服務器阻塞n socket.receive(packet);n 在客戶的請求報道來之前一直等待在客戶的請求報道來之前一直等待Datagramn6. 從到來的包中得到地址和端口號從到來的包中得到地址和端口號n InetAddress address=packet.getAddress();n int port=packet.getPo
24、rt();n7. 將數(shù)據(jù)送入緩沖區(qū)將數(shù)據(jù)送入緩沖區(qū)n 或來自文件或來自文件,或鍵盤輸入或鍵盤輸入n8. 建立報文包建立報文包,用來從用來從socket上發(fā)送信息上發(fā)送信息n packet=new DatagramPacket n (buf,buf.length, address,port);n9. 發(fā)送數(shù)據(jù)包發(fā)送數(shù)據(jù)包 10.關閉關閉socketn socket.send(packet); socket.close();Datagramn二、客戶端接收包的步驟如下二、客戶端接收包的步驟如下:1. 定義數(shù)據(jù)成員定義數(shù)據(jù)成員 int port; InetAddress address; Datag
25、ramSocket socket; DatagramPacket packet; byte sendBuf=new byte256;2. 建立建立socket socket=new DatagramSocket();Datagramn3. 向服務器發(fā)出請求報文向服務器發(fā)出請求報文n address=InetAddress.getByName(args0);n port=parseInt(args1);n packet=new n DatagramPacket(sendBuf,256,address,port);n socket.send(packet);n 這個包本身帶有客戶端的信息這個包本身帶有客戶端的信息n4. 客戶機等待應答客戶機等待應答n packet=new DatagramPacket(sendBuf,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 城市社區(qū)體衛(wèi)融合的公共服務供給模式
- 財務風險視角下電氣企業(yè)內(nèi)控管理策略
- 小學輔導班管理制度
- 總公司倉庫管理制度
- 新能源工程管理制度
- 柴油儲備間管理制度
- 標識類公司管理制度
- 檢測后血液管理制度
- 檢驗科公章管理制度
- 模具加熱棒管理制度
- 停車場承包經(jīng)營協(xié)議書范本
- 工作分析實務-國家開放大學電大易考通考試題目答案
- 急性呼吸窘迫綜合征的護理課件(演示)
- 2025年廣州市越秀區(qū)建設街招考聘用勞動保障監(jiān)察協(xié)管員高頻重點提升(共500題)附帶答案詳解
- 醫(yī)療器械產(chǎn)品運輸質量保證措施
- 2025年寧夏銀川市靈武市文化旅游投資開發(fā)有限公司招聘筆試參考題庫附帶答案詳解
- 《寶鋼集團財務共享中心建設的案例探析》1600字
- 鐵路工務應急處置課件
- 燃氣行業(yè)法律法規(guī)培訓
- T-GDHES 003-2024 預應力混凝土U形板樁應用技術規(guī)程
- 八不傷害培訓課件
評論
0/150
提交評論