最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Python編寫一個簡單的http服務(wù)器

 更新時間:2023年04月25日 08:42:23   作者:真的不能告訴你我的名字  
這篇文章主要為大家詳細介紹了如何基于Python編寫一個簡單的http服務(wù)器,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學習一下

本篇文章的python版本為:

什么是http

http是一個應(yīng)用層協(xié)議,準確的來說是基于TCP/IP4層網(wǎng)絡(luò)協(xié)議中的傳輸層中的TCP應(yīng)用層協(xié)議。

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

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

http就在最上層,就是應(yīng)用層那里。

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

很難理解吧,沒關(guān)系,繼續(xù)往下看。

分析http請求報文和響應(yīng)報文格式

通過上面的簡介,我們知道http是應(yīng)用層協(xié)議,它在網(wǎng)絡(luò)協(xié)議中,是被稱之為報文的,讓我們來看一下http的請求報文 和 響應(yīng)報文吧。

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

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

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

命令:

curl -v http://juejin.cn

請求信息:

其中輸出的結(jié)果中> 代表我們發(fā)出的報文,而< 代表服務(wù)器發(fā)送給我們的響應(yīng)信息。下面我們將結(jié)合報文來看上面的數(shù)據(jù)信息。

請求報文格式如下:

其中請求行會指定http的請求方法,如: GET、POST、HEAD等, URL則是請求的文件路徑,協(xié)議版本需要指定http的版本,最后是以CRLF結(jié)束。

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

而后是空行??招袆t代表http報文頭結(jié)束了,接下來該是發(fā)送的報文主體了,接下來,我們將上述請求http://juejin.cn的例子,填入表格來看下:

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

響應(yīng)報文格式如下:

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

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

上述是我們使用curl請求http://juejin.cn/,服務(wù)器返回的信息,我們逐行來看下,響應(yīng)行,告知了我們http版本是HTTP/1.1,狀態(tài)碼是301,短語是 鏈接被轉(zhuǎn)移了。

上述我們?nèi)魞H通過狀態(tài)碼的話,是很難get到整個報文的意思的,不過有短語,就可以猜一下了。

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

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

手寫一個簡單的http服務(wù)器

上述,我們介紹了,什么是http以及初略的看了一下 http的請求報文和響應(yīng)報文,那么,我們?nèi)绾螛?gòu)建一個http服務(wù)器呢?

我們知道,http是應(yīng)用層協(xié)議,是基于傳輸層tcp來實現(xiàn)的,所以,我們?nèi)粝霕?gòu)建一個http服務(wù)器,那么應(yīng)該寫一個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程序,它將監(jiān)聽本地回環(huán)地址的8080端口,若此時我們使用curl -v 127.0.0.1:8080請求一下該接口,我們將會得到請求報文了,如下:

我們得到請求報文后,可以構(gòu)建一個響應(yīng)報文發(fā)送回去,例如: Hello, Destined Person.,我們就可以這樣來構(gòu)建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."
    #響應(yīng)報文
    #響應(yīng)行
    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再來測試一下,是可以得到消息的。

總結(jié)

該篇文章,我們僅介紹了什么是http,http的請求報文以及響應(yīng)報文,最后我們使用python,創(chuàng)建了一個tcp服務(wù)器來發(fā)送響應(yīng)客戶的響應(yīng)報文??傮w而言,http的報文還是非常簡單的。我們只是寫了一個非常簡單的http服務(wù)器,其實在python中,web是有一個標準的,它稱之為WSGI,哎,扯遠了。

到此這篇關(guān)于基于Python編寫一個簡單的http服務(wù)器的文章就介紹到這了,更多相關(guān)Python http服務(wù)器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在Python的Django框架的視圖中使用Session的方法

    在Python的Django框架的視圖中使用Session的方法

    這篇文章主要介紹了在Python的Django框架的視圖中使用Session的方法,包括相關(guān)的設(shè)置測試Cookies的方法,需要的朋友可以參考下
    2015-07-07
  • Python OpenCV 圖像矯正的原理實現(xiàn)

    Python OpenCV 圖像矯正的原理實現(xiàn)

    這篇文章主要介紹了Python OpenCV 圖像矯正的原理實現(xiàn),檢測邊緣點;以邊緣點作為輸入,采用Hough直線檢測,檢測出最多點共線的四條直線,更多相關(guān)內(nèi)容需要的朋友可以參考一下
    2022-07-07
  • 基于python+pandoc實現(xiàn)html批量轉(zhuǎn)word

    基于python+pandoc實現(xiàn)html批量轉(zhuǎn)word

    pandoc是一個強大的文檔格式轉(zhuǎn)換工具,支持豐富的格式轉(zhuǎn)換,并盡可能的保留原來的排版,號稱文檔格式轉(zhuǎn)換的瑞士軍刀,本文將給大家介紹一下使用python搭配pandoc實現(xiàn)html批量轉(zhuǎn)word,感興趣的朋友可以參考閱讀下
    2023-09-09
  • pytorch fine-tune 預(yù)訓練的模型操作

    pytorch fine-tune 預(yù)訓練的模型操作

    這篇文章主要介紹了pytorch fine-tune 預(yù)訓練的模型操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Jmeter并發(fā)執(zhí)行Python 腳本的完整流程

    Jmeter并發(fā)執(zhí)行Python 腳本的完整流程

    這篇文章主要介紹了Jmeter并發(fā)執(zhí)行 Python 腳本的問題詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • python 進制轉(zhuǎn)換 int、bin、oct、hex的原理

    python 進制轉(zhuǎn)換 int、bin、oct、hex的原理

    這篇文章主要介紹了python 進制轉(zhuǎn)換 int、bin、oct、hex的原理,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Python實現(xiàn)byte轉(zhuǎn)integer

    Python實現(xiàn)byte轉(zhuǎn)integer

    這篇文章主要介紹了Python實現(xiàn)byte轉(zhuǎn)integer操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • PyCharm中如何直接使用Anaconda已安裝的庫

    PyCharm中如何直接使用Anaconda已安裝的庫

    這篇文章主要介紹了PyCharm中如何直接使用Anaconda已安裝的庫,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • Flask實現(xiàn)swagger在線文檔與接口測試流程詳解

    Flask實現(xiàn)swagger在線文檔與接口測試流程詳解

    Flask是一個使用Python編寫的輕量級Web應(yīng)用框架。其WSGI工具箱采用 Werkzeug,模板引擎則使用Jinja2。Flask使用 BSD 授權(quán)。Flask也被稱為“microframework”,因為它使用簡單的核心,用 extension 增加其他功能,本篇帶你用Flask實現(xiàn)swagger在線文檔與接口測試
    2022-07-07
  • python交易記錄整合交易類詳解

    python交易記錄整合交易類詳解

    這篇文章主要介紹了python交易記錄整合交易類詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07

最新評論

黄浦区| 腾冲县| 太保市| 甘肃省| 望城县| 益阳市| 四会市| 南乐县| 新乡县| 永修县| 桑植县| 米脂县| 贵定县| 湾仔区| 萨迦县| 鄂州市| 佳木斯市| 安陆市| 东平县| 安顺市| 铜鼓县| 绥棱县| 翼城县| 甘孜| 惠安县| 合水县| 英山县| 临洮县| 滁州市| 河间市| 通化市| 荣成市| 新龙县| 拜城县| 调兵山市| 广平县| 阿瓦提县| 赤城县| 论坛| 文化| 梧州市|