電子教案--第11章.ppt_第1頁
電子教案--第11章.ppt_第2頁
電子教案--第11章.ppt_第3頁
電子教案--第11章.ppt_第4頁
電子教案--第11章.ppt_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第11章 Java 中的網(wǎng)絡編程,本章導讀 1. URL類 2. 讀取URL中的資源 3. 顯示URL資源中的HTML文件 4. 處理超鏈接 5. InetAddress類 6. 套接字Socket 7. 使用多線程處理套接字連接 8. UDP數(shù)據(jù)報 9. 廣播數(shù)據(jù)包,11.1 URL類,包中的 URL類是對統(tǒng)一資源定位符(Uniform Resource Locator)的抽象,使用URL創(chuàng)建對象的應用程序稱作客戶端程序,一個URL對象存放著一個具體的資源的引用,表明客戶要訪問這個URL中的資源,利用URL對象可以獲取URL中的資源。一個URL對象通常包含最基本的三部分信息:協(xié)議、地址、資源。協(xié)議必須是URL對象所在的Java虛擬機支持的協(xié)議,許多協(xié)議并不為我們所常用,而常用的Http、Ftp、file協(xié)議都是虛擬機支持的協(xié)議;地址必須是能連接的有效IP地址或域名;資源可以是主機上的任何一個文件。,1URL的構造方法 public URL(String spec) throws MalformedURLException 該構造方法使用字符串初始化一個URL對象,例如 try url=new URL(““); catch(MalformedURLException e) System.out.println (“Bad URL:“+url); ,該URL對象使用的協(xié)議是“Http”協(xié)議,即用戶按著這種協(xié)議和指定的服務器通信,該URL對象包含的地址是“”,所包含的資源是默認的資源(主頁)。 public URL(String protocol, String host,String file) throws MalformedURLException 該構造方法構造的URL對象的協(xié)議、地址和資源分別由參數(shù)protocol、host和file指定,返回,11.2 讀取URL中的資源,URL對象調(diào)用 InputStream openStream() 方法可以返回一個輸入流,該輸入流指向URL對象所包含的資源。通過該輸入流可以將服務器上的資源信息讀入到客戶端。 下面的例子1在一個文本框中輸入網(wǎng)址,然后點擊確定按鈕讀取服務器上的資源,由于網(wǎng)絡速度或其它的因素,URL資源的讀取可能會引起堵塞,因此,程序需在一個線程中讀取URL資源,以免堵塞主線程。,返回,11.3 顯示URL資源中的html文件,在上面的例子1中,我們可以將的主頁的內(nèi)容顯示在文本區(qū)中,但是,有時候我們想看到網(wǎng)頁的運行效果。Javax.swing包中的JEditorPane類可以解釋執(zhí)行html文件,也就是說,如果你把html文件讀入到JEditorPane,該html文件就會被解釋執(zhí)行,顯示在JEditorPane中,這樣程序就看到了網(wǎng)頁的運行效果。,可以使用JEditorPane類的構造方法: public JEditorPane() public JEditorPane(URL initialPage) throws IOException public JEditorPane(String url) throws IOException 構造JEditorPane對象,后兩個構造方法使用參數(shù)initialPage或url指定該對象最初顯示的URL中的資源。JEditorPane對象調(diào)用 public void setPage(URL page) throws IOException 法可以顯示新的URL中的資源。 在下面的例子2中,我們用JEditorPane對象顯示網(wǎng)頁。,返回,11.4 處理超鏈接,當JEditorPane對象調(diào)用setEditable方法將編輯屬性設為false時,不僅可以顯示網(wǎng)頁的運行效果,而且用戶如果單擊網(wǎng)頁中超鏈接還可以使得JEditorPane對象觸發(fā)HyperlinkEvent事件。程序可以通過處理HyperlinkEvent事件,來顯示新的URL資源。JEditorPane對象調(diào)用 addHyperlinkListener(HyperlinkListener listener) 獲得監(jiān)視器。監(jiān)視器需實現(xiàn)HyperlinkListener接口, 該接口中的方法是:void hyperlinkUpdate(HyperlinkEvent e) 在下面的例子中,當單擊超鏈接時,JEditorPane對象 將顯示超鏈接所鏈接的網(wǎng)頁。,返回,11.5 InetAdress類,我們已經(jīng)知道Internet上的主機有兩種方式表示地址: (1)域名 例如, (2)IP 地址 例如,10 包中的InetAddress類對象含有一個Internet主機地址的域名和IP地址: /10。 域名容易記憶,當你在連接網(wǎng)絡時輸入一個主機的域名后,域名服務器(DNS)負責將域名轉(zhuǎn)化成IP地址,這樣我們才能和主機建立連接。,1獲取Internet上主機的地址 我們可以使用InetAddress類的靜態(tài)方法: getByName(String s); 將一個域名或IP地址傳遞給該方法的參數(shù)s,獲得一個 InetAddress對象,該對象含有主機地址的域名和IP地 址,該對象用如下格式表示它包含的信息: /0 下面的例子4分別獲取域名是的主機域名及IP地址,同時獲取了IP地址是的主機域名及IP地址。,當你運行上述程序時應保證你已經(jīng)連接到Internet(通過撥號或局域網(wǎng)連接到Internet上)。上述程序的 運行結果: /0 / 另外,InetAddress類中含有兩個實例方法: public String getHostName() 取InetAddress對象所 含的域名。 public String getHostAddress() 獲取InetAddress對象所含的IP地址。,2獲取本地機的地址 我們可以使用InetAddress類的靜態(tài)方法: getLocalHost(); 獲得一個InetAddress對象,該對象含有本地機的域名和IP地址。,返回,11.6 套接字Socket,IP地址標識Internet上的計算機,端口號標識正在計算機上運行的進程(程序)。端口號與IP地址的組合得出一個網(wǎng)絡套接字。端口號被規(guī)定為一個16位的整數(shù)065535。其中,01023被預先定義的服務通信占用(如telnet占用端口23,http占用端口80等)。除非我們需要訪問這些特定服務,否則,就應該使用102465535這些端口中的某一個進行通信,以免發(fā)生端口沖突。,1套接字連接 所謂套接字連接就是客戶端的套接字對象和服務器端的套接字對象通過輸入、輸出流連接在一起,現(xiàn)在我們分三個步驟來說明套接字連接的基本模式。 (1)服務器建立ServerSocket對象 ServerSocket對象負責等待客戶端請求建立套接字連接,類似郵局某個窗口中的業(yè)務員。也就是說,服務器必須事先建立一個等待客戶請求建立套接字連接的ServerSocket對象。ServerSocket的構造方法是: ServerSocket(int port),當建立服務器套接字時可能發(fā)生IOException異常,因此要象下面那樣建立接收客戶的服務器套接字。 try ServerSocket waitSocketConnection=new ServerSocket(1880); catch(IOException e) 當服務器的ServerSocket對象waitSocketConnection建立后,就可以使用方法accept()接受客戶的套接字連接請求,代碼如下所示: waitSocketConnection.accept();,接收客戶的套接字也可能發(fā)生IOException異常,因此要象下面那樣建立接受客戶的套接字。 try Socket socketAtServer= waitSocketConnection.accept(); catch(IOException e) 所謂“接收”客戶的套接字請求,就是accept()方法會返回一個Socket對象:socketAtServer,稱作服務器端的套接字對象。,Socket socketAtServer = waitSocketConnection.accept(); System.out.println(“ok”) catch(IOException e) (2)客戶端創(chuàng)建Socke對象。 客戶端程序可以使用Socket類創(chuàng)建對象,Socket的構 方法是: Socket(String host,int port) 參數(shù)host是服務器的IP地址,port是一個端口號。,也可以使用Socket類不帶參數(shù)的構造方法 public Socket() 創(chuàng)建一個套接字對象,該對象不請求任何連接。該對象再調(diào)用 public void connect(SocketAddress endpoint) throws IOException 請求和參數(shù)SocketAddress指定地址的套接字建立連接。為了使用connect方法,可以使用SocketAddress的子類:InetSocketAddress創(chuàng)建一個對象,InetSocketAddress的構造方法是: public InetSocketAddress(InetAddress addr, int port),創(chuàng)建Socket對象可能發(fā)生IOException異常,因此要象 下面那樣建立到服務器的套接字連接 try Socket socketAtClient=new Socket(“8”,1880); catch(IOException e) 客戶端建立socketAtClient對象的過程就是向服務器發(fā)出套接字連接請求,如果服務器端相應的端口上有ServerSocket對象正在使用accept方法等待客戶,那么雙方的套接字對象socketAtClient和socketAtServer就都誕生了。,(3)流連接 客戶端和服務器端的套接字對象誕生以后,還必須進 行輸入、輸出流的連接。 服務器端的這個Socket對象socketAtServer使用方法 getOutputStream() 獲得的輸出流將指向客戶端Socket對象socketAtClient 使用方法 getInputStream() 獲得的那個輸入流;同樣,服務器端的這個Socket對象ocketAtServer使用方法,getInputStream() 獲得的輸入流將指向客戶端Socket對象socketAtClient使用方法 getOutputStream() 獲得的那個輸出流。因此,當服務器向這個輸出流寫入信息時,客戶端通過相應的輸入流就能讀取,反之亦然。,連接建立后,服務器端的套接字對象調(diào)用getInetAddress()方法可以獲取一個InetAddess對象,該對象含有客戶端的IP地址和域名,同樣,客戶端的套接字對象調(diào)用getInetAddress()方法可以獲取一個InetAddess對象,該對象含有服務器端的IP地址和域名。 套接字調(diào)用 close()可以關閉雙方的套接字連接,只要一方關閉連接,就會導致對方發(fā)生IOException異常。 下面我們通過一個簡單的例子說明上面講的概念。,在例子5中,客戶端向服務器發(fā)出ASCII表的順序值:1127;服務器接受這些數(shù)據(jù),并將順序值對應的字符返回給客戶。你首先將例子5中服務器端的Server.java編譯通過,并運行起來,等待客戶請求連接。然后運行客戶端程序。,返回,11.7 使用多線程處理套接字連接,套接字連接中涉及到輸入流和輸出流操作,客戶或服務器讀取數(shù)據(jù)可能會引起堵塞,我們應把讀取數(shù)據(jù)放在一個單獨的線程中去進行。另外,服務器端收到一個客戶的套接字后,就應該啟動一個專門為該客戶服務的線程。 我們用學過的組件,設計一個略微復雜的套接字連接。 在下面的例子6中,客戶輸入一個一元二次方程的系數(shù)并發(fā)送給服務器,服務器把計算出的方程的實根返回 給客戶。因此你可以將計算量大的工作放在服務器端,客戶負責計算量小的工作,實現(xiàn)客戶-服務器交互計算,來完成某項任務。,返回,11.8 UDP數(shù)據(jù)報,基于UDP通信的基本模式是 (1)將數(shù)據(jù)打包,稱為數(shù)據(jù)包(好比將信件裝入信封一樣),然后將數(shù)據(jù)包發(fā)往目的地。 (2)接受別人發(fā)來的數(shù)據(jù)包(好比接收信封一樣),然后查看數(shù)據(jù)包中的內(nèi)容。 1發(fā)送數(shù)據(jù) (1)創(chuàng)建DatagramPacket對象 首先用DatagramPacket類將數(shù)據(jù)打包,即用DatagramPacket類創(chuàng)建一個對象,稱為數(shù)據(jù)包。,返回,用DatagramPacket的以下兩個構造方法創(chuàng)建待發(fā)送的數(shù)據(jù)包: DatagramPacket(byte data ,int length,InetAddtress address,int port) DatagramPack(byte data ,int offset,int length,InetAddtress address,int port) 使用構造方法創(chuàng)建的數(shù)據(jù)包對象具有下列兩個性質(zhì): 含有data數(shù)組指定的數(shù)據(jù)。 該數(shù)據(jù)包將發(fā)送到地址是address、端口號是port的主機上。,我們稱address是它的目標地址、port是這個數(shù)據(jù)包的目標端口號。其中,第2個構造方法創(chuàng)建的數(shù)據(jù)包對象含有數(shù)組data從offset開始指定長度的數(shù)據(jù)。 例如: byte data =“近來好嗎“.getByte(); InetAddtress address=InetAddtress.getName(““); DatagramPacket data_pack=new DatagramPacket(data,data.length, address,980);,(2)發(fā)送數(shù)據(jù) 然后用 DatagramSocket類的不帶參數(shù)的構造方法:DatagramSocket()創(chuàng)建一個對象,該對象負責發(fā)送數(shù)據(jù)包。例如, DatagramSocket mail_out=new DatagramSocket(); mail_out.send(data_pack);,2接收數(shù)據(jù) DatagramSocket類另一個構造方法: DatagramSocket(int port) 創(chuàng)建一個對象,其中的參數(shù)必須和待接收的數(shù)據(jù)包的端口號相同。例如,如果發(fā)送方發(fā)送的數(shù)據(jù)包的端口號是5666: DatagramSocket mail_in=new DatagramSocket(5666);,該對象mail_in使用方法 receive(DatagramPacket pack 接受數(shù)據(jù)包。該方法有一個數(shù)據(jù)包參數(shù)pack,方法receive把收到的數(shù)據(jù)包傳遞給該參數(shù)。因此我們必須預備一個數(shù)據(jù)包以便收取數(shù)據(jù)包。這時需使用 DatagramPack類的另外一個構造方法:DatagramPack(byte data ,int length)創(chuàng)建一個數(shù)據(jù)包,用于接收數(shù)據(jù)包,例如: byte data=new byte100;int length=90; DatagramPacket pack=new,DatagramPacket(data,length); mail_in.receive(pack); 該數(shù)據(jù)包pack將接收長度是length的數(shù)據(jù)放入data。 在下面的例子7中兩個主機(可用本地機模擬)互相發(fā)送和接收數(shù)據(jù)包。,返回,11.9 廣播數(shù)據(jù)包,廣播數(shù)據(jù)包類似于電臺廣播,進行廣播的電臺需在指定的波段和頻率上廣播信息,接收者只有將收音機調(diào)到指定的波段、頻率上才能收聽到廣播的內(nèi)容。 廣播數(shù)據(jù)包涉及到地址和端口。我們知道,Internet的地址是a.b.c.d的形式。該地址的一部分代表用戶自己主機,而另一部分代表用戶所在的網(wǎng)絡。當a小于128,那么b.c.d就用來表示主機,這類地址稱做A類地址。如果a大于等于128并且小于192,則a.b表示網(wǎng)絡地址,而c.d表示主機地址,這類地址稱做B類地址。如果a大于等于192,則網(wǎng)絡地址是a.b.c,d表示主機地址,這類地址稱做C類地址。,與55之間的地址稱做D類地址,D類地址并不代表某個特定主機的位置,一個具有A、B或C類地址的主機要廣播數(shù)據(jù)或接收廣播,都必須加入到同一個D類地址。一個D類地址也稱做一個組播地址,加入到同一個組播地址的主機可以在某個端口上廣播信息,也可以在某個端口號上接收信息。 準備廣播或接收的主機需經(jīng)過下列步驟: 11.設置組播地址 使用InetAddress類創(chuàng)建組播組地址,例如: InetAddress group=InetAddress.getByName(““);,2創(chuàng)建多點廣播套接字 使用

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論