馮澤正網絡應用程序設計實驗報告_第1頁
馮澤正網絡應用程序設計實驗報告_第2頁
馮澤正網絡應用程序設計實驗報告_第3頁
馮澤正網絡應用程序設計實驗報告_第4頁
馮澤正網絡應用程序設計實驗報告_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

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

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

4、0 服務器程序要求:構建端口為8000的簡單HTTP1.0服務器程序;該服務器能夠對所有的請求(不論是否合法)都給予應答,其中要求對HTTP的GET方法根據RFC規(guī)定給予成功的響應;在任何情況下,服務器都要能夠提供服務;通過給命令行傳遞參數(shù)指定服務器的默認訪問目錄(例如把c:www作為命令行參數(shù)傳遞給服務器,那么如果客戶發(fā)送請求GET /test/index.html,那么服務器應該把文件C:wwwtestindex.html發(fā)送給客戶端,如果文件不存在應該提示出錯);(可選)服務器在成功地給予響應的同時,應該能夠根據文件的擴展名,推斷出至少2種文件的MIME類型(例如如果文件的擴展名為.ht

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

6、decode()轉換格式InputStream getInputStream()返回輸入流,實現(xiàn)從套接字讀取信息OutputStream getOutputStream()返回輸出流實現(xiàn)套接字寫入信息getLocalPort()返回建立與客戶端連接的端口號Public void close()關閉服務器端ServerSocket對象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");/ 通過寫入行分隔符字符串終止當前行out.flush();2:服務器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服務器程序時,無法顯示圖片以及部分中文亂碼解決方案:將HTTP1.0服務器程序所有的輸出流全部改為字節(jié)輸出流,而不是字符輸出流。瀏覽器無法解析簡單HTTP1.0服務器程序返回的響應。解決方案:觀察發(fā)現(xiàn)響應報文頭部在響應實體后到達瀏覽器,故瀏覽器無法正確解析響應,所以在簡單HTTP1.0服務器程序中在響應報文的響應頭部后flush()一下,以保證響應頭部先到達瀏覽器。2. 編寫多線程Web服務器;(1) 實踐內容編寫簡單的多線程HTTP 1.0 服務器程序實驗4中HTTP 1.0 服務器程序要

14、求:構建端口為8000的簡單HTTP1.0服務器程序;該服務器能夠對所有的請求(不論是否合法)都給予應答,其中要求對HTTP的GET方法根據RFC規(guī)定給予成功的響應;在任何情況下,服務器都要能夠提供服務;通過給命令行傳遞參數(shù)指定服務器的默認訪問目錄(例如把c:www作為命令行參數(shù)傳遞給服務器,那么如果客戶發(fā)送請求GET /test/index.html,那么服務器應該把文件C:wwwtestindex.html發(fā)送給客戶端,如果文件不存在應該提示出錯);(可選)服務器在成功地給予響應的同時,應該能夠根據文件的擴展名,推斷出至少2種文件的MIME類型(例如如果文件的擴展名為.htm 或者.htm

15、l,那么文件的MIME類型為text/html);服務器能夠響應嵌入JPEG文件的HTML頁面;能夠通過Netscape or Internet Explorer瀏覽器訪問HTTP1.0服務器中存放的Web頁;修改簡單HTTP1.0服務器程序,將服務器轉換成多線程服務器,使服務器能夠同時處理多個客戶請求。(2) 實現(xiàn)過程子線程1處理后返回客戶端服務器端:接收客戶端連接請求,并交給子線程處理,主線程繼續(xù)等待客戶端連接請求客戶端1連接請求子線程2處理后返回客戶端客戶端2連接請求子線程3處理后返回客戶端客戶端3連接請求(3) 關鍵技術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();/ 客戶已經連接到當前服務器t1 = new MyThread(cl

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

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

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

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

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

22、egistration, service);System.out.println("RMIMeeting已經成功啟動!");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遠程對象的遠程引用System.out.println("成功連接上服務器!");catch (NumberFormatException e1) e1.printStackTrace();catch (MalformedURLException e1) e1.printStackTrace();catch (RemoteException e1) System.out.println("連接服務器失敗!");e1.printStackTrace();catch (NotBoundException e1) e1.pr

溫馨提示

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

評論

0/150

提交評論