馮澤正網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì)實(shí)驗(yàn)報(bào)告_第1頁
馮澤正網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì)實(shí)驗(yàn)報(bào)告_第2頁
馮澤正網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì)實(shí)驗(yàn)報(bào)告_第3頁
馮澤正網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì)實(shí)驗(yàn)報(bào)告_第4頁
馮澤正網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì)實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、程 序 實(shí) 踐 報(bào) 告(網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì))姓 名馮澤正學(xué) 號(hào)20134620班 級(jí)軟英1301指 導(dǎo) 教 師劉老師程序?qū)嵺`名稱網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì)實(shí)踐程序?qū)嵺`內(nèi)容網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì)開 設(shè) 學(xué) 期2014-2015第二學(xué)期開 設(shè) 時(shí) 間第5周第6周報(bào)告日期2015.4.18評(píng) 定 成 績評(píng)定人簽字評(píng) 定 日 期東北大學(xué)軟件學(xué)院網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì)實(shí)踐 1. 實(shí)踐目的l (1) 通過查看HTTP協(xié)議的RFC文檔,理解并掌握HTTP協(xié)議,線程和進(jìn)程的區(qū)別,分布式系統(tǒng)的基本概念,RMI工作原理,加深理解Web的工作原理;l (2) 掌握網(wǎng)絡(luò)應(yīng)用程序的開發(fā)方法;Socket機(jī)制的工作原理;布式系統(tǒng)應(yīng)用程序的開發(fā)方

2、法;l (3) 能夠用Java語言編寫簡單的HTTP 1.0客戶端和服務(wù)器端的程序; 能夠用Java語言多線程機(jī)制,編寫多線程服務(wù)器端的程序;能夠用Java語言RMI機(jī)制,編寫RMI程序。2. 預(yù)習(xí)內(nèi)容 l (1) TCP/IP協(xié)議棧;l (2) Web技術(shù)相關(guān)知識(shí)和HTTP協(xié)議;l (3) Java的網(wǎng)絡(luò)編程相關(guān)知識(shí);l (4) 網(wǎng)絡(luò)應(yīng)用程序的開發(fā)方法;l (5) Socket機(jī)制;l (6) Java多線程編程相關(guān)知識(shí);l (7) RMI機(jī)制;3. 實(shí)踐內(nèi)容和實(shí)踐過程1. 編寫簡單的HTTP 1.0 客戶端程序;編寫簡單的HTTP 1.0 服務(wù)器程序;(1) 實(shí)踐內(nèi)容: 對(duì)比HTTP1.0

3、與HTTP1.1的差異要求:利用網(wǎng)絡(luò)資源查詢HTTP協(xié)議的RFC文檔,并分析和歸納HTTP1.0與HTTP1.1的差異;編寫簡單的HTTP 1.0 客戶端程序要求:通過命令行接口構(gòu)建簡單的HTTP1.0客戶端程序命令行要求能夠帶一個(gè)唯一的表示服務(wù)器域名的參數(shù)(例如);簡單的HTTP1.0客戶端程序要求能夠和Internet上的Web服務(wù)器建立TCP連接;Internet上的Web服務(wù)器能夠處理使用該客戶端程序發(fā)送的簡單請求(例如HTTP的GET請求);簡單的HTTP1.0客戶端程序能夠接受服務(wù)器響應(yīng),在命令行上顯示出服務(wù)器的應(yīng)答頭部,把服務(wù)器的應(yīng)答內(nèi)容保存在一個(gè)文件中。編寫簡單的HTTP 1.

4、0 服務(wù)器程序要求:構(gòu)建端口為8000的簡單HTTP1.0服務(wù)器程序;該服務(wù)器能夠?qū)λ械恼埱螅ú徽撌欠窈戏ǎ┒冀o予應(yīng)答,其中要求對(duì)HTTP的GET方法根據(jù)RFC規(guī)定給予成功的響應(yīng);在任何情況下,服務(wù)器都要能夠提供服務(wù);通過給命令行傳遞參數(shù)指定服務(wù)器的默認(rèn)訪問目錄(例如把c:www作為命令行參數(shù)傳遞給服務(wù)器,那么如果客戶發(fā)送請求GET /test/index.html,那么服務(wù)器應(yīng)該把文件C:wwwtestindex.html發(fā)送給客戶端,如果文件不存在應(yīng)該提示出錯(cuò));(可選)服務(wù)器在成功地給予響應(yīng)的同時(shí),應(yīng)該能夠根據(jù)文件的擴(kuò)展名,推斷出至少2種文件的MIME類型(例如如果文件的擴(kuò)展名為.ht

5、m 或者.html,那么文件的MIME類型為text/html);服務(wù)器能夠響應(yīng)嵌入JPEG文件的HTML頁面;能夠通過Netscape or Internet Explorer瀏覽器訪問HTTP1.0服務(wù)器中存放的Web頁;(2) 實(shí)現(xiàn)過程客戶端:構(gòu)建Socket服務(wù)器端:構(gòu)建ServerSocket通過Socket連接服務(wù)器構(gòu)建Socket接收客戶端連接發(fā)送請求報(bào)文分析請求報(bào)文并返回響應(yīng)報(bào)文接收響應(yīng)報(bào)文并處理Socket斷開關(guān)閉連接(3) 關(guān)鍵技術(shù)accept()等待客戶端與服務(wù)器連接private static String basePath=”"本機(jī)地址URLDecoder.

6、decode()轉(zhuǎn)換格式InputStream getInputStream()返回輸入流,實(shí)現(xiàn)從套接字讀取信息OutputStream getOutputStream()返回輸出流實(shí)現(xiàn)套接字寫入信息getLocalPort()返回建立與客戶端連接的端口號(hào)Public void close()關(guān)閉服務(wù)器端ServerSocket對(duì)象1、客戶端:public void run()Socket socket;BufferedInputStream in;PrintWriter out;trysocket = new Socket(addr, port);System.out.println(&qu

7、ot;連接" +socket.getRemoteSocketAddress() + "搞定");in = new BufferedInputStream(socket.getInputStream();out = new PrintWriter(socket.getOutputStream(), true);BufferedReader stdIn = new BufferedReader(newInputStreamReader(System.in);System.out.println("請輸入您要獲取的資源文件名:");String in

8、put = stdIn.readLine();if (input = null)input = "index.html"while (input != null) if (input.equalsIgnoreCase("exit")System.out.println("斷開" + socket.getRemoteSocketAddress()+ "連接");in.close();out.close();socket.close();System.exit(0);System.out.println("G

9、ET /" + input + "HTTP/1.0rn");out.print("GET /" + input + " HTTP/1.0rn");out.println("Host: " + addr);out.println("User-agent: Mozilla/5.0");out.println("Accept: */*");out.println("Accept-language: zh-CN");out.println("C

10、onnection: close");out.print("rn");/ 通過寫入行分隔符字符串終止當(dāng)前行out.flush();2:服務(wù)器public void Service(File file, Socket socket ,String type) throws IOExceptionString contentType = type;PrintWriter out = new PrintWriter(socket.getOutputStream(), true);out.print("HTTP/1.0 200 OKrn");out.p

11、rint("Server: Jerrod_Feng serverrn");out.print("Date: " + DateFormat.getDateInstance().format(new Date()+ "rn");out.print("Content-Type: "+ contentType +"rn");out.print("Content-Length: " + file.length() + "rn");out.print("rn

12、");out.flush();DataInputStream input = new DataInputStream(new FileInputStream(file);DataOutputStream output = new DataOutputStream(socket.getOutputStream();byte data = new byte(int) file.length();input.readFully(data);output.write(data, 0, (int) file.length();output.flush();input.close();out.c

13、lose();output.close();(4) 遇到的問題及解決方案用瀏覽器訪問簡單的HTTP1.0服務(wù)器程序時(shí),無法顯示圖片以及部分中文亂碼解決方案:將HTTP1.0服務(wù)器程序所有的輸出流全部改為字節(jié)輸出流,而不是字符輸出流。瀏覽器無法解析簡單HTTP1.0服務(wù)器程序返回的響應(yīng)。解決方案:觀察發(fā)現(xiàn)響應(yīng)報(bào)文頭部在響應(yīng)實(shí)體后到達(dá)瀏覽器,故瀏覽器無法正確解析響應(yīng),所以在簡單HTTP1.0服務(wù)器程序中在響應(yīng)報(bào)文的響應(yīng)頭部后flush()一下,以保證響應(yīng)頭部先到達(dá)瀏覽器。2. 編寫多線程Web服務(wù)器;(1) 實(shí)踐內(nèi)容編寫簡單的多線程HTTP 1.0 服務(wù)器程序?qū)嶒?yàn)4中HTTP 1.0 服務(wù)器程序要

14、求:構(gòu)建端口為8000的簡單HTTP1.0服務(wù)器程序;該服務(wù)器能夠?qū)λ械恼埱螅ú徽撌欠窈戏ǎ┒冀o予應(yīng)答,其中要求對(duì)HTTP的GET方法根據(jù)RFC規(guī)定給予成功的響應(yīng);在任何情況下,服務(wù)器都要能夠提供服務(wù);通過給命令行傳遞參數(shù)指定服務(wù)器的默認(rèn)訪問目錄(例如把c:www作為命令行參數(shù)傳遞給服務(wù)器,那么如果客戶發(fā)送請求GET /test/index.html,那么服務(wù)器應(yīng)該把文件C:wwwtestindex.html發(fā)送給客戶端,如果文件不存在應(yīng)該提示出錯(cuò));(可選)服務(wù)器在成功地給予響應(yīng)的同時(shí),應(yīng)該能夠根據(jù)文件的擴(kuò)展名,推斷出至少2種文件的MIME類型(例如如果文件的擴(kuò)展名為.htm 或者.htm

15、l,那么文件的MIME類型為text/html);服務(wù)器能夠響應(yīng)嵌入JPEG文件的HTML頁面;能夠通過Netscape or Internet Explorer瀏覽器訪問HTTP1.0服務(wù)器中存放的Web頁;修改簡單HTTP1.0服務(wù)器程序,將服務(wù)器轉(zhuǎn)換成多線程服務(wù)器,使服務(wù)器能夠同時(shí)處理多個(gè)客戶請求。(2) 實(shí)現(xiàn)過程子線程1處理后返回客戶端服務(wù)器端:接收客戶端連接請求,并交給子線程處理,主線程繼續(xù)等待客戶端連接請求客戶端1連接請求子線程2處理后返回客戶端客戶端2連接請求子線程3處理后返回客戶端客戶端3連接請求(3) 關(guān)鍵技術(shù)class MyThread extends ThreadSock

16、et client;private static String basePath = ""private static int count;public MyThread(Socket client) this.client = client;count+;public void run()while (true) Socket client = null;/ 客戶端SocketMyThread t1 = null;client = threadedServer.serverSocket.accept();/ 客戶已經(jīng)連接到當(dāng)前服務(wù)器t1 = new MyThread(cl

17、ient);t1.start();(4) 遇到的問題及解決方案不斷的新線程創(chuàng)建,停不下來。解決方案:原因是線程類的run()方法中加了while(true)循環(huán),實(shí)際上這個(gè)循環(huán)應(yīng)該加在主線程中,使服務(wù)器一直運(yùn)行,用來接收多個(gè)客戶端的連接請求,而交付給子線程處理,只需執(zhí)行一次即可。3. 編寫RMI程序;(1) 實(shí)踐內(nèi)容編寫RMI程序用RMI構(gòu)建一個(gè)分布式共享會(huì)議議程服務(wù)。不同的客戶應(yīng)該能夠使用共享會(huì)議議程服務(wù),該服務(wù)提供會(huì)議的查詢、增加和刪除功能。會(huì)議議程服務(wù)器有允許用戶注冊和撤銷會(huì)議的功能。用戶注冊功能:新的用戶必須注冊,注冊時(shí)必須提供一個(gè)用戶名和一個(gè)密碼。如果新用戶提供的用戶名已經(jīng)被其他人使

18、用了,要求提示一個(gè)出錯(cuò)信息。如果新用戶注冊成功,也要輸出一個(gè)提示信息。register username password增加會(huì)議:注冊用戶可以在他自己的會(huì)議議程上增加會(huì)議。會(huì)議必須在兩個(gè)注冊用戶之間召開。一個(gè)注冊用戶如果沒有其他可用的注冊用戶將不能召開會(huì)議。增加會(huì)議時(shí),需要提供會(huì)議的開始和結(jié)束時(shí)間、會(huì)議的標(biāo)注、召開會(huì)議的用戶名稱。會(huì)議增加后,該會(huì)議要在增加會(huì)議的用戶的會(huì)議議程中顯示,同時(shí)要在另一個(gè)參加會(huì)議的用戶的會(huì)議議程中顯示。如果一個(gè)用戶已有的會(huì)議和新增的會(huì)議沖突,應(yīng)該提示出錯(cuò)信息,同時(shí)該會(huì)議將不能被增加到會(huì)議議程中。不管會(huì)議能否被增加,程序都要給用戶提示信息。add username p

19、assword otherusername start end title 查詢會(huì)議:注冊的用戶如果給定一個(gè)時(shí)間間隔可以查詢自己在某個(gè)時(shí)間段的會(huì)議議程上的所有會(huì)議(既包括注冊用戶召開的會(huì)議,也包括注冊用戶被邀請參加的會(huì)議)。查詢會(huì)議提供的參數(shù)包括查詢時(shí)間段的起始和結(jié)束時(shí)間。查詢結(jié)束后,輸出在特定時(shí)間段內(nèi)所有會(huì)議實(shí)體列表。該列表包括會(huì)議的開始時(shí)間、結(jié)束時(shí)間、會(huì)議的標(biāo)注、召開會(huì)議的用戶的名字。query username password start end 刪除會(huì)議:注冊用戶可以刪除已經(jīng)創(chuàng)建的會(huì)議。刪除會(huì)議應(yīng)該提供的參數(shù)包含刪除會(huì)議的執(zhí)行用戶和唯一能夠標(biāo)識(shí)會(huì)議的標(biāo)識(shí)符。delete userna

20、me password meetingid清除會(huì)議:注冊用戶清除自己召開的所有的會(huì)議。clear username password(2) 實(shí)現(xiàn)過程registry客戶端1連接請求調(diào)用服務(wù)對(duì)象通過loopup服務(wù)注冊服務(wù)器:提供RMI服務(wù)遠(yuǎn)程服務(wù)(3) 關(guān)鍵技術(shù)1、 服務(wù)器端:public class MeetingServerprivate static int PORT= 9000;public static void main(String args) throws MalformedURLException,RemoteException, NotBoundExceptionSyste

21、m.out.println("運(yùn)行RMI服務(wù)!");try/ 建立服務(wù)對(duì)象,并與名綁定RMIMeetingImpl service = new RMIMeetingImpl(); / 構(gòu)建服務(wù)對(duì)象serviceString registry = "localhost"String registration = "rmi:/" + registry + ":" + PORT+ "/RMIMeeting"System.out.println(registration);Naming.rebind(r

22、egistration, service);System.out.println("RMIMeeting已經(jīng)成功啟動(dòng)!");catch (Exception e) System.err.println(e);2、 客戶端:public static void main(String args)client = new RMIClient();String registry = "localhost"if (args.length >= 1) registry = args0;String registration = "rmi:/&quo

23、t; + registry + ":9000" + "/RMIMeeting"tryservice = (RMIMeeting) Naming.lookup(registration); / 得到service遠(yuǎn)程對(duì)象的遠(yuǎn)程引用System.out.println("成功連接上服務(wù)器!");catch (NumberFormatException e1) e1.printStackTrace();catch (MalformedURLException e1) e1.printStackTrace();catch (RemoteException e1) System.out.println("連接服務(wù)器失敗!");e1.printStackTrace();catch (NotBoundException e1) e1.pr

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論