C 實現乙個最簡單的HTTP伺服器

2021-06-23 08:39:05 字數 3543 閱讀 4646

本文用c#實現了乙個最簡單的http伺服器類,你可以將它嵌入到自己的專案中,或者也可以閱讀**來學習關於http協議的知識。

高效能的web應用一般都架設在強大的web伺服器上,例如iis, apache, 和tomcat。然而,html是非常靈活的ui標記語言,也就是說任何應用和後端服務都可以提供html的生成支援。在這個小小的例子中,像iis,、apache這樣的伺服器消耗的資源太大了,我們需要自己實現乙個簡單的http伺服器,將它嵌入到我們的應用中用來處理web請求。我們僅需要乙個類就可以實現了,很簡單。

首先我們來回顧一下如何使用類,然後我們再來分析實現的具體細節。這裡我們建立了乙個繼承於httpserver的類,並實現了handlegetrequesthandlepostrequest這兩個抽象方法:

}}當開始處理乙個簡單的請求時,我們就需要單獨啟動乙個執行緒來監聽乙個埠,比如8080埠:

thread.start();如果你編譯執行這個專案,你會在瀏覽器http://localhost:8080位址下看到頁面上生成的示例內容。讓我們來簡單看一下這個http伺服器引擎是怎麼實現的。

這個web伺服器由兩個元件構成,乙個是負責啟動tcplistener來監聽指定埠的httpserver類,並且用accepttcpclient()方法迴圈處理tcp連線請求,這是處理tcp連線的第一步。然後請求到達「已指定「的埠,接著就會建立一對新的埠,用來初始化客戶端到伺服器端的tcp連線。這對埠便是tcpclient的session,這樣就可以保持我們的主埠可以繼續接收新的連線請求。從下面的**中我們可以看到,每一次監聽程式都會建立乙個新的tcpclien,httpserver類又會建立乙個新的httpprocessor,然後啟動乙個執行緒來操作。httpserver類中還包含兩個抽象方法,你必須實現這兩個方法。

}這樣,乙個新的tcp連線就在自己的執行緒中被httpprocessor處理了,httpprocessor的工作就是正確解析http頭,並且控制正確實現的抽象方法。下面我們來看看http頭的處理過程,http請求的第一行**如下:

get /myurl http/1.0
在設定完process()的輸入和輸出後,httpprocessor就會呼叫parserequest()方法。

}http請求由3部分組成,所以我們只需要用string.split()方法將它們分割成3部分即可,接下來就是接收和解析來自客戶端的http頭資訊,頭資訊中的每一行資料是以key-value(鍵-值)形式儲存,空行表示http頭資訊結束標誌,我們**中用readheaders方法來讀取http頭資訊:

}}到這裡,我們已經了解了如何處理簡單的get和post請求,它們分別被分配給正確的handler處理程式。在本例中,傳送資料的時候有乙個棘手的問題需要處理,那就是請求頭資訊中包含傳送資料的長度資訊content-length,當我們希望子類httpserver中的handlepostrequest方法能夠正確處理資料時,我們需要將資料長度content-length資訊一起放入資料流中,否則傳送端會因為等待永遠不可能到達的資料和阻塞等待。我們用了一種看起來不那麼優雅但非常有效的方法來處理這種情況,即將資料傳送給post處理方法前先把資料讀入到memorystream中。這種做法不太理想,原因如下:如果傳送的資料很大,甚至是上傳乙個檔案,那麼我們將這些資料快取在記憶體就不那麼合適甚至是不可能的。理想的方法是限制post的長度,比如我們可以將資料長度限制為10mb。

這個簡易版http伺服器另乙個簡化的地方就是content-type的返回值,在http協議中,伺服器總是會將資料的mime-type傳送給客戶端,告訴客戶端自己需要接收什麼型別的資料。在writesuccess()方法中,我們看到,伺服器總是傳送text/html型別,如果你需要加入其他的型別,你可以擴充套件這個方法。

原文:

HTTP協議 實現乙個最簡單的HTTP伺服器

1.http協議 超文字傳輸協議 是乙個應用層的協議。2.認識url 平時我們所說的 就是url urlencode和urldecode 像 等這樣的字元,已經被url當作特殊意義理解了。因此這些字元不能隨便出現。比如,某個引數中需要帶有這寫特殊字元,就必須先對特殊字元進行轉義。轉移的規則如下 將需...

C 實現乙個最簡單的HTTP伺服器

本文用c 實現了乙個最簡單的http伺服器類,你可以將它嵌入到自己的專案中,或者也可以閱讀 來學習關於http協議的知識。背景高效能的web應用一般都架設在強大的web伺服器上,例如iis,apache,和tomcat。然而,html是非常靈活的ui標記語言,也就是說任何應用和後端服務都可以提供ht...

實現乙個簡單的HTTP

實現簡單http伺服器,在頁面顯示 hello world socket套接字程式設計中服務端 改編 include include include include include include include void usage intmain int argc,char ar int fd ...