小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

用Python實現(xiàn)簡單的HTTP服務(wù)器(1)--使用Firebug簡單分析HTTP協(xié)議

 JasonQue 2012-03-16

HTTP協(xié)議是超文本傳輸協(xié)議, 每天瀏覽網(wǎng)頁, 看新聞都在接觸HTTP, 可以在地址欄看到最前面大多是http.

HTTP協(xié)議, 實質(zhì)上就是使用了網(wǎng)絡(luò)編程, 使用TCP/IP連接, 來傳輸文本和圖片等數(shù)據(jù), 再通過瀏覽器進行解析和顯示的.

(圖來自參考1)

上述的圖片就可以幫我們理解http協(xié)議的過程, 上述的結(jié)構(gòu)是一個典型的BS模型.

首先, 瀏覽器發(fā)送http請求, 服務(wù)器接收請求后進行處理, 之后返回一個http響應(yīng). 瀏覽器接收到響應(yīng)之后, 會對響應(yīng)進行處理, 其中的html會被解析和渲染成為我們平時看到的網(wǎng)頁.

分析http協(xié)議

分析http協(xié)議有很多方法, 我這里使用火狐插件Firebug. 這個插件被廣泛地用于網(wǎng)頁調(diào)試, 功能強大, 使用簡便, 網(wǎng)頁開發(fā)利器之一.

Firebug的安裝

方法有兩種: (前提是你先安裝了火狐)

1.在火狐左上角的菜單中單擊附加組件, 在右上角的搜索框中輸入firebug, 回車即可搜索到.

2.也可以在Firefox中打開http:///這個網(wǎng)頁, 上面有個Install Firebug的按鈕.

HTTP headers

我們先打開firebug, 在地址欄中輸入百度的主頁(注意: 必須先打開firebug, 否則firebug捕獲不到數(shù)據(jù)).

你會看到一個firebug面板, 選擇其中的網(wǎng)絡(luò)面板(初次安裝, 可能需要先啟用), 如下圖.

我們可以看到, 這里的百度主頁有多個請求, 第一個是主頁html代碼的請求, 剩下的都是在html解析中發(fā)出的新請求, 比如說加載js, 加載圖片等. 你可以在這個面板中試試, 操作還是很簡單的.

點開第一項: GET www.baidu.com. 我們可以看到頭信息, 響應(yīng), 緩存, HTML等選項.

對應(yīng)最開始的那個圖, 這里面包含了我們在前面說過的, HTTP headers頭信息, 包含了請求頭信息和響應(yīng)頭信息.

使用Firebug工具, 獲得這些頭信息, 我們就可以大概理解HTTP協(xié)議的工作流程了.

獲取百度頁面, 首先是發(fā)送請求, 這個請求是瀏覽器幫我們發(fā)出的, 我們只負責(zé)了一個網(wǎng)址的輸入. 瀏覽器自動發(fā)送一個請求頭信息(有刪減).

GET / HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Cache-Control: max-age=0

第一行:GET / HTTP/1.1 分為三個部分, GET是說明使用的HTTP方法, 常用的HTTP方法有GET和POST, 表示拿取一個資源
后面是/, 這個表示拿取根目錄的資源, 默認是index.html或default.html等, 根據(jù)各服務(wù)器的配置不同而不同, 反正就是要拿到默認的頁面.
HTTP/1.1表示了HTTP的版本, 一般是固定不變的.
后面的都是Key-Value的形式, Host表明了請求的主機域名或ip, 通過host和第一行的信息, 就可以知道地址欄中請求的資源, 這個例子請求的是http://www.baidu.com/主頁. 
如果是http://www.baidu.com/logo.png(注:示例鏈接不可用), 那么這個頭信息肯定會包含這樣的內(nèi)容. 
GET /logo.png HTTP/1.1
Host: www.baidu.com

在這個例子中, 整個響應(yīng)如下:

HTTP/1.1 200 OK
Date: Sat, 31 Dec 2011 08:23:40 GMT
Server: BWS/1.0
Content-Length: 3350
Content-Type: text/html;charset=gb2312
Cache-Control: private
Expires: Sat, 31 Dec 2011 08:23:40 GMT
Content-Encoding: gzip
Connection: Keep-Alive

<!doctype html><html><head><meta http-equiv="Content-Type" content="text/html;charset=gb2312"><title>百度一下,你就知道
(省略...)
</html> <script type="text/javascript" src="http://www.baidu.com/cache/hps/js/hps-1.4.js"></script> <!--ade6dd8ede8ff3ea-->
最前面的就是響應(yīng)頭信息, 后面空一行, 跟著就是html代碼, 經(jīng)過渲染后就是我們看到的網(wǎng)頁. 
響應(yīng)頭信息主要說下第一行: HTTP/1.1 200 OK , 也是三個部分, 第一個和之前一樣, 是個HTTP版本信息, 后面200叫做狀態(tài)碼, 根據(jù)這個可以知道相應(yīng)的狀態(tài)(具體看參考2), 主要是以下幾個大類: 
1xx:信息,請求收到,繼續(xù)處理
2xx:成功,行為被成功地接受、理解和采納
3xx:重定向,為了完成請求,必須進一步執(zhí)行的動作
4xx:客戶端錯誤,請求包含語法錯誤或者請求無法實現(xiàn)
5xx:服務(wù)器錯誤,服務(wù)器不能實現(xiàn)一種明顯無效的請求

一個最簡單的HTTP服務(wù)器
一個HelloWorld的http服務(wù)器作為第一個服務(wù)器, 這個服務(wù)器不處理請求頭信息, 只是返回一個固定的內(nèi)容, 可以在頁面顯示HelloWorld.
# -.- coding:utf-8 -.-
'''
Created on 2011-11-19
 
@author: icejoywoo
'''
import socket
import datetime
# 初始化socket
s = socket.socket()
# 獲取主機名, 也可以使用localhost
#host = socket.gethostname()
host = "localhost"
# 默認的http協(xié)議端口號
port = 80
 
# 綁定服務(wù)器socket的ip和端口號
s.bind((host, port))
 
# 服務(wù)器名字/版本號
server_name = "MyServerDemo/0.1"
 
# 緩存時間, 緩存一天
expires = datetime.timedelta(days=1)
# GMT時間格式
GMT_FORMAT = '%a, %d %b %Y %H:%M:%S GMT'
# 相應(yīng)網(wǎng)頁的內(nèi)容
content = '''
<html>
<head><title>MyServerDemo/0.1</title></head>
<body>
<h1>Hello, World!</h1>
</body>
</html>
'''
 
# 可同時連接五個客戶端
s.listen(5)
 
# 提示信息
print "You can see a HelloWorld from this server in ur browser, type in", host, "\r\n"
 
# 服務(wù)器循環(huán)
while True:
    # 等待客戶端連接
    c, addr = s.accept()
    print "Got connection from", addr, "\r\n"
     
    # 顯示請求信息
    print "--Request Header:"
    # 接收瀏覽器的請求, 不作處理
    data = c.recv(1024)
    print data
     
    # 獲得請求的時間
    now = datetime.datetime.utcnow()
 
    # 相應(yīng)頭文件和內(nèi)容
    response = '''HTTP/1.1 200 OK
Server: %s
Date: %s
Expires: %s
Content-Type: text/html;charset=utf8
Content-Length: %s
Connection: keep-alive
 
%s''' % (
server_name,
now.strftime(GMT_FORMAT),
(now + expires).strftime(GMT_FORMAT),
len(content),
content
)
    # 發(fā)送回應(yīng)
    c.send(response)
    print "--Response:\r\n", response
    c.close()

 

用Python實現(xiàn)簡單的HTTP服務(wù)器(1)--使用Firebug簡單分析HTTP協(xié)議

2011-12-31 16:37 by 會被淹死的魚, 47 visits, 收藏, 編輯

HTTP協(xié)議是超文本傳輸協(xié)議, 每天瀏覽網(wǎng)頁, 看新聞都在接觸HTTP, 可以在地址欄看到最前面大多是http.

HTTP協(xié)議, 實質(zhì)上就是使用了網(wǎng)絡(luò)編程, 使用TCP/IP連接, 來傳輸文本和圖片等數(shù)據(jù), 再通過瀏覽器進行解析和顯示的.

(圖來自參考1)

上述的圖片就可以幫我們理解http協(xié)議的過程, 上述的結(jié)構(gòu)是一個典型的BS模型.

首先, 瀏覽器發(fā)送http請求, 服務(wù)器接收請求后進行處理, 之后返回一個http響應(yīng). 瀏覽器接收到響應(yīng)之后, 會對響應(yīng)進行處理, 其中的html會被解析和渲染成為我們平時看到的網(wǎng)頁.

分析http協(xié)議

分析http協(xié)議有很多方法, 我這里使用火狐插件Firebug. 這個插件被廣泛地用于網(wǎng)頁調(diào)試, 功能強大, 使用簡便, 網(wǎng)頁開發(fā)利器之一.

Firebug的安裝

方法有兩種: (前提是你先安裝了火狐)

1.在火狐左上角的菜單中單擊附加組件, 在右上角的搜索框中輸入firebug, 回車即可搜索到.

2.也可以在Firefox中打開http:///這個網(wǎng)頁, 上面有個Install Firebug的按鈕.

HTTP headers

我們先打開firebug, 在地址欄中輸入百度的主頁(注意: 必須先打開firebug, 否則firebug捕獲不到數(shù)據(jù)).

你會看到一個firebug面板, 選擇其中的網(wǎng)絡(luò)面板(初次安裝, 可能需要先啟用), 如下圖.

我們可以看到, 這里的百度主頁有多個請求, 第一個是主頁html代碼的請求, 剩下的都是在html解析中發(fā)出的新請求, 比如說加載js, 加載圖片等. 你可以在這個面板中試試, 操作還是很簡單的.

點開第一項: GET www.baidu.com. 我們可以看到頭信息, 響應(yīng), 緩存, HTML等選項.

對應(yīng)最開始的那個圖, 這里面包含了我們在前面說過的, HTTP headers頭信息, 包含了請求頭信息和響應(yīng)頭信息.

使用Firebug工具, 獲得這些頭信息, 我們就可以大概理解HTTP協(xié)議的工作流程了.

獲取百度頁面, 首先是發(fā)送請求, 這個請求是瀏覽器幫我們發(fā)出的, 我們只負責(zé)了一個網(wǎng)址的輸入. 瀏覽器自動發(fā)送一個請求頭信息(有刪減).

GET / HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Cache-Control: max-age=0

第一行:GET / HTTP/1.1 分為三個部分, GET是說明使用的HTTP方法, 常用的HTTP方法有GET和POST, 表示拿取一個資源
后面是/, 這個表示拿取根目錄的資源, 默認是index.html或default.html等, 根據(jù)各服務(wù)器的配置不同而不同, 反正就是要拿到默認的頁面.
HTTP/1.1表示了HTTP的版本, 一般是固定不變的.
后面的都是Key-Value的形式, Host表明了請求的主機域名或ip, 通過host和第一行的信息, 就可以知道地址欄中請求的資源, 這個例子請求的是http://www.baidu.com/主頁. 
如果是http://www.baidu.com/logo.png(注:示例鏈接不可用), 那么這個頭信息肯定會包含這樣的內(nèi)容. 
GET /logo.png HTTP/1.1
Host: www.baidu.com

在這個例子中, 整個響應(yīng)如下:

HTTP/1.1 200 OK
Date: Sat, 31 Dec 2011 08:23:40 GMT
Server: BWS/1.0
Content-Length: 3350
Content-Type: text/html;charset=gb2312
Cache-Control: private
Expires: Sat, 31 Dec 2011 08:23:40 GMT
Content-Encoding: gzip
Connection: Keep-Alive

<!doctype html><html><head><meta http-equiv="Content-Type" content="text/html;charset=gb2312"><title>百度一下,你就知道
(省略...)
</html> <script type="text/javascript" src="http://www.baidu.com/cache/hps/js/hps-1.4.js"></script> <!--ade6dd8ede8ff3ea-->
最前面的就是響應(yīng)頭信息, 后面空一行, 跟著就是html代碼, 經(jīng)過渲染后就是我們看到的網(wǎng)頁. 
響應(yīng)頭信息主要說下第一行: HTTP/1.1 200 OK , 也是三個部分, 第一個和之前一樣, 是個HTTP版本信息, 后面200叫做狀態(tài)碼, 根據(jù)這個可以知道相應(yīng)的狀態(tài)(具體看參考2), 主要是以下幾個大類: 
1xx:信息,請求收到,繼續(xù)處理
2xx:成功,行為被成功地接受、理解和采納
3xx:重定向,為了完成請求,必須進一步執(zhí)行的動作
4xx:客戶端錯誤,請求包含語法錯誤或者請求無法實現(xiàn)
5xx:服務(wù)器錯誤,服務(wù)器不能實現(xiàn)一種明顯無效的請求

一個最簡單的HTTP服務(wù)器
一個HelloWorld的http服務(wù)器作為第一個服務(wù)器, 這個服務(wù)器不處理請求頭信息, 只是返回一個固定的內(nèi)容, 可以在頁面顯示HelloWorld.
# -.- coding:utf-8 -.-
'''
Created on 2011-11-19
 
@author: icejoywoo
'''
import socket
import datetime
# 初始化socket
s = socket.socket()
# 獲取主機名, 也可以使用localhost
#host = socket.gethostname()
host = "localhost"
# 默認的http協(xié)議端口號
port = 80
 
# 綁定服務(wù)器socket的ip和端口號
s.bind((host, port))
 
# 服務(wù)器名字/版本號
server_name = "MyServerDemo/0.1"
 
# 緩存時間, 緩存一天
expires = datetime.timedelta(days=1)
# GMT時間格式
GMT_FORMAT = '%a, %d %b %Y %H:%M:%S GMT'
# 相應(yīng)網(wǎng)頁的內(nèi)容
content = '''
<html>
<head><title>MyServerDemo/0.1</title></head>
<body>
<h1>Hello, World!</h1>
</body>
</html>
'''
 
# 可同時連接五個客戶端
s.listen(5)
 
# 提示信息
print "You can see a HelloWorld from this server in ur browser, type in", host, "\r\n"
 
# 服務(wù)器循環(huán)
while True:
    # 等待客戶端連接
    c, addr = s.accept()
    print "Got connection from", addr, "\r\n"
     
    # 顯示請求信息
    print "--Request Header:"
    # 接收瀏覽器的請求, 不作處理
    data = c.recv(1024)
    print data
     
    # 獲得請求的時間
    now = datetime.datetime.utcnow()
 
    # 相應(yīng)頭文件和內(nèi)容
    response = '''HTTP/1.1 200 OK
Server: %s
Date: %s
Expires: %s
Content-Type: text/html;charset=utf8
Content-Length: %s
Connection: keep-alive
 
%s''' % (
server_name,
now.strftime(GMT_FORMAT),
(now + expires).strftime(GMT_FORMAT),
len(content),
content
)
    # 發(fā)送回應(yīng)
    c.send(response)
    print "--Response:\r\n", response
    c.close()

 

參考:

1. HTTP Headers for Dummies: http://net./tutorials/other/http-headers-for-dummies/

2.Status Code Definitions: http://www./Protocols/rfc2616/rfc2616-sec10.html

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多