成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

開發JSP HTTP服務器

開發 后端
本文介紹開發JSP HTTP服務器,以及介紹設計思路,設計要點,實施前準備和設計實施等

通過各款JSP HTTP服務器的對比,定位本JSP HTTP服務器的應用方向

對于企業選擇或者設計HTTP服務器,需要考慮很多因素,主要的因素有:穩定性,安全性,執行效率,易用性,可擴展性等。筆者對當前業界中較為流行的HTTP服務器按照常用指標進行了分析和對比,如表1。

HTTP服務器
支持服務頁 運行平臺 安全性 執行效率 易用性
MS IIS ASP MS Windows 一般 一般 容易
MS IIS ISAPI MS Windows 一般 容易
Apache CGI

MS Windows

UNIX,Linux

一般 一般
Tomcat JSP

MS Windows

UNIX,Linux

不易

通過表1我們可以知道,MS IIS只能運行在MS Windows平臺下,且由于IIS的體系設計很大程度上依賴于Windows系統,由于MS Windows系統存在一定的漏洞,從而導致IIS體系的安全性能也比較低。但是IIS安裝使用比較簡單,適用于對安全性和擴展性要求不高的 Windows用戶。

對于Apache和Tomcat(都由Apache Software Foundation研究開發)這兩款當前互聯網上比較流行的HTTP服務器,不僅可以支持MS Windows平臺,也可以支持當前所有主流非Windows平臺(例如:Linux,各種UNIX操作系統),并且安全性能較IIS強。但是對于一般的用戶而言,Apache和Tomcat的配置使用較為復雜一些。所以Apache和Tomcat適用于專業的,對系統安全性和擴展性要求較高的用戶。

另外需要考慮的因素是JSP HTTP服務器的執行效率。在表1中,ASP和CGI都采用即時調用模式,即當客戶端請求該資源時,服務器端會即時解釋并執行該模塊,執行完畢之后即時釋放該模塊,每次獲取請求時都必須解釋和執行該模塊,這樣過多地與磁盤系統進行交互,會造成系統的執行效率的降低。

對于ISAPI而言,其執行模塊是作為動態鏈接庫(DLL)模塊的形態進行調用,初次調用完畢后該模塊將存在于內存中。后續再收到客戶端請求時直接從內存中調用執行該模塊,從而效率較高。但這種情形可能帶來代碼更新的問題。當修改本地代碼時,必須從內存中清空該動態鏈接庫模塊,即需要先關閉服務器后才能更新本地代碼,否則服務器內存中執行的還是舊的代碼模塊。

而對于Tomcat系統而言,這樣的問題都得到了避免。Tomcat將初次執行的Java類模塊載入到內存,后續調用時,直接從內存中調用執行模塊,減少了與磁盤系統的交互。同時通過自動判斷本地代碼是否受到修改而更新載入內存中舊的類模塊。從而不僅執行效率較高,且修改本地代碼也比較方便。

基于上述的研究分析,筆者擬采用擴展性和安全性良好的Java體系來實現一款支持JSP服務頁的HTTP服務器,其功能實現基本覆蓋Tomcat,并在其基礎上增強對CGI的支持和易用性的提高。

一、設計過程
1.搭建HTTP服務器框架

1.1 設計思路

通過建立TCP套接字(端口為80)向客戶端提供HTTP服務。分析客戶端請求(GET,POST請求等),建立請求資源與本地資源的映射關系,實現請求應答。

1.2 設計要點

(1)客戶端請求的多線程支持。
(2)客戶端請求的分析。
(3)請求資源與本地資源映射以及本地資源的應答。
(4)對CGI以及JSP類似請求的接受分析與處理返回。
(5)擴展服務以及特殊指令。

1.3 實施前準備

(1)確定JDK版本并下載JDK
考慮到JDK1.4.2的穩定性,我們考慮使用版本為1.4.2或以上的JDK。從SUN的網站上http://java.sun.com/javase/downloads/index.jsp下載當前平臺支持的JDK。
(2)安裝JDK并配置編譯環境
安裝JDK并設置java路徑($(installation_dir)/bin)到系統PATH變量中。

1.4 設計實施

(1)創建服務套接字

  1. //Create server socket ServerSocket serv = new ServerSocket(SERVER_PORT); 
    System.out.println("HTTP server(port: " + Integer.toString(SERVER_PORT) + ") 
    running...");  

(2)接受客戶端請求并創建請求處理線程

  1. while(true)  
  2. {  
  3. //Accept the client connections   
  4. Socket clnt = serv.accept();  
  5. //Create thread for each client   
  6. HTTPThread HTTPThd = new HTTPThread(clnt, props, ht);  
  7. HTTPThd.start();  
  8. }  

以上代碼中,創建了多線程構架的客戶端請求處理體系。可以及時處理多客戶端連接。

(3)分析請求

客戶端處理線程從客戶端套接字中讀取相應的請求內容,并對請求進行分析。

  1. //Create client socket input stream reader   
  2. m_sin = new BufferedReader(new InputStreamReader(_s.getInputStream() ) );  
  3. ……  
  4. //Get the first line of output from client socket   
  5. request = m_sin.readLine().trim();  
  6. if(request != null)  
  7. {  
  8. //The method is GET   
  9. if(request.startsWith(METHOD_GET) == true)  
  10. {  
  11. parseGetRequest(request);  
  12. }  
  13. //The method is POST   
  14. else if(request.startsWith(METHOD_POST) == true)  
  15. {  
  16. params = m_sin.readLine();  
  17. //Skip the middle lines of POST request   
  18. while( (params != null) && (params.equals("") == false) )  
  19. {  
  20. params = m_sin.readLine();  
  21. }  
  22. //The last line contains those parameters   
  23. params = m_sin.readLine();  
  24. paramsparams = params.trim();  
  25. parsePostRequest(request, params);  
  26. }  
  27. //Close client socket input stream and client socket itself   
  28. m_sin.close();  
  29. m_s.close();  
  30. }  

通過請求內容的***行就可以知道請求方式是GET還是POST。如果是GET請求(例如很多CGI都是GET請求),就可以直接從請求字符串中獲取請求的資源內容。GET請求的格式為:GET <URL> HTTP/1.X。其中URL為請求的資源內容,而1.X是用于指明客戶端所支持的HTTP的版本,當前有1.0和1.1兩個標準。

如果是POST請求,除了請求的資源內容(例如JSP文件)外,在請求的末行中還包含請求資源將要用到的參數行。所以上述代碼中存在掠過中間部分的請求內容,只需要獲取資源內容和參數行即可。

(4)請求資源與本地資源的映射

一般出于安全性考慮,JSP HTTP服務器端不可能將本地的資源路徑和服務提供的路徑相同,而是將本地路徑的某一目錄映射為HTTP服務資源的根目錄,該目錄一般稱之為服務頁根目錄(ServerPageDir)。當客戶端請求資源映射到本地資源時,必須使用本地被映射的目錄替換請求中的根目錄。例如HTTP服務器端將本地路徑“/usr/paul/paul.home”映射為服務頁根目錄。那么客戶端的請求“/sample.jpg”對應本地的路徑資源為“ /usr/paul/paul.home/sample.jpg”。

當請求內容的末尾字符為“/”時,即請求為目錄而不是具體文件時,還存在默認請求的問題,一般目錄的默認請求為該目錄下的index.htm,index.html,index.jsp等文件。

特別是的,出于安全性和習慣考慮,對CGI目錄也進行了映射(一般映射為/cgi-bin/),所以如果請求中包含CGI映射時還必須替換為CGI程序所在目錄。

  1. //If the request start with /cgi-bin,  
  2. //then need replace /cgi-bin with true CGI directory   
  3. if(fname.startsWith(PATH_SEPARATOR + CGI_BIN_DIR) == true)  
  4. {  
  5. fnamefname = fname.replaceFirst(PATH_SEPARATOR + CGI_BIN_DIR, cgiBinDir);  
  6. }  
  7. else //else, file name need append to server documents directory   
  8. {  
  9. fname = serverPageDir + fname;  
  10. }  
  11. //If request is for directory,  
  12. //then need respond default page in the directory   
  13. if(fname.endsWith(PATH_SEPARATOR) == true)  
  14. {  
  15. fnamefname = fname + defaultPage;  
  16. }  

【編輯推薦】

  1. 重構Struts2 JSP分頁
  2. 解決JSP開發Web程序中文顯示三種方法
  3. Java JSP利用Google的Translate開發API
  4. 九個隱含JSP對象的詳細解析
  5. 構造JSP JavaBean開發和發布環境簡介
責任編輯:佚名 來源: IT168
相關推薦

2009-07-06 17:46:25

JSP HTTP服務器

2009-07-06 17:56:12

JSP HTTP服務器

2009-07-06 17:34:38

JSP HTTP服務器

2009-07-06 17:40:05

JSP HTTP服務器

2009-07-06 17:25:22

JSP HTTP服務器

2009-07-06 14:05:11

JSP服務器

2011-04-07 13:39:24

WebHTTP

2009-07-02 17:17:03

2017-11-10 08:58:49

Web服務器應用程序

2009-07-06 18:02:34

JSP服務器

2019-08-22 15:26:24

HTTP服務器Python

2019-04-23 10:48:55

HTTPTomcat服務器

2018-01-19 10:30:48

HTTP服務器代碼

2019-07-04 15:00:32

PythonHTTP服務器

2018-10-09 09:28:12

HTTPHTTP協作服務器

2012-02-07 14:47:03

ApacheHTTP服務器

2018-12-11 10:43:09

Go語言 HTTP服務器

2020-06-17 21:39:11

HTTP協議服務器

2010-05-12 18:15:05

IIS服務器

2010-05-25 13:20:46

http與svn
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人网在线 | 午夜精品久久久久久久久久久久 | 国产精品96久久久久久 | 日韩欧美一区二区在线播放 | jvid精品资源在线观看 | 999久久久久久久久6666 | 亚洲精品电影在线观看 | 一区二区视频 | 国产成人精品高清久久 | 日韩高清一区 | 国产在线精品一区二区三区 | 国产激情91久久精品导航 | 一二三区视频 | 久草免费在线视频 | 作爱视频免费看 | 国产精品成人免费 | 亚洲综合日韩精品欧美综合区 | av网站在线播放 | 丁香久久| av网站免费在线观看 | 欧美一级二级三级 | 亚洲成人免费观看 | 欧美色综合一区二区三区 | 成人免费在线 | 国产九九九 | 欧美一区二区三区视频 | 一级做受毛片免费大片 | 日本一区二区三区免费观看 | 亚洲成人免费视频在线 | 亚洲在线免费 | av在线成人| 久久久精彩视频 | 岛国av在线免费观看 | 国产成人jvid在线播放 | 亚洲成人免费视频在线 | 夜夜夜操 | 亚洲成人网在线播放 | 欧美一区二区三区精品 | 91成人免费电影 | 久久精品一区 | 国产精品污污视频 |