91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

基于Python怎么編寫一個簡單的http服務器

發布時間:2023-04-25 10:09:35 來源:億速云 閱讀:117 作者:iii 欄目:開發技術

本篇內容介紹了“基于Python怎么編寫一個簡單的http服務器”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

什么是http

http是一個應用層協議,準確的來說是基于TCP/IP4層網絡協議中的傳輸層中的TCP應用層協議。

額,4層模型大概是這樣的:

基于Python怎么編寫一個簡單的http服務器

在網絡通信中,用戶的數據是以報文來傳輸的,但是在實際通信中,每一層都會對包進行封裝,從而形成段、數數據報、幀,最后是以比特流(二進制)進行傳輸,到了目標主機后,會對每一層又進行拆解,從而得到最后的報文。

http就在最上層,就是應用層那里。

http到底離我們多近呢? 甚至于你現在看到的文章,使用的就是http協議,它還有一個名字,叫做超文本傳輸協議,為什么叫超文本呢? 因為最開始的是時候,http是被用來傳輸Hypertext文檔的,所以被叫做超文本協議,當然現在可以傳輸其他類型的數據,如: 視頻、音頻、圖片等,但是它依然被稱之為超文本協議。

很難理解吧,沒關系,繼續往下看。

分析http請求報文和響應報文格式

通過上面的簡介,我們知道http是應用層協議,它在網絡協議中,是被稱之為報文的,讓我們來看一下http的請求報文 和 響應報文吧。

http報文由4部分組成,分別是起始行、首部行、空白行 以及 實體組成。以\r\n(也稱之為CRLF)進行分割。

讓我們來看一下實際的報文呢。

linux中,我們可以使用curl -v 網址來打印詳細的請求信息,其中就包括了報文。

命令:

curl -v http://juejin.cn

請求信息:

基于Python怎么編寫一個簡單的http服務器

其中輸出的結果中> 代表我們發出的報文,而< 代表服務器發送給我們的響應信息。下面我們將結合報文來看上面的數據信息。

請求報文格式如下:

基于Python怎么編寫一個簡單的http服務器

其中請求行會指定http的請求方法,如: GETPOSTHEAD等, URL則是請求的文件路徑,協議版本需要指定http的版本,最后是以CRLF結束。

首部行可以有多個,以 (字段名: 值) 的方式出現,每一個首部行同樣是以CRLF結束。

而后是空行。空行則代表http報文頭結束了,接下來該是發送的報文主體了,接下來,我們將上述請求http://juejin.cn的例子,填入表格來看下:

基于Python怎么編寫一個簡單的http服務器

上述是我們使用curl工具請求的http://juejin.cn請求報文整體形式,我們可以看到,我們使用了GET方法,獲取服務器的/信息,使用的協議是HTTP/1.1,而后攜帶了3個首部行,分別是User-AgentHost以及Accept

響應報文格式如下:

基于Python怎么編寫一個簡單的http服務器

將響應報文和請求報文進行對比,我們不難發現,除了第一行以外,其他的格式都是一樣的,所以,我們僅介紹響應行的信息,在響應報行中,第一個是協議的版本,這個是服務器的協議版本,而后便是狀態碼,用于告知客戶端,服務器響應的信息,最后是短語,短語的作用是告知使用者,這個返回信息大概是什么意思。

好了,我們將上述juejin.cn響應給我們的報文,我們填到表格中呢:

基于Python怎么編寫一個簡單的http服務器

上述是我們使用curl請求http://juejin.cn/,服務器返回的信息,我們逐行來看下,響應行,告知了我們http版本是HTTP/1.1,狀態碼是301,短語是 鏈接被轉移了。

上述我們若僅通過狀態碼的話,是很難get到整個報文的意思的,不過有短語,就可以猜一下了。

首部行,告知了我們服務器 、時間 、 報文類型 以及 報文長度。還記得我們第一段落介紹過得,http現在除了發送超文本以外,還可以發送圖片、視頻等,就是通過首部行Content-Type來確定的。

接著是空白行,最后是報文主體,哎,有沒有感覺奇怪呢?為什么請求報文主體是空的呢?這是因為報文主體長度是由首部行Content-Length來定義的,如上報文展示的是,我們報文主體有262個字符。

手寫一個簡單的http服務器

上述,我們介紹了,什么是http以及初略的看了一下 http的請求報文和響應報文,那么,我們如何構建一個http服務器呢?

我們知道,http是應用層協議,是基于傳輸層tcp來實現的,所以,我們若想構建一個http服務器,那么應該寫一個socket程序出來吧。

import socket
import threading

def handle(client , addr):
    print("from " , addr)
    data = client.recv(1024)
    for k,v in enumerate(data.decode().split("\r\n")):
        print(k ,v)

def main():
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.bind(("127.0.0.1",8080))
    s.listen()
    
    while True:
        client , addr = s.accept() 
        t = threading.Thread(target=handle,args=(client,addr))
        t.start()

if __name__ == '__main__'
    main()

上述,我們寫了一個tcp程序,它將監聽本地回環地址的8080端口,若此時我們使用curl -v 127.0.0.1:8080請求一下該接口,我們將會得到請求報文了,如下:

基于Python怎么編寫一個簡單的http服務器

我們得到請求報文后,可以構建一個響應報文發送回去,例如: Hello, Destined Person.,我們就可以這樣來構建http 請求報文信息:

import socket
import threading

def handle(client , addr):
    print("from " , addr)
    data = client.recv(1024)
    
    #請求報文
    for k,v in enumerate(data. decode() .split("\r\n")):
        print(k ,v)
        
    bodyText = "He1lo,Destined Person."
    #響應報文
    #響應行
    client.send(b"HTTP/1.1 200 OK\r\n")
    #首部行
    client. send(b"Server: pdudo_web_sites\r\n") 
    client. send(b"Content-Type: text/html\r\n")
    client. send(("Content-Length: %s\r\n" % (len(bodyText) + 2)).encode())
    client. send(b"\r\n")
    client. send(("%s\r\n" %(bodyText)).encode())
    
def main():
    try:
        s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        s .bind(("127.0.0.1"8080))
        s .listen()
        
        while True:
            client,addr = s.accept()
            t = threading.Thread(target=handle,args=(client,addr))
            t.start()
    finally:
        s.close()

if __name__ == '__main__':
    main()

最后我們使用curl再來測試一下,是可以得到消息的。

基于Python怎么編寫一個簡單的http服務器

“基于Python怎么編寫一個簡單的http服務器”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

红原县| 兰州市| 茌平县| 临清市| 灵川县| 长垣县| 乐陵市| 七台河市| 灵武市| 水富县| 夏津县| 万荣县| 巍山| 红安县| 嘉峪关市| 嘉善县| 乐安县| 商洛市| 馆陶县| 娄底市| 黎平县| 犍为县| 丽江市| 民勤县| 略阳县| 定日县| 灵丘县| 皋兰县| 措勤县| 甘洛县| 阿勒泰市| 瓮安县| 郧西县| 胶南市| 晋州市| 黔西县| 濮阳市| 吐鲁番市| 肇庆市| 法库县| 蓝田县|