日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

回想一下一個http請求的過程,你在瀏覽器輸入xxx.com,經過域名解析 --> 發起tcp的3次握手 --> 建立tcp連接后發起http請求 --> 服務器響應http請求,瀏覽器得到html代碼 --> 瀏覽器解析html代碼,并請求html代碼中的資源(如js、css、圖片等) --> 瀏覽器對頁面進行渲染呈現給用戶。

 

簡單web服務器的實現思路

 

 

每一個web服務器程序都需要從網絡接受http請求,然后提供http回復給請求者。http回復一般包含一個html文件,有時也可以包含純文本文件、圖像或其他類型的文件。

畫外音:web服務器就是一個處理http請求的應用程序。

實現大致步驟:

  • 初始化服務端ServerSocket
  • 初始化TreadPool
  • while(true)等待客戶端連接
  • <<服務器啟動完成>>
  • 客戶端請求
  • clientHandler處理客戶端的請求
  • 線程池的線程處理handler
  • 根據輸入流解析請求(解析請求行,解析消息頭,解析消息正文)
  • 根據輸出流創建響應對象(發送狀態行信息,發送響應頭信息,發送響應正文信息)
  • <<靜態html處理結束>>
  • 尋找servlet 根據請求路徑找到需要哪個servlet處理(選擇handler)
  • 通過反射機制加載這個類
  • 實例化servlet
  • servlet處理請求(執行handler結束)
  • <<跳轉html處理結束>>

一個應用程序是不是先要啟動起來?main函數當然要有,init方法當然有,我們先不管高性能之類的東西,多路復用Reactor之類的,但是總的有處理并發能力吧,線程池大小默認處理器的核心數,多的也處理不過來!服務器通信歸根結底都是socket通信,包括redis服務器都是底層都是socket通信。我們怎么知道http請求來了,先長輪詢。

  •  
private ServerSocket server;
private ExecutorService threadPool;
public WebServer() {
 try {
 System.out.println("init server begin");
 server = new ServerSocket(8080);
 int poolSize = Runtime.getRuntime().availableProcessors();
 threadPool = newFixedThreadPool(poolSize - 1);
 System.out.println("init server end");
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
public void start() {
 try {
 while (true) {
 //TODO
 }
 } catch (Exception e) {
 e.printStackTrace();
 }
}
public static void main(String[] args) {
 WebServer server = new WebServer();
 server.start();
}

http請求來了,怎么處理?當然需要有定義handler去處理。

  •  
 Socket socket = server.accept();
 ClientHandler handler = new ClientHandler(socket);
 threadPool.execute(handler);

handler處理客戶端請求并完成響應:

  •  
private class ClientHandler implements Runnable {
 private Socket socket;
 public ClientHandler(Socket socket) {
 this.socket = socket;
 }
 public void run() {
 try {
 //根據輸入流解析請求
 HttpRequest request= new HttpRequest(socket.getInputStream());
 //先判斷用戶請求的是否為后端請求
 if (ServerContext.servletMApping.containsKey(
 request.getRequestLine())
 ) {
 //通過反射機制加載這個類
 //實例化這個Servlet
 } else {
 //查看請求的該頁面是否存在,存在直接跳轉
 } else {
 //設置狀態代碼404等,跳轉404頁面
 }
 }
 } catch (Exception e) {
 e.printStackTrace();
 } finally {
 socket.close(); 
 }
 }

處理過來的請求當然要根據輸入流解析請求,根據輸出流創建響應對象。需要判斷是不是后端請求,如果不是后端請求,需要找到對應的文件,設置響應頭,設置響應體,返回給瀏覽器,找不到則返回404。如果是后端請求需要經過servlet,我們肯定需要通過請求路徑找到對應的配置文件,我們配置可以放在xml里面,也可以放到map里面,通過反射機制加載某個類,然后實例化某個servlet,處理完設置請求頭,設置請求體返回給客戶端。

知識點:IPO模型。

一個簡單的web服務器的思路已經基本有了,但是為什么springboot應用不用你單獨啟動服務器?springboot默認使用的是 Tomcat 作為內嵌的服務器。所以,我們搭建一個工程將會變得非常的簡單。springboot應用會自動啟動一個嵌入的Tomcat服務器實例,至于怎么做到自動的,你問過自己為什么嗎?

分享到:
標簽:服務器 web
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定