中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何開發JSP HTTP服務器

發布時間:2021-07-14 15:02:44 來源:億速云 閱讀:152 作者:chen 欄目:編程語言

本篇內容主要講解“如何開發JSP HTTP服務器”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何開發JSP HTTP服務器”吧!

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

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

HTTP服務器

支持服務頁運行平臺安全性執行效率易用性
MS IISASPMS Windows一般一般容易
MS IISISAPIMS Windows一般容易
ApacheCGI

MS Windows

UNIX,Linux

一般一般
TomcatJSP

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)接受客戶端請求并創建請求處理線程

while(true)  {  //Accept the client connections   Socket clnt = serv.accept();  //Create thread for each client   HTTPThread HTTPThd = new HTTPThread(clnt, props, ht);  HTTPThd.start();  }

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

(3)分析請求

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

//Create client socket input stream reader   m_sin = new BufferedReader(new InputStreamReader(_s.getInputStream() ) );  ……  //Get the first line of output from client socket   request = m_sin.readLine().trim();  if(request != null)  {  //The method is GET   if(request.startsWith(METHOD_GET) == true)  {  parseGetRequest(request);  }  //The method is POST   else if(request.startsWith(METHOD_POST) == true)  {  params = m_sin.readLine();  //Skip the middle lines of POST request   while( (params != null) && (params.equals("") == false) )  {  params = m_sin.readLine();  }  //The last line contains those parameters   params = m_sin.readLine();  paramsparams = params.trim();  parsePostRequest(request, params);  }  //Close client socket input stream and client socket itself   m_sin.close();  m_s.close();  }

通過請求內容的***行就可以知道請求方式是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程序所在目錄。

//If the request start with /cgi-bin,  //then need replace /cgi-bin with true CGI directory   if(fname.startsWith(PATH_SEPARATOR + CGI_BIN_DIR) == true)  {  fnamefname = fname.replaceFirst(PATH_SEPARATOR + CGI_BIN_DIR, cgiBinDir);  }  else //else, file name need append to server documents directory   {  fname = serverPageDir + fname;  }  //If request is for directory,  //then need respond default page in the directory   if(fname.endsWith(PATH_SEPARATOR) == true)  {  fnamefname = fname + defaultPage;  }

到此,相信大家對“如何開發JSP HTTP服務器”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

霍城县| 南昌县| 郸城县| 洛阳市| 榆中县| 黑龙江省| 慈利县| 龙里县| 高青县| 桓仁| 三江| 乐亭县| 云梦县| 保靖县| 顺昌县| 会宁县| 汨罗市| 仁怀市| 搜索| 池州市| 突泉县| 台东县| 通河县| 大冶市| 织金县| 宝兴县| 麻江县| 衡东县| 老河口市| 柳州市| 奉化市| 乐亭县| 天全县| 松滋市| 忻州市| 富蕴县| 大新县| 衡水市| 濮阳县| 南木林县| 浏阳市|