標籤:
1.BS/CS結構異同
BS就是服務端+瀏覽器結構的網路程式,對於廠家來講,只需要提供server,都是通過http協議完成的。
優點:不需要維護用戶端軟體,使用者在使用的時候無需安裝任何第三方軟體,只需要有瀏覽器就可以。不管是任何作業系統(windows,linux,ios)
缺點:瀏覽器的功能有限,不能做過於複雜的介面,以及如果有些功能是需要在用戶端完成的,瀏覽器可能實現不了。
CS就是服務端+用戶端軟體結構的網路程式。對廠家來講,需要同時提供server和client軟體。
優點:用戶端功能可以根據實際的需求任何擴充,可以實現瀏覽器做不到的功能。介面也可以很漂亮。
缺點:客戶需要安裝client軟體,而且廠家還得需要支援和升級維護用戶端軟體,如果想實現支援多個作業系統,那麼就需要提供多版本的用戶端軟體。所以維護用戶端的工作量會很大。
從商業角度考慮,BS要想捆綁使用者,一般手段是設定瀏覽器預設首頁。CS來講,想盡一切辦法讓使用者安裝你的軟體,安裝以後自動執行。
2.http server串連資料庫設計要點
對DB來講,最大的消耗不是執行select語句,最大的消耗是串連和中斷連線。
3.HTTP請求應答步驟
HTTP是基於TCP協議的短串連。
第一步、client通過tcp協議串連到server端
第二步、client給server發送請求request(client一個串連只給server發一次request請求)
第三步、server給client回複reponse。
第四步、雙方中斷連線
(client如果想再次給server發送request那麼就必須再次串連到server)
對於http請求最簡單一個模型
1、用戶端發送http請求中GET後面一般跟一個檔案名稱
2、服務端會把用戶端get的檔案下發下去
4.HTTP協議的結構
HTTP請求(字串)
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發送的內容
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
HTTP 回複訊息頭(字串)
HTTP/1.0 200 OK
Content-Type: image/x-icon(標識給用戶端回複的訊息體是什麼類型的檔案,訊息體是衣服影像檔,映像是icon格式的)
Transfer-Encoding: chunked
Connection: Keep-Alive
Accept-Ranges:bytes
Content-Length:2550(訊息體的長度,單位:位元組)
\n斷行符號換行
訊息體(二進位)
具體要給用戶端發送的檔案二進位流
訊息尾(字串)
\n
\n
例如:在瀏覽器當中輸入http://serverid/
GET / HTTP/1.1
在瀏覽器當中輸入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碼)
5.HTML簡介
如果瀏覽器收到的訊息體是一個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>代表表示這張網頁的字元集
6.阻塞Socket多線程並發程式設計
因為HTPP都是基於短串連的,所以不可能出現服務端同時存在大量client串連的情況發生,所以採用多線程,並不會導致一個進程當中同時存在大量的線程情況發生,阻塞的socket多線程還可以增加每一個用戶端串連響應的速度。
對於多線程並發,即使其中某一個串連消耗了大量的時間,也不會影響其他的串連。
對於epoll模型來講,最大的開銷不是epoll_wait,而是epool_ctl。那麼在HTPP這種短串連的背景下,epoll適合做有大量的客戶會串連到server,都長連,不會經常斷開或者串連,還有對於每一個串連又不會做大量的資料轉送。
如果採用阻塞的多線程並發設計,當主線程不關心具體子線程的退出狀態,那麼所有的線程可以使用可分離狀態。讓這些線程自生自滅。
7.項目心得
在建立線程的時候,不能把一個函數的棧地址當做建立線程入口函數的參數傳遞。
寫服務端程式,要盡量利用server資源,以加快程式的處理效率,包括CPU資源,記憶體資源。
如果是一個函數內部要給參數分配空間,那麼這個參數必須是2級指標。
對於HTTP Server來講,基本原則就是快速的處理來自用戶端的串連,只要給客戶下發了reponse,立刻中斷連線。
注意的地方:
對於http,預設的連接埠是80連接埠,但是linux普通使用者是沒有許可權在80連接埠bind的,只有root才有許可權bind 80連接埠。並且注意防火牆的設定。
【C/C++學院】(27)項目實戰HttpServer--原理分析