




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第10章 網(wǎng)絡(luò)編程HTTP概述 URL URLConnection讀寫(xiě) InetAddres類(lèi) Socket 數(shù)據(jù)報(bào) 本章內(nèi)容本章內(nèi)容HTTP概述概述1.1.統(tǒng)一資源定位器統(tǒng)一資源定位器URLURL URL- Uniform Resource Locator URL- Uniform Resource Locator,表示,表示InternetInternet上某一資源的地址。上某一資源的地址。 瀏覽器通過(guò)解析給定的瀏覽器通過(guò)解析給定的URLURL可以在網(wǎng)絡(luò)上查找可以在網(wǎng)絡(luò)上查找相應(yīng)的文件或其他資源。相應(yīng)的文件或其他資源。 2 2URLURL的組成的組成 protocol:/:port_num
2、ber/file_nameprotocol:/:port_number/file_name 其中:其中: 協(xié)議名協(xié)議名protocolprotocol): :指明獲取資源所使用的傳輸協(xié)議,指明獲取資源所使用的傳輸協(xié)議, 如如httphttp、ftpftp、gophergopher、filefile等。等。 Host_nameHost_name:資源名:資源名resourceNameresourceName所在的主機(jī)。所在的主機(jī)。 Port_nubmerPort_nubmer:連接時(shí)所使用的通信端口號(hào):連接時(shí)所使用的通信端口號(hào) File_nameFile_name:該資源在主機(jī)的完整文件名。:該
3、資源在主機(jī)的完整文件名。 HTTP概述概述例例1:/index.jsp協(xié)議名稱(chēng)協(xié)議名稱(chēng)主機(jī)名主機(jī)名例例2:gamelan:80/Gamelan/network.html - -協(xié)議名主機(jī)名端口號(hào)文件名協(xié)議名主機(jī)名端口號(hào)文件名文件文件HTTP概述概述 3基于基于TCP/IP編程的兩個(gè)協(xié)議編程的兩個(gè)協(xié)議 目前在目前在Internet上使用最為廣泛的協(xié)議是上使用最為廣泛的協(xié)議是TCP/IP協(xié)議協(xié)議 1TCP 是一種面向連接的保證可靠傳輸?shù)膮f(xié)議。通過(guò)是一種面向連接的保證可靠傳輸?shù)膮f(xié)議。通過(guò)TCP協(xié)議協(xié)議傳輸,得到的是一個(gè)順序的無(wú)差錯(cuò)的數(shù)據(jù)流。傳輸,得到的是一個(gè)順序的無(wú)差錯(cuò)的數(shù)據(jù)流。 發(fā)送
4、方和接收方在進(jìn)行數(shù)據(jù)傳輸前必須進(jìn)行連接成對(duì)的兩發(fā)送方和接收方在進(jìn)行數(shù)據(jù)傳輸前必須進(jìn)行連接成對(duì)的兩個(gè)個(gè)socket之間必須建立連接)。之間必須建立連接)。HTTP概述概述2UDPUDP是是User Datagram Protocol的簡(jiǎn)稱(chēng),是一的簡(jiǎn)稱(chēng),是一種無(wú)連接的協(xié)議,每個(gè)數(shù)據(jù)報(bào)都是一個(gè)獨(dú)立的種無(wú)連接的協(xié)議,每個(gè)數(shù)據(jù)報(bào)都是一個(gè)獨(dú)立的信息,包括完整的源地址或目的地址。信息,包括完整的源地址或目的地址。 它在網(wǎng)絡(luò)上以任何可能的路徑傳往目的地,因它在網(wǎng)絡(luò)上以任何可能的路徑傳往目的地,因此能否到達(dá)目的地,到達(dá)目的地的時(shí)間以及內(nèi)此能否到達(dá)目的地,到達(dá)目的地的時(shí)間以及內(nèi)容的正確性都是不能被保證的。容的正確
5、性都是不能被保證的。 HTTP概述概述在在JavaJava語(yǔ)言中,可以使用三種方式實(shí)現(xiàn)網(wǎng)絡(luò)編語(yǔ)言中,可以使用三種方式實(shí)現(xiàn)網(wǎng)絡(luò)編程:程: (1 1URLURL編程獲取編程獲取URLURL屬性信息)屬性信息) (2 2SocketSocket編程基于編程基于TCP TCP 的的C/SC/S) (3)Datagram (3)Datagram編程編程UDPUDP)HTTP概述概述4.java包 -URL類(lèi) -URLconnection類(lèi) -Socket類(lèi) -ServerSocket類(lèi) -DatagramPacket類(lèi) -DatagramSocket類(lèi) -MulticastSocket類(lèi)TCPTCP實(shí)現(xiàn)
6、實(shí)現(xiàn)網(wǎng)絡(luò)通信網(wǎng)絡(luò)通信UDP實(shí)現(xiàn)實(shí)現(xiàn)網(wǎng)絡(luò)通信網(wǎng)絡(luò)通信HTTP概述概述URL本節(jié)主要內(nèi)容:本節(jié)主要內(nèi)容:URLURL構(gòu)造方法構(gòu)造方法URLURL類(lèi)的其他方法類(lèi)的其他方法URLURL相關(guān)的異常相關(guān)的異常從從URLURL讀取讀取WWWWWW網(wǎng)絡(luò)數(shù)據(jù)網(wǎng)絡(luò)數(shù)據(jù) 1 1public URL (String spec);public URL (String spec); 使用使用URLURL對(duì)象的字符串對(duì)象的字符串specspec來(lái)構(gòu)造一個(gè)來(lái)構(gòu)造一個(gè)URLURL對(duì)象。對(duì)象。例例1 1: URL url=new URL( 263) URL url=new URL( 263) 構(gòu)造方法構(gòu)造方法2) public
7、URL(URL baseurl, String spec); 通過(guò)基地址通過(guò)基地址URL和表示相對(duì)路徑的字符串和表示相對(duì)路徑的字符串構(gòu)造一個(gè)構(gòu)造一個(gè)URL對(duì)象。對(duì)象。例例2:URL net263=new URL (263/); URL index263=new URL(net263, index.html) 基地址基地址構(gòu)造方法構(gòu)造方法3)public URL(String protocol, String host, String file); 通過(guò)協(xié)議名、主機(jī)名和文件名構(gòu)造一個(gè)通過(guò)協(xié)議名、主機(jī)名和文件名構(gòu)造一個(gè)URL對(duì)象。對(duì)象。例例3:URL u1=new URL(, gamelan, /
8、pages/Gamelan. html); 構(gòu)造方法構(gòu)造方法4)public URL(String protocol,String host, int port, String file); 通過(guò)協(xié)議名、主機(jī)名、端口號(hào)和文件名構(gòu)造一個(gè)URL對(duì)象。例4:URL g1=new URL(, “news.163, 80, “07/1208/16/3v2019j.html);構(gòu)造方法構(gòu)造方法URL類(lèi)的其他方法類(lèi)的其他方法獲取獲取URL對(duì)象屬性的方法對(duì)象屬性的方法: public String getProtocol(): 獲取該獲取該URL的協(xié)議名的協(xié)議名 public String getHost()
9、 : 獲取該獲取該URL的主機(jī)名的主機(jī)名 public String getPort() : 獲取該獲取該URL的端口號(hào)的端口號(hào) public String getPath() : 獲取該獲取該URL的文件路徑的文件路徑 public String getFile() : 獲取該獲取該URL的文件名的文件名 public String getRef() : 獲取該獲取該URL在文件中的相對(duì)位置在文件中的相對(duì)位置 public String getQuery() : 獲取該獲取該URL的查詢名的查詢名也可使用下列方法將也可使用下列方法將URLURL對(duì)象的內(nèi)容以字符串對(duì)象的內(nèi)容以字符串的形式來(lái)表示
10、:的形式來(lái)表示: String toString(); String toString(); String toExternalForm(); String toExternalForm();URL類(lèi)的其他方法類(lèi)的其他方法與與URL相關(guān)的異常相關(guān)的異常 URL URL類(lèi)的每個(gè)構(gòu)造方法在類(lèi)的每個(gè)構(gòu)造方法在URLURL地址殘缺或無(wú)法地址殘缺或無(wú)法解釋時(shí),都將拋出解釋時(shí),都將拋出MalformedURLExceptionMalformedURLException異常。異常。 一般將相關(guān)語(yǔ)句放入一般將相關(guān)語(yǔ)句放入trycatchtrycatch語(yǔ)句塊中。格語(yǔ)句塊中。格式如下:式如下: try try
11、URL myURL= new URL() URL myURL= new URL()catch (MalformedURLException e)catch (MalformedURLException e)/exception handler code here/exception handler code here URLURL編程步驟:編程步驟: 1 1導(dǎo)入導(dǎo)入javajava包;包; 2 2創(chuàng)建創(chuàng)建URLURL對(duì)象對(duì)象URLURL構(gòu)造方法)構(gòu)造方法) 3 3獲取獲取URLURL對(duì)象屬性對(duì)象屬性 或利用或利用URLURL對(duì)象讀入數(shù)據(jù)對(duì)象讀入數(shù)據(jù) 例例5: URL url1,url2,url
12、3; try url1 = new URL(“file:/D:/image/example.gif”); url2 = new URL(“scit.js/map/”); url3 = new URL(url2, “test.gif”);catch(MalformedURLException e) DisplayErrorMessage(); .例例6 6:獲?。韩@取URLURL對(duì)象屬性對(duì)象屬性try /創(chuàng)建創(chuàng)建URL對(duì)象對(duì)象URL ur1=new URL(javasoft/java/index.htm1); /輸出輸出URL對(duì)象的有關(guān)信息對(duì)象的有關(guān)信息System.out.println(UR
13、L對(duì)象字符串:對(duì)象字符串:+ur1.toString();System.out.println(URL對(duì)象文件:對(duì)象文件:+ur1.getFile();System.out.println(URL對(duì)象地址:對(duì)象地址:+ur1.getHost();System.out.println(URL對(duì)象端口:對(duì)象端口:+ur1.getPort();System.out.println(URL對(duì)象協(xié)議:對(duì)象協(xié)議:+ur1.getProtocol();catch(MalformedURLException e)System.out.println(錯(cuò)誤的錯(cuò)誤的URL對(duì)象。對(duì)象。);獲取獲取URLURL對(duì)象屬
14、性的運(yùn)行結(jié)果對(duì)象屬性的運(yùn)行結(jié)果從從URL讀取讀取WWW網(wǎng)絡(luò)數(shù)據(jù)網(wǎng)絡(luò)數(shù)據(jù) URL URL類(lèi)定義了類(lèi)定義了openStream()openStream()方法用以讀取方法用以讀取URLURL地址的數(shù)據(jù),其定義為地址的數(shù)據(jù),其定義為: :public final InputStream openStream() public final InputStream openStream() thorws IOException ; thorws IOException ;URLJava 程序程序InputStream例例7:從:從URL中讀取數(shù)據(jù)中讀取數(shù)據(jù) URL google = new URL(“c
15、); BufferedReader in = new BufferedReader(new InputStreamReader(google.openStream(); String inputLine; while(inputLine=in.readLine() != null) System.out.println(inputLine); in.close(); .從從URLURL中讀取數(shù)據(jù)的運(yùn)行結(jié)果中讀取數(shù)據(jù)的運(yùn)行結(jié)果基于基于URLConnection的讀寫(xiě)的讀寫(xiě)1.URLConnection1.URLConnection類(lèi)類(lèi) URL URL的方法的方法openS
16、tream()openStream()只能從網(wǎng)絡(luò)上只能從網(wǎng)絡(luò)上讀取數(shù)據(jù),而不能寫(xiě)。讀取數(shù)據(jù),而不能寫(xiě)。 URLConnection URLConnection是封裝訪問(wèn)遠(yuǎn)程網(wǎng)絡(luò)資是封裝訪問(wèn)遠(yuǎn)程網(wǎng)絡(luò)資源一般方法類(lèi),通過(guò)它可以建立與遠(yuǎn)程服務(wù)源一般方法類(lèi),通過(guò)它可以建立與遠(yuǎn)程服務(wù)器的連接,檢查遠(yuǎn)程資源的一些屬性。器的連接,檢查遠(yuǎn)程資源的一些屬性。 URL類(lèi)中的方法類(lèi)中的方法openConnection()可以對(duì)可以對(duì)URL指向的網(wǎng)絡(luò)資源進(jìn)行指向的網(wǎng)絡(luò)資源進(jìn)行讀寫(xiě)。讀寫(xiě)。 public URLConnetion openConnection(); 作用:嘗試連接作用:嘗試連接URL指向的網(wǎng)絡(luò)資源,然后
17、返回封裝了操作該連接指向的網(wǎng)絡(luò)資源,然后返回封裝了操作該連接的類(lèi)的類(lèi)java.URLConnection的一個(gè)實(shí)例。的一個(gè)實(shí)例。 基于基于URLConnection的讀寫(xiě)的讀寫(xiě)例例8: try /先創(chuàng)建一個(gè)先創(chuàng)建一個(gè)URL對(duì)象對(duì)象url1 URL url1=new URL(163); /創(chuàng)建到創(chuàng)建到url1的一個(gè)連接對(duì)象的一個(gè)連接對(duì)象con URLConnection con=url1.openConnection(); catch(MalformedURLException) catch(IOException) 2URLConnetion類(lèi)中的常用方法類(lèi)中的常用方法 public Inpu
18、tStream getInputStream(); public OutputStream getOutputStrem(); public URl getURL(); 基于基于URLConnection的讀寫(xiě)的讀寫(xiě)3. URLConnection讀讀/寫(xiě)編程步驟寫(xiě)編程步驟 1創(chuàng)建一個(gè)創(chuàng)建一個(gè)URL對(duì)象對(duì)象u1; 2使用使用URLConnection類(lèi)中的類(lèi)中的openConnection()方法方法創(chuàng)建到創(chuàng)建到URL的一個(gè)連接對(duì)象的一個(gè)連接對(duì)象: URLConnection u1.openConnection()勝利,返回一個(gè)勝利,返回一個(gè)URLConnection對(duì)象對(duì)象不成功,拋出不成功
19、,拋出IOException異常異常 3進(jìn)行數(shù)據(jù)的讀或?qū)懖僮鬟M(jìn)行數(shù)據(jù)的讀或?qū)懖僮? 4)關(guān)閉流關(guān)閉流基于基于URLConnection的讀寫(xiě)的讀寫(xiě) 4從URLConnection讀URL資源4URLConnectionURLConnection類(lèi)的讀寫(xiě)渠道類(lèi)的讀寫(xiě)渠道4 getInputStream() getInputStream()基于基于URLConnection的讀寫(xiě)的讀寫(xiě)例例9:采用:采用URLConection 從從URL讀取數(shù)據(jù)讀取數(shù)據(jù) String inputLine; System.out.println(gl.getContentLength(); System.out.p
20、rintln(gl.getDate(); System.out.println(gl.getLastModified(); System.out.println(gl.getURL(); System.out.println(gl.toString();基于基于URLConnection的讀寫(xiě)的讀寫(xiě)URL google = new URL(localhost:8080/examples/jsp/datatreat.jsp); BufferedReader in = new BufferedReader(new InputStreamReader(google.openStream(); Str
21、ing inputLine; while (inputLine = in.readLine() != null) System.out.println(inputLine);in.close();基于基于URLConnection的讀寫(xiě)的讀寫(xiě)從從URLConectionURLConection讀取數(shù)據(jù)的運(yùn)行結(jié)果讀取數(shù)據(jù)的運(yùn)行結(jié)果CGICGI程序程序POSTPOST信息信息有動(dòng)態(tài)特性的有動(dòng)態(tài)特性的HTMLHTML網(wǎng)頁(yè)網(wǎng)頁(yè)標(biāo)準(zhǔn)輸入標(biāo)準(zhǔn)輸入標(biāo)準(zhǔn)輸出標(biāo)準(zhǔn)輸出4.4.對(duì)對(duì)RLConnectionRLConnection寫(xiě)寫(xiě)setDoOutput(true), getOutputStream( ) 什么情
22、況下有必要向什么情況下有必要向URLURL寫(xiě)信息呢?寫(xiě)信息呢? - -表單表單Form)Form)與與CGICGI有交互的網(wǎng)頁(yè)有交互的網(wǎng)頁(yè) - -使用使用POSTPOST方式向方式向CGICGI傳送信息傳送信息 基于基于URLConnection的讀寫(xiě)的讀寫(xiě)例例10:向一個(gè):向一個(gè)RLConnection寫(xiě)寫(xiě) URL url = new URL();URLConnection connection = url.openConnection(); connection.setDoOutput(true); PrintWriter out = new PrintWrite
23、r ( connection.getOutputStream(); out.println(string); out.close(); InetAddres類(lèi)類(lèi) 類(lèi)java.InetAddress表示一個(gè) Internet Protocol (IP) 地址。 應(yīng)用程序必須使用方法 getLocalHost, getByName, 或 getAllByName 來(lái)創(chuàng)建新的 InetAddress 實(shí)例。 例11: InetAddress ia = new InetAddress (); 其他方法其他方法 1) public byte getAddress() 返回這個(gè)返回這個(gè) InetAddre
24、ss 對(duì)象的原始對(duì)象的原始 IP 地址。地址。 2) public static InetAddress getAllByName(String) throws UnknownHostException 給定主機(jī)名,確定該主機(jī)的所有給定主機(jī)名,確定該主機(jī)的所有 IP 地址。地址。 3) public static InetAddress getByName(String host) throws UnknownHostException 給定主機(jī)名,確定該主機(jī)的所有給定主機(jī)名,確定該主機(jī)的所有 IP 地址。地址。 4) public String getHostAddress() 返回返回IP
25、 地址串地址串 %d.%d.%d.%dInetAddres類(lèi)類(lèi) 5) public String getHostName() 返回此地址的全限定主機(jī)名。返回此地址的全限定主機(jī)名。 6) public static InetAddress getLocalHost() 返回本地主機(jī)。返回本地主機(jī)。 7) public String toString() 把此把此IP 地址轉(zhuǎn)換為地址轉(zhuǎn)換為 String 類(lèi)型。類(lèi)型。 上述上述1)-4)方法均要拋出方法均要拋出UnknownHostException 異常。異常。InetAddres類(lèi)類(lèi)例例12: InetAddress 獲取獲取 IP地址地址im
26、port java.*; public class getip public static void main(String args) throws UnknownHostException InetAddress ad=InetAddress.getByName(localhost);System.out.println(主機(jī)名:主機(jī)名:+ad.getHostName();System.out.println(主機(jī)地址:主機(jī)地址: +ad.getHostAddress();System.out.println(ad.getCanonicalHostName();System.out.pri
27、ntln(本地地址:本地地址: +ad.getAddress();System.out.println(本地主機(jī)名:本地主機(jī)名: +ad.getLocalHost(); netAddress類(lèi)獲取IP地址 socketnSocketSocket是網(wǎng)絡(luò)程序中最常用的方式,用是網(wǎng)絡(luò)程序中最常用的方式,用于建立兩個(gè)不同程序之間通過(guò)網(wǎng)絡(luò)進(jìn)行通于建立兩個(gè)不同程序之間通過(guò)網(wǎng)絡(luò)進(jìn)行通信的信道。信的信道。nJavaJava語(yǔ)言提供了兩種語(yǔ)言提供了兩種SocketSocket通信方式:通信方式:nTCP SocketTCP SocketnUDP SocketUDP Socket網(wǎng)絡(luò)服務(wù)網(wǎng)絡(luò)服務(wù)Mailftpfi
28、nger20telnet數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)I/O緩沖區(qū)緩沖區(qū)端口端口2123客戶程序客戶程序SocketIP,port套接字是套接字是IP與端口的組與端口的組合合,可以分辨在可以分辨在internet上運(yùn)行的程序上運(yùn)行的程序socket通信一般過(guò)程通信一般過(guò)程 Socket Socket通常用來(lái)實(shí)現(xiàn)客戶通常用來(lái)實(shí)現(xiàn)客戶/ /服務(wù)器程序。服務(wù)器程序。為了讓客戶機(jī)知道如何與相應(yīng)的服務(wù)進(jìn)程建為了讓客戶機(jī)知道如何與相應(yīng)的服務(wù)進(jìn)程建立通信聯(lián)系,一般系統(tǒng)為一些常用的服務(wù)類(lèi)立通信聯(lián)系,一般系統(tǒng)為一些常用的服務(wù)類(lèi)型分配了默認(rèn)端口號(hào):型分配了默認(rèn)端口號(hào): 表表1 1 常用服務(wù)端口號(hào)常用服務(wù)端口號(hào) 服務(wù)類(lèi)型服務(wù)類(lèi)型
29、 端口號(hào)端口號(hào) EchoEcho FTPFTP TELNETTELNET SMTPSMTP FingerFinger POP3POP3 7 7 2121 2323 2525 7979 8080 110110 Socket Socket進(jìn)行進(jìn)行C/SC/S程序設(shè)計(jì)的一般連接過(guò)程序設(shè)計(jì)的一般連接過(guò)程:程: Server Server端監(jiān)聽(tīng)某個(gè)端口是否有連接請(qǐng)求;端監(jiān)聽(tīng)某個(gè)端口是否有連接請(qǐng)求;ClientClient端向端向ServerServer端發(fā)出連接請(qǐng)求;端發(fā)出連接請(qǐng)求;ServerServer端向端向ClientClient端發(fā)回端發(fā)回accpetaccpet消息。消息。 這樣一個(gè)連接就建
30、立起來(lái),這樣一個(gè)連接就建立起來(lái),ServerServer端和端和ClientClient端都可以通過(guò)端都可以通過(guò)sendsend、writewrite等方法與等方法與對(duì)方通信。對(duì)方通信。socket通信一般過(guò)程通信一般過(guò)程 ServerServerSocket(port #)Socket socket = ServerSocket.accept()接收連接接收連接OutputStreamInputStreamClose SocketClientSocket(host, port #)與服務(wù)器建立連接與服務(wù)器建立連接OutputStreamInputStreamClose Socketsocke
31、t TCP TCP協(xié)議協(xié)議 Socket Socket通信通信socket通信一般過(guò)程通信一般過(guò)程 例例13:13:顯示服務(wù)器與客戶機(jī)間的通信顯示服務(wù)器與客戶機(jī)間的通信( (服務(wù)器端服務(wù)器端) )PrintStream ps=null;DataInputStream dis=null;String username;ServerSocket serverSocket=null;Socket clientSocket=null;try serverSocket=new ServerSocket(1111);catch (IOException e) System.out.println( “Er
32、ror”+e);System.exit(1);try clientSocket=serverSocket.accept();catch (IOException e) System.out.println(Accept failed.); System.exit(1); 創(chuàng)建服務(wù)器創(chuàng)建服務(wù)器(端口號(hào)端口號(hào))定義數(shù)據(jù)成員定義數(shù)據(jù)成員服務(wù)器等待服務(wù)器等待網(wǎng)絡(luò)連接網(wǎng)絡(luò)連接 Socket Socket編程步驟編程步驟 應(yīng)用應(yīng)用SocketSocket進(jìn)行網(wǎng)絡(luò)編程,基本結(jié)構(gòu)都是包括進(jìn)行網(wǎng)絡(luò)編程,基本結(jié)構(gòu)都是包括下面下面4 4個(gè)步驟:個(gè)步驟: :(1 1) 創(chuàng)建創(chuàng)建SocketSocket;(2 2) 打
33、開(kāi)連接到打開(kāi)連接到SocketSocket的輸入的輸入/ /出流;出流;(3 3) 按照一定的協(xié)議對(duì)按照一定的協(xié)議對(duì)SocketSocket進(jìn)行讀進(jìn)行讀/ /寫(xiě)操寫(xiě)操作;作;(4 4) 關(guān)閉關(guān)閉SocketSocket。socket通信一般過(guò)程通信一般過(guò)程 java.socket java在包在包java中提供了中提供了Socket類(lèi),表示客戶端創(chuàng)類(lèi),表示客戶端創(chuàng)建對(duì)象來(lái)建立與服務(wù)器的連接。建對(duì)象來(lái)建立與服務(wù)器的連接。1.socket構(gòu)造方法構(gòu)造方法 Socket(InetAddress address, int port); Socket(String host, int port); So
34、cket(String host, int port, InetAddress localAddr,int localPort); Socket(InetAddress address,int port, InetAddress localaddr,int localPort);例例14:Socket client = new Socket(127.0.01., 80); Socket cc=new Socket(“163”,80);2.讀讀/寫(xiě)方法寫(xiě)方法 1public InputStream getInputStream() throws IOException 功能:從功能:從 Sock
35、et 中獲得一個(gè)輸入流,用于從中獲得一個(gè)輸入流,用于從 Socket 中讀數(shù)據(jù),拋出中讀數(shù)據(jù),拋出 I/O 異常。異常。 2public OutputStream getOutputStream() throws IOException 功能:從功能:從 Socket 中獲得一個(gè)輸出流,用于從中獲得一個(gè)輸出流,用于從 Socket 中寫(xiě)數(shù)據(jù),拋出中寫(xiě)數(shù)據(jù),拋出 I/O 異常。異常。 3public void close(); 關(guān)閉流關(guān)閉流3基于基于TCP協(xié)議的的客戶端編程步驟協(xié)議的的客戶端編程步驟 1創(chuàng)建一個(gè)指向一個(gè)服務(wù)器固定端口的創(chuàng)建一個(gè)指向一個(gè)服務(wù)器固定端口的Socket。 例例15:So
36、cket sock=new Socket(“7”,8000); 2)獲得輸入獲得輸入/輸出流,進(jìn)行數(shù)據(jù)的讀輸出流,進(jìn)行數(shù)據(jù)的讀/寫(xiě)操作。寫(xiě)操作。 例例16:/獲取輸入流獲取輸入流 BufferedReader in =new BufferedReader(new InputStreamReader(socket.getInputStream(); /獲取輸出流獲取輸出流 PrintWriter out =new PrintWriter(new BufferedWriter(new OutputStreamWriter (socket.getOutputStream(),
37、 Java 語(yǔ)言為服務(wù)器端程序設(shè)計(jì)提供了 ServerSocket 類(lèi)。該類(lèi)允許程序綁定一個(gè)端口,等待客戶端程序請(qǐng)求,然后根據(jù)客戶端的請(qǐng)求執(zhí)行相應(yīng)操作,并對(duì)請(qǐng)求作出響應(yīng)。 java.ServerSocket1. ServerSocket的構(gòu)造方法的構(gòu)造方法 ServerSocket(int port); ServerSocket(int port, int backlog); ServerSocket(int port, int backlog, InetAddress bindAddr);例例17:ServerSocket server = new ServerSocket(4460); S
38、erverSocket sr = new ServerSocket(4460,10); java.ServerSocket2 2監(jiān)聽(tīng)方法監(jiān)聽(tīng)方法 public Socket accept() public Socket accept();功能:功能: 等待客戶端的連接等待客戶端的連接, ,在等待客戶請(qǐng)求在等待客戶請(qǐng)求的過(guò)程中,方法的過(guò)程中,方法 accept() accept() 將處于阻塞狀將處于阻塞狀態(tài)即無(wú)限循環(huán)狀態(tài)),直到接收到連態(tài)即無(wú)限循環(huán)狀態(tài)),直到接收到連接請(qǐng)求,返回一個(gè)用于連接客戶端接請(qǐng)求,返回一個(gè)用于連接客戶端 Socket Socket 的的 Socket Socket 實(shí)例
39、。實(shí)例。 java.ServerSocket例例18:ServerSocket server=null; try server=new ServerSocket(4700); /創(chuàng)建一個(gè)創(chuàng)建一個(gè)ServerSocket在端口在端口4700監(jiān)聽(tīng)客戶請(qǐng)求監(jiān)聽(tīng)客戶請(qǐng)求catch(IOException e) System.out.println(can not listen to :+e); Socket socket=null;try socket=server.accept(); /監(jiān)聽(tīng)監(jiān)聽(tīng)catch(IOException e) System.out.println(Error:+e);3基于
40、基于Socket編程服務(wù)器端編程步驟編程服務(wù)器端編程步驟 1以某端口號(hào)為參數(shù)調(diào)用以某端口號(hào)為參數(shù)調(diào)用ServerSocket類(lèi)類(lèi)的構(gòu)造方法,創(chuàng)建一個(gè)的構(gòu)造方法,創(chuàng)建一個(gè)ServerSocket對(duì)象,服務(wù)對(duì)象,服務(wù)器端程序?qū)⒃谶@個(gè)端口上監(jiān)聽(tīng)、等待客戶程序發(fā)器端程序?qū)⒃谶@個(gè)端口上監(jiān)聽(tīng)、等待客戶程序發(fā)來(lái)的請(qǐng)求。如上例。來(lái)的請(qǐng)求。如上例。java.ServerSocket2服務(wù)程序使用服務(wù)程序使用ServerSocket對(duì)象的方法對(duì)象的方法accept(),等待接收,等待接收某客戶端程序發(fā)出的連接請(qǐng)求。某客戶端程序發(fā)出的連接請(qǐng)求。例例19:Socket soc=server.accept(); 通過(guò)通
41、過(guò)Socket對(duì)象可獲取客戶端的相關(guān)信息。對(duì)象可獲取客戶端的相關(guān)信息。例例20:clientIp=soc.getInetAddress(); 也可以利用也可以利用Socket類(lèi)提供的方法類(lèi)提供的方法 getInputStream()和和getOutputStream() 來(lái)創(chuàng)建輸入來(lái)創(chuàng)建輸入/輸出流。輸出流。例例21: InputStream is=soc.getInputStream(); OutputStream os=soc.getOutputStream();3輸入輸入/輸出輸出 程序?qū)Τ绦驅(qū)ocket的輸入的輸入/輸出流進(jìn)行讀輸出流進(jìn)行讀/寫(xiě)操作都和對(duì)寫(xiě)操作都和對(duì)普通的輸入普通的輸
42、入/輸出流進(jìn)行讀輸出流進(jìn)行讀/寫(xiě)基本一樣。但是需要在寫(xiě)基本一樣。但是需要在這兩個(gè)流對(duì)象的基礎(chǔ)上建立易于操作的數(shù)據(jù)流如這兩個(gè)流對(duì)象的基礎(chǔ)上建立易于操作的數(shù)據(jù)流如DataInputStream、DataOutputStream或或PrintStream。例例22:DataInputStream in=new DataInputStream(is);DataOutputStream out=new DataOutputStream(os);PrintStream pout=new PrintStream(os);另外為了便于輸出字符或漢字,可以使用下列輸出另外為了便于輸出字符或漢字,可以使用下列輸出
43、/輸入輸入流:流: BufferedReader in=new BufferedReader( new InputStreamReader(is);BufferedWriter out=new BufferedWriter( new OutputStremWriter(os);PrintWriter pout=new PrintWriter(new BufferedWriter(new OutputStreamWriter(os),true);Socket應(yīng)用應(yīng)用 例例23:基于連接的:基于連接的Client/Server程序程序1.Client端程序端程序import java.*;impo
44、rt java.io.*;public class JabberClient public static void main(String args) throws IOException InetAddress addr = InetAddress.getByName(null); System.out.println(addr = + addr); BufferedReader fin=new BufferedReader(new InputStreamReader(System.in); Socket socket = new Socket(addr, 8080); try System
45、.out.println(socket = + socket); BufferedReader in =new BufferedReader(new InputStreamReader(socket.getInputStream(); PrintWriter out =new PrintWriter( new BufferedWriter(new OutputStreamWriter( socket.getOutputStream(),true);Socket應(yīng)用應(yīng)用 while(true) String str =fin.readLine();if (str.equals(exit) out
46、.println(exit);break;else out.println(str); String s=in.readLine();System.out.println(server response:+s); Socket應(yīng)用應(yīng)用 /關(guān)閉連接關(guān)閉連接 finally System.out.println(closing.);socket.close(); Socket應(yīng)用應(yīng)用 2.2.服務(wù)器端程序服務(wù)器端程序public class JabberServer public static void main(String args) throws IOException ServerSock
47、et s = new ServerSocket(8080);Socket socket;System.out.println(Started: + s);try socket = s.accept(); try System.out.println(Connection accepted: + socket); BufferedReader in =new BufferedReader( new InputStreamReader(socket.getInputStream(); PrintWriter out =new PrintWriter( new BufferedWriter(new
48、OutputStreamWriter(socket.getOutputStream(),true);2.2.服務(wù)器端程序服務(wù)器端程序while (true) String str = in.readLine(); if (str.equals(exit)break; System.out.println(Echoing: + str); out.println(server received +str); finally System.out.println(closing.);socket.close(); finally s.close(); 2.2.服務(wù)器端程序服務(wù)器端程序客戶/服務(wù)器通
49、信例24:多線程服務(wù)實(shí)現(xiàn) 基本方法:基本方法: 在服務(wù)器程序里創(chuàng)建單個(gè)在服務(wù)器程序里創(chuàng)建單個(gè)ServerSocketServerSocket對(duì)象,并調(diào)用對(duì)象,并調(diào)用accept()accept()方法來(lái)等候一個(gè)新連接。一旦調(diào)用方法來(lái)等候一個(gè)新連接。一旦調(diào)用accept()accept()方法成方法成功,就會(huì)獲得一個(gè)功,就會(huì)獲得一個(gè)socketsocket對(duì)象,并用它新建一個(gè)線程,令其對(duì)象,并用它新建一個(gè)線程,令其只為那個(gè)特定的客戶服務(wù)。然后再調(diào)用只為那個(gè)特定的客戶服務(wù)。然后再調(diào)用acceptaccept方法,等候下方法,等候下一個(gè)新的連接請(qǐng)求。一個(gè)新的連接請(qǐng)求。多線程服務(wù)器程序:多線程服務(wù)器程
50、序:import java.io.*;import java.*; public class MultiTalkServer /靜態(tài)成員變量,記錄當(dāng)前客戶的個(gè)數(shù)靜態(tài)成員變量,記錄當(dāng)前客戶的個(gè)數(shù) static int clientnum=0; public static void main(String args) throws IOException ServerSocket serverSocket=null; boolean listening=true; try serverSocket=new ServerSocket(4700); /創(chuàng)建一個(gè)創(chuàng)建一個(gè)ServerSocket在端口在端
51、口4700監(jiān)聽(tīng)客戶請(qǐng)求監(jiān)聽(tīng)客戶請(qǐng)求catch(IOException e) System.out.println(Could not listen on port:4700.); /出錯(cuò),打印出錯(cuò)信息出錯(cuò),打印出錯(cuò)信息 System.exit(-1); /退出退出 while(listening) /永遠(yuǎn)循環(huán)監(jiān)聽(tīng)永遠(yuǎn)循環(huán)監(jiān)聽(tīng) new ServerThread(serverSocket.accept(),clientnum).start();/監(jiān)聽(tīng)到客戶請(qǐng)求,根據(jù)得到的監(jiān)聽(tīng)到客戶請(qǐng)求,根據(jù)得到的Socket對(duì)象和客戶計(jì)數(shù)創(chuàng)建服務(wù)對(duì)象和客戶計(jì)數(shù)創(chuàng)建服務(wù)線程,并啟動(dòng)之線程,并啟動(dòng)之clientnum
52、+; /增加客戶計(jì)數(shù)增加客戶計(jì)數(shù)serverSocket.close(); /關(guān)閉關(guān)閉ServerSocket線程程序:public class ServerThread extends Thread Socket socket=null; /保存與本線程相關(guān)的保存與本線程相關(guān)的Socket對(duì)象對(duì)象 int clientnum; /保存本進(jìn)程的客戶計(jì)數(shù)保存本進(jìn)程的客戶計(jì)數(shù) public ServerThread(Socket socket,int num) /構(gòu)造函數(shù)構(gòu)造函數(shù) this.socket=socket; /初始化初始化socket變量變量 clientnum=num+1; /初始化
53、初始化clientnum變量變量 public void run() /線程主體線程主體try String line; BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream();/由由Socket對(duì)象得到輸入流,并構(gòu)造相應(yīng)的對(duì)象得到輸入流,并構(gòu)造相應(yīng)的BufferedReader對(duì)象對(duì)象 PrintWriter os=new PrintWriter(socket.getOutputStream(); /由由Socket對(duì)象得到輸出流,并構(gòu)造對(duì)象得到輸出流,并構(gòu)造PrintWriter對(duì)
54、象對(duì)象 BufferedReader sin=new BufferedReader(new InputStreamReader(System.in); /由系統(tǒng)標(biāo)準(zhǔn)輸入設(shè)備構(gòu)造由系統(tǒng)標(biāo)準(zhǔn)輸入設(shè)備構(gòu)造BufferedReader對(duì)象對(duì)象 System.out.println(Client:+ clientnum +is.readLine(); /在標(biāo)準(zhǔn)輸出上打印從客戶端讀入的字符串在標(biāo)準(zhǔn)輸出上打印從客戶端讀入的字符串 line=sin.readLine(); /從標(biāo)準(zhǔn)輸入讀入一字符串從標(biāo)準(zhǔn)輸入讀入一字符串while(!line.equals(bye) /如果該字符串為如果該字符串為 bye,則停
55、止循環(huán),則停止循環(huán) os.println(line); /向客戶端輸出該字符串向客戶端輸出該字符串 os.flush(); /刷新輸出流,使刷新輸出流,使Client馬上收到該字符串馬上收到該字符串System.out.println(Server:+line); /在系統(tǒng)標(biāo)準(zhǔn)輸出上打印該字符串在系統(tǒng)標(biāo)準(zhǔn)輸出上打印該字符串 System.out.println(Client:+ clientnum +is.readLine(); /從從Client讀入一字符串,并打印到標(biāo)準(zhǔn)輸出上讀入一字符串,并打印到標(biāo)準(zhǔn)輸出上line=sin.readLine(); /從系統(tǒng)標(biāo)準(zhǔn)輸入讀入一字符串從系統(tǒng)標(biāo)準(zhǔn)輸入
56、讀入一字符串 /繼續(xù)循環(huán)繼續(xù)循環(huán)os.close(); /關(guān)閉關(guān)閉Socket輸出流輸出流is.close(); /關(guān)閉關(guān)閉Socket輸入流輸入流socket.close(); /關(guān)閉關(guān)閉Socket/server.close(); /關(guān)閉關(guān)閉ServerSocketcatch(Exception e)System.out.println(Error:+e); /出錯(cuò),打印出錯(cuò)信息出錯(cuò),打印出錯(cuò)信息2.客戶端程序 try Socket socket=new Socket(,4700); BufferedReader sin=new BufferedReader(new In
57、putStreamReader(System.in); PrintWriter os=new PrintWriter(socket.getOutputStream(); BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream(); String readline;readline=sin.readLine(); /從系統(tǒng)標(biāo)準(zhǔn)輸入讀入一字符串從系統(tǒng)標(biāo)準(zhǔn)輸入讀入一字符串while(!readline.equals(bye) os.println(readline); os.flush(); S
58、ystem.out.println(Client:+readline); System.out.println(Server:+is.readLine(); readline=sin.readLine(); os.close(); /關(guān)閉關(guān)閉Socket輸出流輸出流is.close(); /關(guān)閉關(guān)閉Socket輸入流輸入流socket.close(); /關(guān)閉關(guān)閉Socketcatch(Exception e) System.out.println(Error+e); /出錯(cuò),則打印出錯(cuò)信息出錯(cuò),則打印出錯(cuò)信息 圖12-5 多線程服務(wù)實(shí)現(xiàn)數(shù)據(jù)報(bào)數(shù)據(jù)報(bào) UDP 編程主要有以下幾個(gè)步驟: (1創(chuàng)建
59、包括有目的地址的數(shù)據(jù)報(bào)。 (2創(chuàng)建一個(gè) Socket ,用于發(fā)送或接收數(shù)據(jù)報(bào)。 (3發(fā)送數(shù)據(jù)報(bào)。 (4等待服務(wù)器響應(yīng)。 (5從響應(yīng)數(shù)據(jù)報(bào)中抽取信息并顯示。Java 提供的有關(guān) UDP 編程的類(lèi)有 DatagramPacket 類(lèi)和 DatagramSocket 類(lèi)。 DatagramPacket DatagramPacket 類(lèi)表示一個(gè)數(shù)據(jù)報(bào),有兩個(gè)作用: 1)在發(fā)送 UDP 數(shù)據(jù)之前,需要用 DatagramPacket 類(lèi)封裝一個(gè)數(shù)據(jù)報(bào),可以包括發(fā)送的目的地址和端口號(hào); 2)當(dāng)接收到一個(gè) UDP 數(shù)據(jù)報(bào)后,需要用 DatagramPacket 類(lèi)讀取數(shù)據(jù)報(bào)中的各種信息。1.1.構(gòu)造方法構(gòu)造
60、方法 1 1) public DatagramPacket(bytebuf,int offset,int public DatagramPacket(bytebuf,int offset,int length);length); 作用:作用: 使用指定字節(jié)數(shù)組的指定位置和指定長(zhǎng)度的使用指定字節(jié)數(shù)組的指定位置和指定長(zhǎng)度的 DatagramPacket DatagramPacket 類(lèi)對(duì)象,指定長(zhǎng)度必須小于或等于數(shù)組長(zhǎng)度類(lèi)對(duì)象,指定長(zhǎng)度必須小于或等于數(shù)組長(zhǎng)度 2public DatagramPacket(bytebuf,int length); 作用: 使用指定數(shù)組長(zhǎng)度構(gòu)造 DatagramPac
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高端汽車(chē)維修中心場(chǎng)地租賃及維修技術(shù)引進(jìn)合同
- 不動(dòng)產(chǎn)抵押擔(dān)保房地產(chǎn)開(kāi)發(fā)合同
- 餐飲店面租賃及品牌升級(jí)改造合同
- 車(chē)輛安全責(zé)任事故調(diào)查與處理協(xié)議
- 產(chǎn)業(yè)園區(qū)廠房物業(yè)安全防范與應(yīng)急處理合同
- 餐飲品牌區(qū)域代理權(quán)授權(quán)合同范本
- 生態(tài)旅游度假區(qū)租賃承租合同
- 城市綜合體餐飲業(yè)態(tài)承包協(xié)議書(shū)模板
- 餐飲店店長(zhǎng)職位競(jìng)聘與職業(yè)規(guī)劃合同
- 體育健身園區(qū)場(chǎng)地合作開(kāi)發(fā)與經(jīng)營(yíng)協(xié)議書(shū)
- 采購(gòu)磁鐵物料合同模板
- 2024年重新寫(xiě)撫養(yǎng)協(xié)議書(shū)模板
- 專(zhuān)題6.6射影定理專(zhuān)項(xiàng)提升訓(xùn)練(重難點(diǎn)培優(yōu))-2022-2023學(xué)年九年級(jí)數(shù)學(xué)下冊(cè)尖子生培優(yōu)題典(原卷版)
- 中華詩(shī)詞之美學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 蚊蠅蟲(chóng)鼠害防治管理制度
- DL∕T 1811-2018 電力變壓器用天然酯絕緣油選用導(dǎo)則
- 水泵檢修工(高級(jí))技能鑒定考試題庫(kù)(含答案)
- AQ/T 9009-2015 生產(chǎn)安全事故應(yīng)急演練評(píng)估規(guī)范(正式版)
- 瀘州老窖“濃香文釀杯”企業(yè)文化知識(shí)競(jìng)賽考試題庫(kù)大全-下(多選、填空題)
- 酒店運(yùn)營(yíng)管理 智慧樹(shù)知到期末考試答案章節(jié)答案2024年山東青年政治學(xué)院
- 幼兒園課程故事開(kāi)展培訓(xùn)
評(píng)論
0/150
提交評(píng)論