web服务器的简单实现——HTTP权威指南读书心得(七)
? ? 我又回來做筆記了~最近懶死了,書雖然看完了,但是一直懶得動筆,這樣不行啊(ˉ﹃ˉ)口水。還有在這里吐槽下,在圍觀這本書的時候,一直有一種奇怪的感覺:里面說的有些東西與時代脫節(jié)啊......越讀越感覺不對勁,最后終于在一個月黑風(fēng)高的夜晚,我發(fā)現(xiàn)了一個驚人的秘密,那就是....這本書的英文版是在2002年出版的啊....怪不得...所以說里面的有些東西應(yīng)該說已經(jīng)過時。這個故事告訴我們一個深刻的道理:一定要好好學(xué)英語!
? ? 廢話不多說,來看看今天的主要內(nèi)容:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??WEB服務(wù)器
?? ?web服務(wù)器是我們每天瀏覽的這些網(wǎng)頁的基礎(chǔ),它接收用戶的請求,處理,最后向客戶發(fā)回響應(yīng),常見的web服務(wù)器有IIS,apache,Nginx等等,這里說明下apache與tomcat的區(qū)別:Apache是web服務(wù)器,Tomcat是應(yīng)用(java)服務(wù)器,它只是一個servlet容器,是Apache的擴展。 Apache和Tomcat都可以做為獨立的web服務(wù)器來運行,但是Apache不能解釋java程序(jsp,serverlet)。兩者都是一種容器,只不過發(fā)布的東西不同:Apache是html容器,功能像IIS一樣;Tomcat是jsp/servlet容器,用于發(fā)布jsp及java的,類似的有IBM的websphere、BEA的Weblogic,sun的JRun等等。
? ? web服務(wù)器進行服務(wù)時候的主要步驟:
? ? ?當(dāng)客戶端與服務(wù)器建立連接成功以后,客戶端會向服務(wù)器發(fā)出其請求報文,這個請求報文中包含著以特定格式記錄的請求信息,如請求行,請求首部,以及請求實體。當(dāng)服務(wù)器接收完請求報文之后,按照約定格式對請求進行解析,了解客戶端需要的東西。服務(wù)器有很多種類:單線程,多線程多進程,復(fù)用結(jié)構(gòu),服用多線程結(jié)構(gòu)。多線程多進程服務(wù)器為每一個連接都提供了一個線程或者進程,對其進行監(jiān)控處理。復(fù)用結(jié)構(gòu)服務(wù)器會監(jiān)視所有的連接,但是只有連接狀態(tài)發(fā)生變化時才會對連接進行處理,連接空閑或者等待的時候并不會綁定線程或者進程。復(fù)用多線程服務(wù)器將他們兩個的特點結(jié)合到一起,更高效的利用資源。
? ? 通常客戶端會請求一些資源,如圖片等,當(dāng)服務(wù)器解析完客戶端的請求之后,便會尋找客戶端請求的資源,尋找資源的方法有很多種,可以使用docroot對路徑補全,以尋找目標(biāo)文件在服務(wù)器上的真實路徑并訪問,當(dāng)然也有一臺服務(wù)器上有很多站點的情況,這時便可以使用虛擬主機對docroot進行配置,也可以使用CGI訪問動態(tài)的服務(wù)器資源。
? ? 獲得想要訪問的資源或者被拒絕之后,根據(jù)結(jié)果構(gòu)建響應(yīng)報文,最后將構(gòu)建好的響應(yīng)報文回送給客戶端。
? ? 下面是一個用JAVA實現(xiàn)的簡單web服務(wù)器demo:
? ?
1 import java.io.DataInputStream; 2 import java.io.PrintStream; 3 import java.net.ServerSocket; 4 import java.net.Socket; 5 public class WebServer { 6 7 /** 8 * @param args 9 */ 10 public static void main(String[] args) { 11 // TODO Auto-generated method stub 12 //i對線程標(biāo)記,port為監(jiān)聽的機器端口號 13 int i=1,port=80; 14 ServerSocket serverSocket=null; 15 Socket socket=null; 16 try { 17 //新建一個服務(wù)器監(jiān)聽對象 18 serverSocket=new ServerSocket(port); 19 System.out.println("listening!!"); 20 //連續(xù)監(jiān)聽客戶端請求 21 while (true) { 22 socket=serverSocket.accept();//這里會等待客戶端的請求 23 new ConnectionThread(socket, i).start();//一旦接受到客戶端請求,便開啟請求事務(wù)處理線程對請求進行異步處理 24 i++; 25 } 26 } catch (Exception e) { 27 // TODO: handle exception 28 } 29 } 30 } 31 //事務(wù)處理線程 32 class ConnectionThread extends Thread{ 33 Socket socket=null; 34 int count; 35 public ConnectionThread(Socket s,int i) { 36 // TODO Auto-generated constructor stub 37 socket=s; 38 count=i; 39 } 40 public void run() { 41 try { 42 String ip=socket.getInetAddress().toString();//獲取ip 43 int destport=socket.getPort();//獲取端口 44 System.out.println("Client:"+ip+":"+destport); 45 PrintStream outStream=new PrintStream(socket.getOutputStream());//獲取輸出流 46 DataInputStream inStream=new DataInputStream(socket.getInputStream());//獲取輸入流 47 StringBuilder inString=new StringBuilder(); 48 String temp; 49 //打印接收到的請求 50 while (!(temp=inStream.readLine()).equals("")) { 51 inString.append(temp+"\n"); 52 } 53 System.out.println("Request:\n"+inString.toString()); 54 //向客戶端返回特定的響應(yīng)首部 55 outStream.println("HTTP/1.0 200 OK"); 56 outStream.println("Content-Type:text/html"); 57 outStream.println("Content-Length:"+"This is a test!!".length()); 58 outStream.println(""); 59 outStream.println("This is a test!!"); 60 outStream.flush(); 61 } catch (Exception e) { 62 // TODO: handle exception 63 } 64 } 65 }訪問localhost的請求報文:
demo的響應(yīng)報文:
頁面效果就是顯示一句話:
可以看到,響應(yīng)報文的傳輸方法就是按一定格式通過流進行傳送。
這章沒什么好說的,就到這里咯~
轉(zhuǎn)載于:https://www.cnblogs.com/littlewish/archive/2013/01/29/2882173.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的web服务器的简单实现——HTTP权威指南读书心得(七)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java开发笔记(一百零三)线程间的通信
- 下一篇: SESSION 回收机制