天天看點

【C/C++學院】(27)項目實戰HttpServer--原理分析1.BS/CS結構異同2.http server連接配接資料庫設計要點3.HTTP請求應答步驟4.HTTP協定的結構5.HTML簡介6.阻塞Socket多線程并發程式設計7.項目心得

    bs就是服務端+浏覽器結構的網絡程式,對于廠家來講,隻需要提供server,都是通過http協定完成的。

優點:不需要維護用戶端軟體,使用者在使用的時候無需安裝任何第三方軟體,隻需要有浏覽器就可以。不管是任何作業系統(windows,linux,ios)

缺點:浏覽器的功能有限,不能做過于複雜的界面,以及如果有些功能是需要在用戶端完成的,浏覽器可能實作不了。

    cs就是服務端+用戶端軟體結構的網絡程式。對廠家來講,需要同時提供server和client軟體。

優點:用戶端功能可以根據實際的需求任何擴充,可以實作浏覽器做不到的功能。界面也可以很漂亮。

缺點:客戶需要安裝client軟體,而且廠家還得需要支援和更新維護用戶端軟體,如果想實作支援多個作業系統,那麼就需要提供多版本的用戶端軟體。是以維護用戶端的工作量會很大。

從商業角度考慮,bs要想捆綁使用者,一般手段是設定浏覽器預設首頁。cs來講,想盡一切辦法讓使用者安裝你的軟體,安裝以後自動執行。

【C/C++學院】(27)項目實戰HttpServer--原理分析1.BS/CS結構異同2.http server連接配接資料庫設計要點3.HTTP請求應答步驟4.HTTP協定的結構5.HTML簡介6.阻塞Socket多線程并發程式設計7.項目心得
【C/C++學院】(27)項目實戰HttpServer--原理分析1.BS/CS結構異同2.http server連接配接資料庫設計要點3.HTTP請求應答步驟4.HTTP協定的結構5.HTML簡介6.阻塞Socket多線程并發程式設計7.項目心得

對db來講,最大的消耗不是執行select語句,最大的消耗是連接配接和斷開連接配接。

【C/C++學院】(27)項目實戰HttpServer--原理分析1.BS/CS結構異同2.http server連接配接資料庫設計要點3.HTTP請求應答步驟4.HTTP協定的結構5.HTML簡介6.阻塞Socket多線程并發程式設計7.項目心得
【C/C++學院】(27)項目實戰HttpServer--原理分析1.BS/CS結構異同2.http server連接配接資料庫設計要點3.HTTP請求應答步驟4.HTTP協定的結構5.HTML簡介6.阻塞Socket多線程并發程式設計7.項目心得

http是基于tcp協定的短連接配接。

第一步、client通過tcp協定連接配接到server端

第二步、client給server發送請求request(client一個連接配接隻給server發一次request請求)

第三步、server給client回複reponse。

第四步、雙方斷開連接配接

(client如果想再次給server發送request那麼就必須再次連接配接到server)

對于http請求最簡單一個模型

1、用戶端發送http請求中get後面一般跟一個檔案名

2、服務端會把用戶端get的檔案下發下去

360浏覽器

get / http/1.1

accept: text/html, application/xhtml+xml, */*

accept-language: zh-cn

user-agent: mozilla/5.0 (windows nt 6.1; trident/7.0; rv:11.0) like gecko

accept-encoding: gzip, deflate

host: 192.168.27.254:8080

connection: keep-alive

ie發送的内容

消息頭(字元串)

http/1.0 200 ok

content-type: image/x-icon(辨別給用戶端回複的消息體是什麼類型的檔案,消息體是衣服圖像檔案,圖像是icon格式的)

transfer-encoding: chunked

accept-ranges:bytes

content-length:2550(消息體的長度,機關:位元組)

\n回車換行

消息體(二進制)

具體要給用戶端發送的檔案二進制流

消息尾(字元串)

\n

例如:在浏覽器當中輸入http://serverid/

在浏覽器當中輸入http://serverid/abc.txt

get /abc.txt http/1.1

在http的get請求中s?wd=傳智,s代表html當中form的action屬性的值

wd代表input name屬性的值,等号後面就是input的value屬性的值。

在http協定當中,如果傳輸的是漢字,那麼轉義,将漢字的原始編碼轉化為位元組,在每個位元組前面加%,後面是16進制表示的字元串,比如“傳智“轉化完後,%e4%bc%a0%e6%99%ba,對于英文字母,不轉義。如果遇到%本身,會把%轉義為%25(25代表%的ascii碼)

如果浏覽器收到的消息體是一個html格式的文本檔案,那麼浏覽器就會顯示這個html檔案。

如果浏覽器收到的消息體是一個圖像檔案,那麼浏覽器就會顯示這幅圖像。

如果浏覽器收到的是一個二進制的流檔案,浏覽器會下載下傳這個檔案。

html是一個用特殊格式編寫的文本檔案,html主要的目的是描述一個網頁的樣子,而不是通常意義上的程式設計語言。

<>标簽,對于html标簽是成對使用的</>

<html></html>html檔案整體标簽

<title>是标頭

<img>圖像

<body>html體标簽

<a>超連結标簽,其中href屬性代表這個超連結指向的域名或ip位址

<a href="http://www.123.com">去123這個網站</a>

<p>分段,屬性align代表分段在螢幕中的位置

<form>标簽,可以實作一些控件

<input>代表一個控件,type="text",代表是一個lineedit,type="submit"代表是一個按鈕,value相當于qt當中控件的text屬性。

<head>

<meta http-equiv="content-type" content="text/html;charset=utf8">

</head>代表表示這張網頁的字元集

因為htpp都是基于短連接配接的,是以不可能出現服務端同時存在大量client連接配接的情況發生,是以采用多線程,并不會導緻一個程序當中同時存在大量的線程情況發生,阻塞的socket多線程還可以增加每一個用戶端連接配接響應的速度。

對于多線程并發,即使其中某一個連接配接消耗了大量的時間,也不會影響其他的連接配接。

對于epoll模型來講,最大的開銷不是epoll_wait,而是epool_ctl。那麼在htpp這種短連接配接的背景下,epoll适合做有大量的客戶會連接配接到server,都長連,不會經常斷開或者連接配接,還有對于每一個連接配接又不會做大量的資料傳輸。

如果采用阻塞的多線程并發設計,當主線程不關心具體子線程的退出狀态,那麼所有的線程可以使用可分離狀态。讓這些線程自生自滅。

【C/C++學院】(27)項目實戰HttpServer--原理分析1.BS/CS結構異同2.http server連接配接資料庫設計要點3.HTTP請求應答步驟4.HTTP協定的結構5.HTML簡介6.阻塞Socket多線程并發程式設計7.項目心得

    在建立線程的時候,不能把一個函數的棧位址當做建立線程入口函數的參數傳遞。

    寫服務端程式,要盡量利用server資源,以加快程式的處理效率,包括cpu資源,記憶體資源。

    如果是一個函數内部要給參數配置設定空間,那麼這個參數必須是2級指針。

對于http server來講,基本原則就是快速的處理來自用戶端的連接配接,隻要給客戶下發了reponse,立刻斷開連接配接。

注意的地方:

    對于http,預設的端口是80端口,但是linux普通使用者是沒有權限在80端口bind的,隻有root才有權限bind 80端口。并且注意防火牆的設定。

上一篇: 安裝Citrix