




已閱讀5頁(yè),還剩32頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第11章 Java 中的網(wǎng)絡(luò)編程,本章導(dǎo)讀 1. URL類 2. 讀取URL中的資源 3. 顯示URL資源中的HTML文件 4. 處理超鏈接 5. InetAddress類 6. 套接字Socket 7. 使用多線程處理套接字連接 8. UDP數(shù)據(jù)報(bào) 9. 廣播數(shù)據(jù)包,11.1 URL類,包中的 URL類是對(duì)統(tǒng)一資源定位符(Uniform Resource Locator)的抽象,使用URL創(chuàng)建對(duì)象的應(yīng)用程序稱作客戶端程序,一個(gè)URL對(duì)象存放著一個(gè)具體的資源的引用,表明客戶要訪問(wèn)這個(gè)URL中的資源,利用URL對(duì)象可以獲取URL中的資源。一個(gè)URL對(duì)象通常包含最基本的三部分信息:協(xié)議、地址、資源。協(xié)議必須是URL對(duì)象所在的Java虛擬機(jī)支持的協(xié)議,許多協(xié)議并不為我們所常用,而常用的Http、Ftp、file協(xié)議都是虛擬機(jī)支持的協(xié)議;地址必須是能連接的有效IP地址或域名;資源可以是主機(jī)上的任何一個(gè)文件。,1URL的構(gòu)造方法 public URL(String spec) throws MalformedURLException 該構(gòu)造方法使用字符串初始化一個(gè)URL對(duì)象,例如 try url=new URL(““); catch(MalformedURLException e) System.out.println (“Bad URL:“+url); ,該URL對(duì)象使用的協(xié)議是“Http”協(xié)議,即用戶按著這種協(xié)議和指定的服務(wù)器通信,該URL對(duì)象包含的地址是“”,所包含的資源是默認(rèn)的資源(主頁(yè))。 public URL(String protocol, String host,String file) throws MalformedURLException 該構(gòu)造方法構(gòu)造的URL對(duì)象的協(xié)議、地址和資源分別由參數(shù)protocol、host和file指定,返回,11.2 讀取URL中的資源,URL對(duì)象調(diào)用 InputStream openStream() 方法可以返回一個(gè)輸入流,該輸入流指向URL對(duì)象所包含的資源。通過(guò)該輸入流可以將服務(wù)器上的資源信息讀入到客戶端。 下面的例子1在一個(gè)文本框中輸入網(wǎng)址,然后點(diǎn)擊確定按鈕讀取服務(wù)器上的資源,由于網(wǎng)絡(luò)速度或其它的因素,URL資源的讀取可能會(huì)引起堵塞,因此,程序需在一個(gè)線程中讀取URL資源,以免堵塞主線程。,返回,11.3 顯示URL資源中的html文件,在上面的例子1中,我們可以將的主頁(yè)的內(nèi)容顯示在文本區(qū)中,但是,有時(shí)候我們想看到網(wǎng)頁(yè)的運(yùn)行效果。Javax.swing包中的JEditorPane類可以解釋執(zhí)行html文件,也就是說(shuō),如果你把html文件讀入到JEditorPane,該html文件就會(huì)被解釋執(zhí)行,顯示在JEditorPane中,這樣程序就看到了網(wǎng)頁(yè)的運(yùn)行效果。,可以使用JEditorPane類的構(gòu)造方法: public JEditorPane() public JEditorPane(URL initialPage) throws IOException public JEditorPane(String url) throws IOException 構(gòu)造JEditorPane對(duì)象,后兩個(gè)構(gòu)造方法使用參數(shù)initialPage或url指定該對(duì)象最初顯示的URL中的資源。JEditorPane對(duì)象調(diào)用 public void setPage(URL page) throws IOException 法可以顯示新的URL中的資源。 在下面的例子2中,我們用JEditorPane對(duì)象顯示網(wǎng)頁(yè)。,返回,11.4 處理超鏈接,當(dāng)JEditorPane對(duì)象調(diào)用setEditable方法將編輯屬性設(shè)為false時(shí),不僅可以顯示網(wǎng)頁(yè)的運(yùn)行效果,而且用戶如果單擊網(wǎng)頁(yè)中超鏈接還可以使得JEditorPane對(duì)象觸發(fā)HyperlinkEvent事件。程序可以通過(guò)處理HyperlinkEvent事件,來(lái)顯示新的URL資源。JEditorPane對(duì)象調(diào)用 addHyperlinkListener(HyperlinkListener listener) 獲得監(jiān)視器。監(jiān)視器需實(shí)現(xiàn)HyperlinkListener接口, 該接口中的方法是:void hyperlinkUpdate(HyperlinkEvent e) 在下面的例子中,當(dāng)單擊超鏈接時(shí),JEditorPane對(duì)象 將顯示超鏈接所鏈接的網(wǎng)頁(yè)。,返回,11.5 InetAdress類,我們已經(jīng)知道Internet上的主機(jī)有兩種方式表示地址: (1)域名 例如, (2)IP 地址 例如,10 包中的InetAddress類對(duì)象含有一個(gè)Internet主機(jī)地址的域名和IP地址: /10。 域名容易記憶,當(dāng)你在連接網(wǎng)絡(luò)時(shí)輸入一個(gè)主機(jī)的域名后,域名服務(wù)器(DNS)負(fù)責(zé)將域名轉(zhuǎn)化成IP地址,這樣我們才能和主機(jī)建立連接。,1獲取Internet上主機(jī)的地址 我們可以使用InetAddress類的靜態(tài)方法: getByName(String s); 將一個(gè)域名或IP地址傳遞給該方法的參數(shù)s,獲得一個(gè) InetAddress對(duì)象,該對(duì)象含有主機(jī)地址的域名和IP地 址,該對(duì)象用如下格式表示它包含的信息: /0 下面的例子4分別獲取域名是的主機(jī)域名及IP地址,同時(shí)獲取了IP地址是的主機(jī)域名及IP地址。,當(dāng)你運(yùn)行上述程序時(shí)應(yīng)保證你已經(jīng)連接到Internet(通過(guò)撥號(hào)或局域網(wǎng)連接到Internet上)。上述程序的 運(yùn)行結(jié)果: /0 / 另外,InetAddress類中含有兩個(gè)實(shí)例方法: public String getHostName() 取InetAddress對(duì)象所 含的域名。 public String getHostAddress() 獲取InetAddress對(duì)象所含的IP地址。,2獲取本地機(jī)的地址 我們可以使用InetAddress類的靜態(tài)方法: getLocalHost(); 獲得一個(gè)InetAddress對(duì)象,該對(duì)象含有本地機(jī)的域名和IP地址。,返回,11.6 套接字Socket,IP地址標(biāo)識(shí)Internet上的計(jì)算機(jī),端口號(hào)標(biāo)識(shí)正在計(jì)算機(jī)上運(yùn)行的進(jìn)程(程序)。端口號(hào)與IP地址的組合得出一個(gè)網(wǎng)絡(luò)套接字。端口號(hào)被規(guī)定為一個(gè)16位的整數(shù)065535。其中,01023被預(yù)先定義的服務(wù)通信占用(如telnet占用端口23,http占用端口80等)。除非我們需要訪問(wèn)這些特定服務(wù),否則,就應(yīng)該使用102465535這些端口中的某一個(gè)進(jìn)行通信,以免發(fā)生端口沖突。,1套接字連接 所謂套接字連接就是客戶端的套接字對(duì)象和服務(wù)器端的套接字對(duì)象通過(guò)輸入、輸出流連接在一起,現(xiàn)在我們分三個(gè)步驟來(lái)說(shuō)明套接字連接的基本模式。 (1)服務(wù)器建立ServerSocket對(duì)象 ServerSocket對(duì)象負(fù)責(zé)等待客戶端請(qǐng)求建立套接字連接,類似郵局某個(gè)窗口中的業(yè)務(wù)員。也就是說(shuō),服務(wù)器必須事先建立一個(gè)等待客戶請(qǐng)求建立套接字連接的ServerSocket對(duì)象。ServerSocket的構(gòu)造方法是: ServerSocket(int port),當(dāng)建立服務(wù)器套接字時(shí)可能發(fā)生IOException異常,因此要象下面那樣建立接收客戶的服務(wù)器套接字。 try ServerSocket waitSocketConnection=new ServerSocket(1880); catch(IOException e) 當(dāng)服務(wù)器的ServerSocket對(duì)象waitSocketConnection建立后,就可以使用方法accept()接受客戶的套接字連接請(qǐng)求,代碼如下所示: waitSocketConnection.accept();,接收客戶的套接字也可能發(fā)生IOException異常,因此要象下面那樣建立接受客戶的套接字。 try Socket socketAtServer= waitSocketConnection.accept(); catch(IOException e) 所謂“接收”客戶的套接字請(qǐng)求,就是accept()方法會(huì)返回一個(gè)Socket對(duì)象:socketAtServer,稱作服務(wù)器端的套接字對(duì)象。,Socket socketAtServer = waitSocketConnection.accept(); System.out.println(“ok”) catch(IOException e) (2)客戶端創(chuàng)建Socke對(duì)象。 客戶端程序可以使用Socket類創(chuàng)建對(duì)象,Socket的構(gòu) 方法是: Socket(String host,int port) 參數(shù)host是服務(wù)器的IP地址,port是一個(gè)端口號(hào)。,也可以使用Socket類不帶參數(shù)的構(gòu)造方法 public Socket() 創(chuàng)建一個(gè)套接字對(duì)象,該對(duì)象不請(qǐng)求任何連接。該對(duì)象再調(diào)用 public void connect(SocketAddress endpoint) throws IOException 請(qǐng)求和參數(shù)SocketAddress指定地址的套接字建立連接。為了使用connect方法,可以使用SocketAddress的子類:InetSocketAddress創(chuàng)建一個(gè)對(duì)象,InetSocketAddress的構(gòu)造方法是: public InetSocketAddress(InetAddress addr, int port),創(chuàng)建Socket對(duì)象可能發(fā)生IOException異常,因此要象 下面那樣建立到服務(wù)器的套接字連接 try Socket socketAtClient=new Socket(“8”,1880); catch(IOException e) 客戶端建立socketAtClient對(duì)象的過(guò)程就是向服務(wù)器發(fā)出套接字連接請(qǐng)求,如果服務(wù)器端相應(yīng)的端口上有ServerSocket對(duì)象正在使用accept方法等待客戶,那么雙方的套接字對(duì)象socketAtClient和socketAtServer就都誕生了。,(3)流連接 客戶端和服務(wù)器端的套接字對(duì)象誕生以后,還必須進(jìn) 行輸入、輸出流的連接。 服務(wù)器端的這個(gè)Socket對(duì)象socketAtServer使用方法 getOutputStream() 獲得的輸出流將指向客戶端Socket對(duì)象socketAtClient 使用方法 getInputStream() 獲得的那個(gè)輸入流;同樣,服務(wù)器端的這個(gè)Socket對(duì)象ocketAtServer使用方法,getInputStream() 獲得的輸入流將指向客戶端Socket對(duì)象socketAtClient使用方法 getOutputStream() 獲得的那個(gè)輸出流。因此,當(dāng)服務(wù)器向這個(gè)輸出流寫入信息時(shí),客戶端通過(guò)相應(yīng)的輸入流就能讀取,反之亦然。,連接建立后,服務(wù)器端的套接字對(duì)象調(diào)用getInetAddress()方法可以獲取一個(gè)InetAddess對(duì)象,該對(duì)象含有客戶端的IP地址和域名,同樣,客戶端的套接字對(duì)象調(diào)用getInetAddress()方法可以獲取一個(gè)InetAddess對(duì)象,該對(duì)象含有服務(wù)器端的IP地址和域名。 套接字調(diào)用 close()可以關(guān)閉雙方的套接字連接,只要一方關(guān)閉連接,就會(huì)導(dǎo)致對(duì)方發(fā)生IOException異常。 下面我們通過(guò)一個(gè)簡(jiǎn)單的例子說(shuō)明上面講的概念。,在例子5中,客戶端向服務(wù)器發(fā)出ASCII表的順序值:1127;服務(wù)器接受這些數(shù)據(jù),并將順序值對(duì)應(yīng)的字符返回給客戶。你首先將例子5中服務(wù)器端的Server.java編譯通過(guò),并運(yùn)行起來(lái),等待客戶請(qǐng)求連接。然后運(yùn)行客戶端程序。,返回,11.7 使用多線程處理套接字連接,套接字連接中涉及到輸入流和輸出流操作,客戶或服務(wù)器讀取數(shù)據(jù)可能會(huì)引起堵塞,我們應(yīng)把讀取數(shù)據(jù)放在一個(gè)單獨(dú)的線程中去進(jìn)行。另外,服務(wù)器端收到一個(gè)客戶的套接字后,就應(yīng)該啟動(dòng)一個(gè)專門為該客戶服務(wù)的線程。 我們用學(xué)過(guò)的組件,設(shè)計(jì)一個(gè)略微復(fù)雜的套接字連接。 在下面的例子6中,客戶輸入一個(gè)一元二次方程的系數(shù)并發(fā)送給服務(wù)器,服務(wù)器把計(jì)算出的方程的實(shí)根返回 給客戶。因此你可以將計(jì)算量大的工作放在服務(wù)器端,客戶負(fù)責(zé)計(jì)算量小的工作,實(shí)現(xiàn)客戶-服務(wù)器交互計(jì)算,來(lái)完成某項(xiàng)任務(wù)。,返回,11.8 UDP數(shù)據(jù)報(bào),基于UDP通信的基本模式是 (1)將數(shù)據(jù)打包,稱為數(shù)據(jù)包(好比將信件裝入信封一樣),然后將數(shù)據(jù)包發(fā)往目的地。 (2)接受別人發(fā)來(lái)的數(shù)據(jù)包(好比接收信封一樣),然后查看數(shù)據(jù)包中的內(nèi)容。 1發(fā)送數(shù)據(jù) (1)創(chuàng)建DatagramPacket對(duì)象 首先用DatagramPacket類將數(shù)據(jù)打包,即用DatagramPacket類創(chuàng)建一個(gè)對(duì)象,稱為數(shù)據(jù)包。,返回,用DatagramPacket的以下兩個(gè)構(gòu)造方法創(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) 使用構(gòu)造方法創(chuàng)建的數(shù)據(jù)包對(duì)象具有下列兩個(gè)性質(zhì): 含有data數(shù)組指定的數(shù)據(jù)。 該數(shù)據(jù)包將發(fā)送到地址是address、端口號(hào)是port的主機(jī)上。,我們稱address是它的目標(biāo)地址、port是這個(gè)數(shù)據(jù)包的目標(biāo)端口號(hào)。其中,第2個(gè)構(gòu)造方法創(chuàng)建的數(shù)據(jù)包對(duì)象含有數(shù)組data從offset開始指定長(zhǎng)度的數(shù)據(jù)。 例如: byte data =“近來(lái)好嗎“.getByte(); InetAddtress address=InetAddtress.getName(““); DatagramPacket data_pack=new DatagramPacket(data,data.length, address,980);,(2)發(fā)送數(shù)據(jù) 然后用 DatagramSocket類的不帶參數(shù)的構(gòu)造方法:DatagramSocket()創(chuàng)建一個(gè)對(duì)象,該對(duì)象負(fù)責(zé)發(fā)送數(shù)據(jù)包。例如, DatagramSocket mail_out=new DatagramSocket(); mail_out.send(data_pack);,2接收數(shù)據(jù) DatagramSocket類另一個(gè)構(gòu)造方法: DatagramSocket(int port) 創(chuàng)建一個(gè)對(duì)象,其中的參數(shù)必須和待接收的數(shù)據(jù)包的端口號(hào)相同。例如,如果發(fā)送方發(fā)送的數(shù)據(jù)包的端口號(hào)是5666: DatagramSocket mail_in=new DatagramSocket(5666);,該對(duì)象mail_in使用方法 receive(DatagramPacket pack 接受數(shù)據(jù)包。該方法有一個(gè)數(shù)據(jù)包參數(shù)pack,方法receive把收到的數(shù)據(jù)包傳遞給該參數(shù)。因此我們必須預(yù)備一個(gè)數(shù)據(jù)包以便收取數(shù)據(jù)包。這時(shí)需使用 DatagramPack類的另外一個(gè)構(gòu)造方法:DatagramPack(byte data ,int length)創(chuàng)建一個(gè)數(shù)據(jù)包,用于接收數(shù)據(jù)包,例如: byte data=new byte100;int length=90; DatagramPacket pack=new,DatagramPacket(data,length); mail_in.receive(pack); 該數(shù)據(jù)包pack將接收長(zhǎng)度是length的數(shù)據(jù)放入data。 在下面的例子7中兩個(gè)主機(jī)(可用本地機(jī)模擬)互相發(fā)送和接收數(shù)據(jù)包。,返回,11.9 廣播數(shù)據(jù)包,廣播數(shù)據(jù)包類似于電臺(tái)廣播,進(jìn)行廣播的電臺(tái)需在指定的波段和頻率上廣播信息,接收者只有將收音機(jī)調(diào)到指定的波段、頻率上才能收聽到廣播的內(nèi)容。 廣播數(shù)據(jù)包涉及到地址和端口。我們知道,Internet的地址是a.b.c.d的形式。該地址的一部分代表用戶自己主機(jī),而另一部分代表用戶所在的網(wǎng)絡(luò)。當(dāng)a小于128,那么b.c.d就用來(lái)表示主機(jī),這類地址稱做A類地址。如果a大于等于128并且小于192,則a.b表示網(wǎng)絡(luò)地址,而c.d表示主機(jī)地址,這類地址稱做B類地址。如果a大于等于192,則網(wǎng)絡(luò)地址是a.b.c,d表示主機(jī)地址,這類地址稱做C類地址。,與55之間的地址稱做D類地址,D類地址并不代表某個(gè)特定主機(jī)的位置,一個(gè)具有A、B或C類地址的主機(jī)要廣播數(shù)據(jù)或接收廣播,都必須加入到同一個(gè)D類地址。一個(gè)D類地址也稱做一個(gè)組播地址,加入到同一個(gè)組播地址的主機(jī)可以在某個(gè)端口上廣播信息,也可以在某個(gè)端口號(hào)上接收信息。 準(zhǔn)備廣播或接收的主機(jī)需經(jīng)過(guò)下列步驟: 11.設(shè)置組播地址 使用InetAddress類創(chuàng)建組播組地址,例如: InetAddress group=InetAddress.getByName(““);,2創(chuàng)建多點(diǎn)廣播套接字 使用
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司設(shè)備部管理制度
- 辦公司7s管理制度
- 塑料模具廠管理制度
- 導(dǎo)播室設(shè)備管理制度
- 小酒吧股東管理制度
- 急救120管理制度
- 施工中項(xiàng)目管理制度
- 柳林燒烤攤管理制度
- 校園督導(dǎo)室管理制度
- 檔案文書等管理制度
- 外包施工協(xié)議書
- 我的1919中英字幕對(duì)照
- 人工智能基礎(chǔ)與應(yīng)用課件
- 2022-2023學(xué)年吉林省重點(diǎn)中學(xué)小升初數(shù)學(xué)入學(xué)考試卷含答案
- 第六講 以新發(fā)展理念引領(lǐng)高質(zhì)量發(fā)展PPT習(xí)概論2023優(yōu)化版教學(xué)課件
- 中考病句修改試題及答案(完整版)資料
- 信義光伏產(chǎn)業(yè)(安徽)控股有限公司七期江北光伏組件蓋板項(xiàng)目(A 段)環(huán)境影響報(bào)告表
- 2022年省南平市高校畢業(yè)生服務(wù)社區(qū)計(jì)劃招募考試真題
- 下肢靜脈曲張的規(guī)范治療
- 計(jì)算機(jī)組成與設(shè)計(jì)知到章節(jié)答案智慧樹2023年山東大學(xué)
- 注塑模具結(jié)構(gòu)最清晰原創(chuàng)圖文含動(dòng)畫
評(píng)論
0/150
提交評(píng)論