web服务器的简单实现——HTTP权威指南读书心得(七)
? ? 我又回來做筆記了~最近懶死了,書雖然看完了,但是一直懶得動筆,這樣不行啊(ˉ﹃ˉ)口水。還有在這里吐槽下,在圍觀這本書的時候,一直有一種奇怪的感覺:里面說的有些東西與時代脫節啊......越讀越感覺不對勁,最后終于在一個月黑風高的夜晚,我發現了一個驚人的秘密,那就是....這本書的英文版是在2002年出版的啊....怪不得...所以說里面的有些東西應該說已經過時。這個故事告訴我們一個深刻的道理:一定要好好學英語!
? ? 廢話不多說,來看看今天的主要內容:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??WEB服務器
?? ?web服務器是我們每天瀏覽的這些網頁的基礎,它接收用戶的請求,處理,最后向客戶發回響應,常見的web服務器有IIS,apache,Nginx等等,這里說明下apache與tomcat的區別:Apache是web服務器,Tomcat是應用(java)服務器,它只是一個servlet容器,是Apache的擴展。 Apache和Tomcat都可以做為獨立的web服務器來運行,但是Apache不能解釋java程序(jsp,serverlet)。兩者都是一種容器,只不過發布的東西不同:Apache是html容器,功能像IIS一樣;Tomcat是jsp/servlet容器,用于發布jsp及java的,類似的有IBM的websphere、BEA的Weblogic,sun的JRun等等。
? ? web服務器進行服務時候的主要步驟:
? ? ?當客戶端與服務器建立連接成功以后,客戶端會向服務器發出其請求報文,這個請求報文中包含著以特定格式記錄的請求信息,如請求行,請求首部,以及請求實體。當服務器接收完請求報文之后,按照約定格式對請求進行解析,了解客戶端需要的東西。服務器有很多種類:單線程,多線程多進程,復用結構,服用多線程結構。多線程多進程服務器為每一個連接都提供了一個線程或者進程,對其進行監控處理。復用結構服務器會監視所有的連接,但是只有連接狀態發生變化時才會對連接進行處理,連接空閑或者等待的時候并不會綁定線程或者進程。復用多線程服務器將他們兩個的特點結合到一起,更高效的利用資源。
? ? 通??蛻舳藭埱笠恍┵Y源,如圖片等,當服務器解析完客戶端的請求之后,便會尋找客戶端請求的資源,尋找資源的方法有很多種,可以使用docroot對路徑補全,以尋找目標文件在服務器上的真實路徑并訪問,當然也有一臺服務器上有很多站點的情況,這時便可以使用虛擬主機對docroot進行配置,也可以使用CGI訪問動態的服務器資源。
? ? 獲得想要訪問的資源或者被拒絕之后,根據結果構建響應報文,最后將構建好的響應報文回送給客戶端。
? ? 下面是一個用JAVA實現的簡單web服務器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對線程標記,port為監聽的機器端口號 13 int i=1,port=80; 14 ServerSocket serverSocket=null; 15 Socket socket=null; 16 try { 17 //新建一個服務器監聽對象 18 serverSocket=new ServerSocket(port); 19 System.out.println("listening!!"); 20 //連續監聽客戶端請求 21 while (true) { 22 socket=serverSocket.accept();//這里會等待客戶端的請求 23 new ConnectionThread(socket, i).start();//一旦接受到客戶端請求,便開啟請求事務處理線程對請求進行異步處理 24 i++; 25 } 26 } catch (Exception e) { 27 // TODO: handle exception 28 } 29 } 30 } 31 //事務處理線程 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 //向客戶端返回特定的響應首部 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的響應報文:
頁面效果就是顯示一句話:
可以看到,響應報文的傳輸方法就是按一定格式通過流進行傳送。
這章沒什么好說的,就到這里咯~
轉載于:https://www.cnblogs.com/littlewish/archive/2013/01/29/2882173.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的web服务器的简单实现——HTTP权威指南读书心得(七)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java开发笔记(一百零三)线程间的通信
- 下一篇: SESSION 回收机制