http專案筆記(多執行緒版 微型http伺服器)

2021-07-30 21:36:07 字數 3446 閱讀 7868

原始碼:

http :超文字傳輸協議:是乙個基於請求與響應模式的,無狀態的,應用層的協議

了解http協議

: http協議詳解(真的很經典) 

協議特點;

1.支援c/s模式

2.簡單快速:客戶端向伺服器請求服務時,只需傳送請求方法和路徑。http協議簡單,使得http伺服器的程式規模小,因而通訊速度快

3. 靈活:http允許傳輸任意資料型別的物件,正在傳輸的型別由content-type加以標記

4. 無連線:僅作用在應用層,底層使用的是tcp;每次連線只處理乙個請求,伺服器處理完客戶的請求,並收到客戶的應答後,就斷開連線:請求->響應->斷開

5. 無狀態:http協議是無狀態協議,無狀態是指協議對事物的處理沒有記憶能力,即:缺少狀態意味著如果後續處理需要前面的資訊,則它必須重傳,這樣導致每次連線傳送的資料量增大,反之,在伺服器不需要先前資訊時他的應答就比較快

url:統一資源定位符:網際網路上的每個檔案都有乙個唯一的url :  

詳解url的組成

例如:http://host[":"port][abs_path][?引數]

http: 表示通過http協議來定位網路資源

host;表示合法的internet主機網域名稱或者ip位址

prot:指定服務的埠號,為空則使用預設埠80

abs_path:指定資源的uri(統一資源識別符號)。

引數(可選):引數的存在決定了所訪問的html網頁是動態還是靜態或者偽靜態

靜態、動態、偽靜態的url結構到底哪種更利於seo

url:一般由傳輸協議,網域名稱,埠號,加具體的資源路徑組成

若沒有具體的資源路徑,則在其尾部自動新增 \ 如:

瀏覽器會自動新增 \

/在我看來這個\ 就是目標主機的根目錄,根目錄後面跟的具體路徑名就是資源的具體路徑

從網域名稱後的第乙個「/」開始到最後乙個「/」為止,是虛擬目錄部分。虛擬目錄也不是乙個url必須的部分。

http之響應和

http之請求:

http訊息由客戶端到伺服器的請求和伺服器到客戶端的響應組成。請求訊息和響應訊息都是由開始行(對於請求訊息,開始行就是請求行,對於響應訊息,開始行就是狀態行),訊息報頭(可選),空行(只有crlf的行),訊息正文(可選)組成。

空行堅決不能少

注:此處的http伺服器基於1.0版本的http協議,所以只有get和post方法

post和get方法區別: 

http 的get和post區別

請求引數的位置不同:get的引數在url上,而post的引數在請求報文主體

傳輸資料長度限制:特定瀏覽器和伺服器對url的長度有限制,因此對於get提交時,傳輸資料就會受到url長度的限制。  post:由於不是通過url傳值,理論上資料不受限。但實際各個web伺服器會規定對post提交資料大小進行限制,apache、iis6都有各自的配置

安全性:post要比get高,但也是在某一情況下的相對而言

post和get使用選擇:

http中的get,post,put,delete就對應著對這個資源的查,改,增,刪4個操作。到這裡,大家應該有個大概的了解了,get一般用於獲取/查詢資源資訊,而post一般用於更新資源資訊。

http標準包含這兩種方法是為了達到不同的目的。post用於建立和更新資源,資源的內容會被編入http請示的內容中。例如,處理訂貨表單、在資料庫中加入新資料行等。     

當請求無***時(如進行搜尋),便可使用get方法;當請求有***時(如在資料庫新增資料行),則用post方法。乙個比較實際的問題是:get方法可能會產生很長的url,或許會超過某些瀏覽器與伺服器對url長度的限制。

cgi(通用閘道器介面):

解釋:cgi是外部應用程式(cgi程式)與web伺服器之間的介面標準,是在cgi程式和web伺服器之間傳遞資訊的過程。cgi規範允許web伺服器執行外部程式,並將它們的輸出傳送給web瀏覽器,cgi將web的一組簡單的靜態超**文件變成乙個完整的新的互動式**。

對乙個 cgi 程式,做的工作其實只有:從環境變數(environment variables)和標準輸入(standard input)中讀取資料、處理資料、向標準輸出(standard output)輸出資料。

環境變數中儲存的叫 request meta-variables,也就是諸如 query_string、path_info 之類的東西,這些是由 web server 通過環境變數傳遞給 cgi 程式的,cgi 程式也是從環境變數中讀取的。

標準輸入中存放的往往是使用者通過 puts 或者 post 提交的資料,這些資料也是由 web server 傳過來的。

只要是提供html的伺服器端程式都可以叫cgi,aps、php、jsp這些都是,你用c語言寫乙個可以提供html的伺服器端exe檔案,也叫cgi,換句話說:cgi支援任何語言的編寫    

簡而言之:cgi就是伺服器的子程序執行web瀏覽器需要的功能

注:    cgi規定只能以標準輸入輸出作為資料的匯入匯出

長連線,短連線:

長連線: client方與server方先建立通訊連線,連線建立後不斷開, 然後再進行報文傳送和接收。

短連線: client方與server每進行一次報文收發交易時才進行通訊連線,交易完畢後立即斷開連線。此種方式常用於一點對多點

通訊,比如多個client連線乙個server.

即:請求->響應->斷開

資料粘包:

----對於基於tcp開發的通訊程式,有個很重要的問題需要解決,就是封包和拆包.

tcp粘包是指傳送方傳送的n個資料報,不考慮丟失的情況,在接收方看來只接收了小於n個包的資料報

(*注:無法區分是因為資料在網路上傳輸的方式是以二進位制進行傳輸)

粘包出現的原因:

傳送端等緩衝區滿的時候傳送資料,造成粘包

接收端不能及時接收緩衝區的包,造成一次性多個包的接收

解決粘包的方法:

一 是對於傳送方引起的粘包現象,使用者可通過程式設計設定來避免,tcp提供了強制資料立即傳送的操作指令 push,tcp軟體收到該操作指令後,就立即將本段資料傳送出去,而不必等待傳送緩衝區滿;

二 是對於接收方引起的粘包,則可通過優化程式設計、精簡接收 程序工作量、提高接收程序優先順序等措施,使其及時接收資料,從而盡量避免出現粘包現象;

三是由接收方控制,將一包資料按結構字段,人為控制分多次接收,然 後合併,通過這種手段來避免粘包。

以上提到的三種措施,都有其不足之處。第一種程式設計設定方法雖然可以避免傳送方引起的粘包,但它關閉了優化演算法,降低了網路傳送效率,影響應用程式的 效能,一般不建議使用。第二種方法只能減少出現粘包的可能性,但並不能完全避免粘包,當傳送頻率較高時,或由於網路突發可能使某個時間段資料報到達接收方 較快,接收方還是有可能來不及接收,從而導致粘包。第三種方法雖然避免了粘包,但應用程式的效率較低,對實時應用的場合不適合.

微型Http伺服器Tiny Http Server

乙個簡單的跨平台http伺服器 伺服器部分使用了mongoose的 介面是使用 開發的 開發為了在臨時需要使用乙個http伺服器來做發布 文件的時候,不用去安裝apache等大塊頭 又因為網上的一些迷你型的webserver又多是只支援windowns的 所以乾脆自己做乙個 本來向自己寫乙個http...

Qt4 http多執行緒程式

qt4的多執行緒使用方法比較特殊,也使得編寫多執行緒程式變的很簡單,由於專案中要用到多執行緒的http進行通訊,故此研究了一些方案,最終確定如下的方式實現多執行緒的http程式 下面put出乙個test功能的版本 希望可以幫助到大家 1 http模組,該部分實現http網路通訊的功能 超時 2 多執...

python多執行緒http壓力測試指令碼

filename 測試指令碼日誌.log filemode w deflog uncaught exceptions exception type,exception,tb logging.critical join traceback.format tb tb logging.critical f...