日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
開(kāi)發(fā)JSPHTTP服務(wù)器

通過(guò)各款JSP HTTP服務(wù)器的對(duì)比,定位本JSP HTTP服務(wù)器的應(yīng)用方向

成都創(chuàng)新互聯(lián)是專(zhuān)業(yè)的開(kāi)福網(wǎng)站建設(shè)公司,開(kāi)福接單;提供網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行開(kāi)福網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

對(duì)于企業(yè)選擇或者設(shè)計(jì)HTTP服務(wù)器,需要考慮很多因素,主要的因素有:穩(wěn)定性,安全性,執(zhí)行效率,易用性,可擴(kuò)展性等。筆者對(duì)當(dāng)前業(yè)界中較為流行的HTTP服務(wù)器按照常用指標(biāo)進(jìn)行了分析和對(duì)比,如表1。

HTTP 服務(wù)器 支持服務(wù)頁(yè) 運(yùn)行平臺(tái) 安全性 執(zhí)行效率 易用性
MS IIS ASP MS Windows 一般 一般 容易
MS IIS ISAPI MS Windows 一般 容易
Apache CGI

MS Windows

UNIX,Linux

一般 一般
Tomcat JSP

MS Windows

UNIX,Linux

不易

通過(guò)表1我們可以知道,MS IIS只能運(yùn)行在MS Windows平臺(tái)下,且由于IIS的體系設(shè)計(jì)很大程度上依賴(lài)于Windows系統(tǒng),由于MS Windows系統(tǒng)存在一定的漏洞,從而導(dǎo)致IIS體系的安全性能也比較低。但是IIS安裝使用比較簡(jiǎn)單,適用于對(duì)安全性和擴(kuò)展性要求不高的 Windows用戶(hù)。

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

另外需要考慮的因素是JSP HTTP服務(wù)器的執(zhí)行效率。在表1中,ASP和CGI都采用即時(shí)調(diào)用模式,即當(dāng)客戶(hù)端請(qǐng)求該資源時(shí),服務(wù)器端會(huì)即時(shí)解釋并執(zhí)行該模塊,執(zhí)行完畢之后即時(shí)釋放該模塊,每次獲取請(qǐng)求時(shí)都必須解釋和執(zhí)行該模塊,這樣過(guò)多地與磁盤(pán)系統(tǒng)進(jìn)行交互,會(huì)造成系統(tǒng)的執(zhí)行效率的降低。

對(duì)于ISAPI而言,其執(zhí)行模塊是作為動(dòng)態(tài)鏈接庫(kù)(DLL)模塊的形態(tài)進(jìn)行調(diào)用,初次調(diào)用完畢后該模塊將存在于內(nèi)存中。后續(xù)再收到客戶(hù)端請(qǐng)求時(shí)直接從內(nèi)存中調(diào)用執(zhí)行該模塊,從而效率較高。但這種情形可能帶來(lái)代碼更新的問(wèn)題。當(dāng)修改本地代碼時(shí),必須從內(nèi)存中清空該動(dòng)態(tài)鏈接庫(kù)模塊,即需要先關(guān)閉服務(wù)器后才能更新本地代碼,否則服務(wù)器內(nèi)存中執(zhí)行的還是舊的代碼模塊。

而對(duì)于Tomcat系統(tǒng)而言,這樣的問(wèn)題都得到了避免。Tomcat將初次執(zhí)行的Java類(lèi)模塊載入到內(nèi)存,后續(xù)調(diào)用時(shí),直接從內(nèi)存中調(diào)用執(zhí)行模塊,減少了與磁盤(pán)系統(tǒng)的交互。同時(shí)通過(guò)自動(dòng)判斷本地代碼是否受到修改而更新載入內(nèi)存中舊的類(lèi)模塊。從而不僅執(zhí)行效率較高,且修改本地代碼也比較方便。

基于上述的研究分析,筆者擬采用擴(kuò)展性和安全性良好的Java體系來(lái)實(shí)現(xiàn)一款支持JSP服務(wù)頁(yè)的HTTP服務(wù)器,其功能實(shí)現(xiàn)基本覆蓋Tomcat,并在其基礎(chǔ)上增強(qiáng)對(duì)CGI的支持和易用性的提高。

一、設(shè)計(jì)過(guò)程
1.搭建HTTP服務(wù)器框架

1.1 設(shè)計(jì)思路

通過(guò)建立TCP套接字(端口為80)向客戶(hù)端提供HTTP服務(wù)。分析客戶(hù)端請(qǐng)求(GET,POST請(qǐng)求等),建立請(qǐng)求資源與本地資源的映射關(guān)系,實(shí)現(xiàn)請(qǐng)求應(yīng)答。

1.2 設(shè)計(jì)要點(diǎn)

(1)客戶(hù)端請(qǐng)求的多線(xiàn)程支持。
(2)客戶(hù)端請(qǐng)求的分析。
(3)請(qǐng)求資源與本地資源映射以及本地資源的應(yīng)答。
(4)對(duì)CGI以及JSP類(lèi)似請(qǐng)求的接受分析與處理返回。
(5)擴(kuò)展服務(wù)以及特殊指令。

1.3 實(shí)施前準(zhǔn)備

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

1.4 設(shè)計(jì)實(shí)施

(1)創(chuàng)建服務(wù)套接字

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

(2)接受客戶(hù)端請(qǐng)求并創(chuàng)建請(qǐng)求處理線(xiàn)程

 
 
 
  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. }  

以上代碼中,創(chuàng)建了多線(xiàn)程構(gòu)架的客戶(hù)端請(qǐng)求處理體系??梢约皶r(shí)處理多客戶(hù)端連接。

(3)分析請(qǐng)求

客戶(hù)端處理線(xiàn)程從客戶(hù)端套接字中讀取相應(yīng)的請(qǐng)求內(nèi)容,并對(duì)請(qǐng)求進(jìn)行分析。

 
 
 
  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. }  

通過(guò)請(qǐng)求內(nèi)容的***行就可以知道請(qǐng)求方式是GET還是POST。如果是GET請(qǐng)求(例如很多CGI都是GET請(qǐng)求),就可以直接從請(qǐng)求字符串中獲取請(qǐng)求的資源內(nèi)容。GET請(qǐng)求的格式為:GET HTTP/1.X。其中URL為請(qǐng)求的資源內(nèi)容,而1.X是用于指明客戶(hù)端所支持的HTTP的版本,當(dāng)前有1.0和1.1兩個(gè)標(biāo)準(zhǔn)。

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

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

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

當(dāng)請(qǐng)求內(nèi)容的末尾字符為“/”時(shí),即請(qǐng)求為目錄而不是具體文件時(shí),還存在默認(rèn)請(qǐng)求的問(wèn)題,一般目錄的默認(rèn)請(qǐng)求為該目錄下的index.htm,index.html,index.jsp等文件。

特別是的,出于安全性和習(xí)慣考慮,對(duì)CGI目錄也進(jìn)行了映射(一般映射為/cgi-bin/),所以如果請(qǐng)求中包含CGI映射時(shí)還必須替換為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. }  

當(dāng)前題目:開(kāi)發(fā)JSPHTTP服務(wù)器
當(dāng)前路徑:http://m.5511xx.com/article/cosegee.html