大學(xué)Java講義第9章_第1頁(yè)
大學(xué)Java講義第9章_第2頁(yè)
大學(xué)Java講義第9章_第3頁(yè)
大學(xué)Java講義第9章_第4頁(yè)
大學(xué)Java講義第9章_第5頁(yè)
已閱讀5頁(yè),還剩36頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、大學(xué)大學(xué)Java講義第講義第9章章主要內(nèi)容主要內(nèi)容n1、網(wǎng)絡(luò)編程基礎(chǔ)、網(wǎng)絡(luò)編程基礎(chǔ)n2、基于、基于TCP網(wǎng)絡(luò)程序設(shè)計(jì)網(wǎng)絡(luò)程序設(shè)計(jì)n3、基于、基于UDP網(wǎng)絡(luò)程序設(shè)計(jì)網(wǎng)絡(luò)程序設(shè)計(jì)n4、* * 基于基于C/S模式的分布計(jì)算模式的分布計(jì)算一、一、 Java與網(wǎng)絡(luò)與網(wǎng)絡(luò) IP協(xié)議、協(xié)議、 TCP協(xié)議和協(xié)議和UDP協(xié)議。協(xié)議。1、網(wǎng)絡(luò)數(shù)據(jù)通信的幾個(gè)重要協(xié)議、網(wǎng)絡(luò)數(shù)據(jù)通信的幾個(gè)重要協(xié)議 源源IP地址地址 目的目的IP地址地址 IP 數(shù)據(jù)報(bào)結(jié)構(gòu)數(shù)據(jù)報(bào)結(jié)構(gòu)傳輸層數(shù)據(jù)報(bào)文結(jié)構(gòu):傳輸層數(shù)據(jù)報(bào)文結(jié)構(gòu):TCP傳輸層數(shù)據(jù)報(bào)結(jié)構(gòu):傳輸層數(shù)據(jù)報(bào)結(jié)構(gòu):UDP報(bào)文報(bào)文2、端口號(hào)、端口號(hào)n端口號(hào)端口號(hào):TCP/IP協(xié)議為每種服務(wù)協(xié)

2、議為每種服務(wù)定義了一個(gè)端口。定義了一個(gè)端口。服務(wù)端口號(hào)服務(wù)端口號(hào)ftp 21http 80pop3 110 83、 套接字套接字SocketnSocket是網(wǎng)絡(luò)程序中最常用的方式,是網(wǎng)絡(luò)程序中最常用的方式,用于建立兩個(gè)不同程序之間通過(guò)網(wǎng)絡(luò)用于建立兩個(gè)不同程序之間通過(guò)網(wǎng)絡(luò)進(jìn)行通信的信道。進(jìn)行通信的信道。2、 套接字套接字Socket什么是什么是socket ?網(wǎng)絡(luò)服務(wù)網(wǎng)絡(luò)服務(wù)Mailftpfinger20telnet數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)I/O緩沖區(qū)緩沖區(qū)端口端口2123客戶(hù)程序客戶(hù)程序SocketIP,port套接字是套接字是IP與端口的組與端口的組合合,可以分辨在可以分辨在internet上運(yùn)行的

3、程序上運(yùn)行的程序進(jìn)程與進(jìn)程之間建立起連接進(jìn)程與進(jìn)程之間建立起連接建立套接字建立套接字Socketn在客戶(hù)端使用在客戶(hù)端使用socket類(lèi),指定服務(wù)器類(lèi),指定服務(wù)器IP和端口號(hào)和端口號(hào),以便連到服務(wù)器上以便連到服務(wù)器上: Socket(host_IP, prot); 在服務(wù)器端使用在服務(wù)器端使用ServerSocket類(lèi),類(lèi),以等待客戶(hù)端的連接以等待客戶(hù)端的連接: ServerSocket(port);客戶(hù)端呼叫客戶(hù)端呼叫服務(wù)器等待服務(wù)器等待12Socket主要方法:主要方法:在客戶(hù)端:建立在客戶(hù)端:建立socket連接后連接后,還應(yīng)該還應(yīng)該建立輸入輸出數(shù)據(jù)流。建立輸入輸出數(shù)據(jù)流。 getInp

4、utStream( ) 獲得輸入流獲得輸入流 getOutputStream( ) 獲得輸出流獲得輸出流在服務(wù)器端:在服務(wù)器端:ServerSocket類(lèi)的類(lèi)的accept( )方法使服務(wù)方法使服務(wù)器處于阻塞狀態(tài)器處于阻塞狀態(tài),等待用戶(hù)請(qǐng)求。等待用戶(hù)請(qǐng)求。ClientSocket(host, port #)Attempt the connectionOutputStreamInputStreamClose Socket二、二、TCP協(xié)議協(xié)議 Socket編程編程ServerServerSocket(port #)Server Socket.accept()Socket()OutputStrea

5、mInputStreamClose Socket例例1:演示服務(wù)器與客戶(hù)之間的:演示服務(wù)器與客戶(hù)之間的交互交互,服務(wù)器等待服務(wù)器等待,客戶(hù)訪問(wèn)客戶(hù)訪問(wèn),相互相互通一次信息。通一次信息。 客戶(hù)端向服務(wù)器發(fā)出信息:客戶(hù)端向服務(wù)器發(fā)出信息:“你好你好”,服務(wù)器接收到信,服務(wù)器接收到信息后,給出回應(yīng):息后,給出回應(yīng):“你好,你好,我是服務(wù)器。我是服務(wù)器?!?1.5 Socket. 21.5 Socket創(chuàng)建服務(wù)器創(chuàng)建服務(wù)器(端口號(hào)端口號(hào))定義數(shù)據(jù)成員定義數(shù)據(jù)成員服務(wù)器等待服務(wù)器等待網(wǎng)絡(luò)連接網(wǎng)絡(luò)連接建立建立socket流流讀客戶(hù)讀客戶(hù) 端信息端信息向用戶(hù)發(fā)出確認(rèn)字符串向用戶(hù)發(fā)出確認(rèn)字符串創(chuàng)建創(chuàng)建Sock

6、et實(shí)例實(shí)例定義數(shù)據(jù)成員定義數(shù)據(jù)成員建立建立socket流流讀讀socket流流(接收并顯示接收并顯示)送用戶(hù)名給送用戶(hù)名給服務(wù)器服務(wù)器關(guān)閉流關(guān)閉流waiting for user 43314331“這里是服務(wù)器這里是服務(wù)器connetcting client.你好你好提示用戶(hù)登錄成功提示用戶(hù)登錄成功讀讀socket流流16客戶(hù)機(jī)端客戶(hù)機(jī)端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(我是客戶(hù)機(jī)我是客戶(hù)機(jī));n DataInputStream in=new DataInputStream(socket.getInputStream();n String s=in.readUTF();n System.out.println(客戶(hù)機(jī)收到:客戶(hù)機(jī)收到:+s);n catch(Exception e)nn17服務(wù)器端服務(wù)器端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(服務(wù)器收到:服務(wù)器收到:+s);n DataOutputStream out=new DataOutputStream(socket.

9、getOutputStream();n out.writeUTF(我是服務(wù)器我是服務(wù)器);n catch(Exception e)nn21.5 Socketn顯示服務(wù)器與客戶(hù)機(jī)間的通信顯示服務(wù)器與客戶(hù)機(jī)間的通信( (服務(wù)器端服務(wù)器端) )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)建服務(wù)器創(chuàng)建服務(wù)器(端口號(hào)端口號(hào))定義數(shù)據(jù)成員

11、定義數(shù)據(jù)成員服務(wù)器等待服務(wù)器等待網(wǎng)絡(luò)連接網(wǎng)絡(luò)連接用循環(huán)語(yǔ)句收用循環(huán)語(yǔ)句收發(fā)信息發(fā)信息(見(jiàn)下頁(yè)見(jiàn)下頁(yè))in=new DataInPutStream(clientSocket.getInputStream();out=new DataOutputStream(clientSocket.getOutputStream(); 創(chuàng)建服務(wù)器創(chuàng)建服務(wù)器(端口號(hào)端口號(hào))定義數(shù)據(jù)成員定義數(shù)據(jù)成員服務(wù)器等待服務(wù)器等待網(wǎng)絡(luò)連接網(wǎng)絡(luò)連接建立建立socket流流等待客戶(hù)登錄等待客戶(hù)登錄 out.writeUTF(“這里是服務(wù)器這里是服務(wù)器); clientSocket.close();While (true) s=in

12、.readUTF( ); if ( s!=null ) break; 讀客戶(hù)讀客戶(hù) 端信息端信息創(chuàng)建創(chuàng)建Socket實(shí)例實(shí)例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(“無(wú)法連接無(wú)法連接 ”); Out.writeUTF(“你好你好”);System.out.println(input.readLine();創(chuàng)建創(chuàng)建Socket實(shí)例實(shí)例定義數(shù)據(jù)成員定義數(shù)據(jù)成員建立建立socket流流讀讀socket流流(看到提示看到提示)從鍵盤(pán)上讀送用戶(hù)從鍵盤(pán)上讀送用戶(hù)名送給服務(wù)器端名送給服務(wù)器端關(guān)閉流關(guān)閉流mysocket.close();System.out.println(“s);讀服務(wù)器反饋?zhàn)x服務(wù)器反饋While (true) s=in.readUTF( ); if ( s!=n

14、ull ) break; 考慮多用戶(hù)考慮多用戶(hù)第一種解決方案第一種解決方案:n一臺(tái)計(jì)算機(jī)上一次啟動(dòng)多個(gè)服務(wù)器一臺(tái)計(jì)算機(jī)上一次啟動(dòng)多個(gè)服務(wù)器程序程序,只是端口號(hào)不同。只是端口號(hào)不同。nmyserver myclient-f21.batnmyserver2myclient2-f9.batServer1(1111)client(2222)Server2(2222)client(1111)多用戶(hù)的第二種方案多用戶(hù)的第二種方案(支持多客戶(hù)支持多客戶(hù))Serverclient1client2serverthreadserverthread將服務(wù)器寫(xiě)成多線(xiàn)程的將服務(wù)器寫(xiě)成多線(xiàn)程的,不同的線(xiàn)程為不不同的線(xiàn)程為

15、不同的客戶(hù)服務(wù)同的客戶(hù)服務(wù).main()只負(fù)責(zé)循環(huán)等待只負(fù)責(zé)循環(huán)等待線(xiàn)程負(fù)責(zé)網(wǎng)絡(luò)連接線(xiàn)程負(fù)責(zé)網(wǎng)絡(luò)連接,接收客戶(hù)輸入的信息接收客戶(hù)輸入的信息 客戶(hù)客戶(hù)1客戶(hù)客戶(hù)2服務(wù)器服務(wù)器線(xiàn)程線(xiàn)程run()線(xiàn)程線(xiàn)程1( )線(xiàn)程線(xiàn)程2( )下面簡(jiǎn)單分析下面簡(jiǎn)單分析 教材教材P276 例例4 client()Run( )Out.writeUTF()In.readUTF()客戶(hù)端客戶(hù)端writer.start()按鈕事件按鈕事件()socketgetInputStreamgetOutputStream服務(wù)器服務(wù)器端服務(wù)器端n.服務(wù)器服務(wù)器(4321)acceptsocket客客戶(hù)戶(hù)IP client1線(xiàn)程線(xiàn)程客客戶(hù)

16、戶(hù)IP client2線(xiàn)程線(xiàn)程服務(wù)器一端為了能接收多個(gè)客戶(hù)的信息服務(wù)器一端為了能接收多個(gè)客戶(hù)的信息,它的輸入它的輸入流流,輸出流都是數(shù)組型的輸出流都是數(shù)組型的.ServerSocket.accept()等待用戶(hù)連接等待用戶(hù)連接,一旦連接上一旦連接上,則調(diào)用服務(wù)程序則調(diào)用服務(wù)程序.服務(wù)程序的主要內(nèi)容是網(wǎng)絡(luò)的讀寫(xiě)服務(wù)程序的主要內(nèi)容是網(wǎng)絡(luò)的讀寫(xiě),多客戶(hù)的原因多客戶(hù)的原因,網(wǎng)絡(luò)讀寫(xiě)的功能用多線(xiàn)程實(shí)現(xiàn)網(wǎng)絡(luò)讀寫(xiě)的功能用多線(xiàn)程實(shí)現(xiàn),因此將此部分功因此將此部分功能單獨(dú)分離出來(lái)能單獨(dú)分離出來(lái),構(gòu)成線(xiàn)程類(lèi)構(gòu)成線(xiàn)程類(lèi)服務(wù)器端服務(wù)器端client1client2serviceRequestserverServerSo

17、cketSocketgetOutputStreamgetInputStreamreader.runreader.runaccept()reader.start()read_net_inputwrite_net_output()n在在Java中中,網(wǎng)絡(luò)類(lèi)都在網(wǎng)絡(luò)類(lèi)都在 類(lèi)庫(kù)中。類(lèi)庫(kù)中。n用來(lái)存儲(chǔ)用來(lái)存儲(chǔ)internet地址的類(lèi)地址的類(lèi)InetAddress. 其主要方法:其主要方法:ngetHostName( ) 獲取獲取InetAddress對(duì)象的對(duì)象的主機(jī)名或域名主機(jī)名或域名ngetHostAddress( ) 獲取獲取InetAddress對(duì)象對(duì)象的的IP地址地址ngetLocalHost

18、( )獲取本機(jī)的獲取本機(jī)的IP地址地址n例例:獲取本機(jī)的獲取本機(jī)的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類(lèi)不用構(gòu)造函數(shù)類(lèi)不用構(gòu)造函數(shù)(不用不用new)Java與網(wǎng)絡(luò)與網(wǎng)絡(luò)下面的例子演示下面的例子演示java如何

19、根據(jù)域名自動(dòng)到如何根據(jù)域名自動(dòng)到DNS上查找上查找IP地址地址(與與DNS服務(wù)器的連接減至一行服務(wù)器的連接減至一行)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ù)報(bào)三、基于數(shù)據(jù)報(bào)DatagramnTCP/IP傳輸層由兩個(gè)并列的協(xié)傳輸層由兩個(gè)并列的協(xié)議議:TCP,UDP.UDP

20、數(shù)據(jù)報(bào)的每個(gè)數(shù)據(jù)包要包含目的數(shù)據(jù)報(bào)的每個(gè)數(shù)據(jù)包要包含目的地址和端口號(hào)地址和端口號(hào).socketserverclientDatagram數(shù)據(jù)報(bào)數(shù)據(jù)報(bào)serverclient在在UDP中,要使用二個(gè)類(lèi):中,要使用二個(gè)類(lèi): (1) DatagramSocket 類(lèi)類(lèi)發(fā)送時(shí),用發(fā)送時(shí),用 send( )方法發(fā)送數(shù)據(jù);方法發(fā)送數(shù)據(jù);接收時(shí),用接收時(shí),用 receive( )方法接收數(shù)據(jù)。方法接收數(shù)據(jù)。(2) DatagramPacket 類(lèi)類(lèi) 用于打包或拆包用于打包或拆包 發(fā)送時(shí)打包:發(fā)送時(shí)打包: 包由數(shù)據(jù)、接收地址、端口號(hào)組成;包由數(shù)據(jù)、接收地址、端口號(hào)組成; 接收時(shí)拆包:接收時(shí)拆包: 取出包中的數(shù)據(jù)

21、、接收地址、端口號(hào)。取出包中的數(shù)據(jù)、接收地址、端口號(hào)。Datagram 工作過(guò)程工作過(guò)程建立數(shù)據(jù)報(bào)建立數(shù)據(jù)報(bào)socket();建立一個(gè)報(bào)文包建立一個(gè)報(bào)文包packet等待請(qǐng)求報(bào)文等待請(qǐng)求報(bào)文建立數(shù)據(jù)報(bào)建立數(shù)據(jù)報(bào)socket建立一個(gè)請(qǐng)求包建立一個(gè)請(qǐng)求包發(fā)出請(qǐng)求發(fā)出請(qǐng)求獲得對(duì)方地址獲得對(duì)方地址構(gòu)成信息包構(gòu)成信息包發(fā)送出去發(fā)送出去創(chuàng)建接收包創(chuàng)建接收包等待接收等待接收Datagramn一、服務(wù)器端發(fā)出報(bào)文的步驟如下一、服務(wù)器端發(fā)出報(bào)文的步驟如下:n1. 定義數(shù)據(jù)成員定義數(shù)據(jù)成員n DatagramSocket socket;n DatagramPacket packet;n InetAddress a

22、ddress;(用來(lái)存放接收方的地址用來(lái)存放接收方的地址)n int port; ;(用來(lái)存放接收方的端口號(hào)用來(lái)存放接收方的端口號(hào))n2. 創(chuàng)建數(shù)據(jù)報(bào)文創(chuàng)建數(shù)據(jù)報(bào)文Socket對(duì)象對(duì)象n try socket=new DatagramSocket(1111);n catch(.SocketException e) n socket 綁定到一個(gè)本地的可用端口綁定到一個(gè)本地的可用端口,等待接收客等待接收客戶(hù)的請(qǐng)求戶(hù)的請(qǐng)求.Datagramn3.分配并填寫(xiě)數(shù)據(jù)緩沖區(qū)分配并填寫(xiě)數(shù)據(jù)緩沖區(qū)(一個(gè)字節(jié)類(lèi)型的數(shù)組一個(gè)字節(jié)類(lèi)型的數(shù)組)n byte Buf=new byte256; n 存放從客戶(hù)端接收的請(qǐng)求信

23、息存放從客戶(hù)端接收的請(qǐng)求信息.n4.創(chuàng)建一個(gè)創(chuàng)建一個(gè)DatagramPacketn packet=new DatagramPacket(Buf數(shù)組數(shù)組, 256長(zhǎng)度長(zhǎng)度);n 用來(lái)從用來(lái)從socket接收數(shù)據(jù)接收數(shù)據(jù),它只有兩個(gè)參數(shù)它只有兩個(gè)參數(shù)n 5. 服務(wù)器阻塞服務(wù)器阻塞n socket.receive(packet);n 在客戶(hù)的請(qǐng)求報(bào)道來(lái)之前一直等待在客戶(hù)的請(qǐng)求報(bào)道來(lái)之前一直等待Datagramn6. 從到來(lái)的包中得到地址和端口號(hào)從到來(lái)的包中得到地址和端口號(hào)n InetAddress address=packet.getAddress();n int port=packet.getPo

24、rt();n7. 將數(shù)據(jù)送入緩沖區(qū)將數(shù)據(jù)送入緩沖區(qū)n 或來(lái)自文件或來(lái)自文件,或鍵盤(pán)輸入或鍵盤(pán)輸入n8. 建立報(bào)文包建立報(bào)文包,用來(lái)從用來(lái)從socket上發(fā)送信息上發(fā)送信息n packet=new DatagramPacket n (buf,buf.length, address,port);n9. 發(fā)送數(shù)據(jù)包發(fā)送數(shù)據(jù)包 10.關(guān)閉關(guān)閉socketn socket.send(packet); socket.close();Datagramn二、客戶(hù)端接收包的步驟如下二、客戶(hù)端接收包的步驟如下: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. 向服務(wù)器發(fā)出請(qǐng)求報(bào)文向服務(wù)器發(fā)出請(qǐng)求報(bào)文n address=InetAddress.getByName(args0);n port=parseInt(args1);n packet=new n DatagramPacket(sendBuf,256,address,port);n socket.send(packet);n 這個(gè)包本身帶有客戶(hù)端的信息這個(gè)包本身帶有客戶(hù)端的信息n4. 客戶(hù)機(jī)等待應(yīng)答客戶(hù)機(jī)等待應(yīng)答n packet=new DatagramPacket(sendBuf,

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論