欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python通過(guò)Socket手動(dòng)實(shí)現(xiàn)HTTP協(xié)議

 更新時(shí)間:2024年03月24日 15:16:36   作者:shengjk1  
這篇文章主要為大家詳細(xì)介紹了Python如何通過(guò)Socket手動(dòng)實(shí)現(xiàn)HTTP協(xié)議,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一

一、前言

上一篇中,我們?cè)敿?xì) HTTP 協(xié)議的基本原理到請(qǐng)求與響應(yīng)的詳細(xì)結(jié)構(gòu),并且提供了豐富的信息和實(shí)用的例子。為了更進(jìn)一步了解 HTTP 協(xié)議,于是有了這篇文章

二、 定義 socket server

本文我們通過(guò) Socket,寫一個(gè) HTTP 協(xié)議,直觀的感受一下上篇文章中的請(qǐng)求和響應(yīng)。 通過(guò)上篇文章,我們知道 HTTP 協(xié)議底層是通過(guò) Socket 實(shí)現(xiàn)的,所以我們先通過(guò) socket 定義一個(gè) server

import socket

#初始化 socke
sock=socket.socket()
#綁定 地址
sock.bind(('127.0.0.1',8081))

#在 sock.listen(5) 中,參數(shù) 5 表示最多可以排隊(duì)等待處理的連接數(shù)量為 5。
# 如果有更多的連接請(qǐng)求到達(dá),超過(guò)該數(shù)量的連接將被拒絕。
sock.listen(5)
while True:
    #接受客戶端請(qǐng)求
    conn,addr=sock.accept()
    data=conn.recv(1024)
    print('客戶端的請(qǐng)求數(shù)據(jù)\r\n',data.decode('utf-8'))
    print("打印完畢=====")
    #響應(yīng)客戶端的請(qǐng)求
    conn.send(b'Hello world')
    conn.close()

在 PyCharm 中執(zhí)行這段代碼后,通過(guò)瀏覽器訪問(wèn) http://127.0.0.1:8081/ Sever 端 PyCharm 打印結(jié)果

客戶端的請(qǐng)求數(shù)據(jù)
GET / HTTP/1.1
Host: 127.0.0.1:8081
Connection: keep-alive
sec-ch-ua: "Chromium";v="122", "Not(A:Brand";v="24", "Google Chrome";v="122"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "macOS"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7

打印完畢=====

三、分析客戶端請(qǐng)求參數(shù)-GET請(qǐng)求

在上篇文章中我們講到 HTTP 協(xié)議在發(fā)送請(qǐng)求的時(shí)候,必須要包含請(qǐng)求行、請(qǐng)求頭、請(qǐng)求體。這是瀏覽器幫我們組織好的。 此處的請(qǐng)求行為

GET / HTTP/1.1

請(qǐng)求頭為:

Host: 127.0.0.1:8081
Connection: keep-alive
sec-ch-ua: "Chromium";v="122", "Not(A:Brand";v="24", "Google Chrome";v="122"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "macOS"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7

請(qǐng)求體為:

之所以為空,是因?yàn)?GET 請(qǐng)求沒(méi)有請(qǐng)求體。

四、分析客戶端請(qǐng)求參數(shù)-PUT請(qǐng)求

首先通過(guò) python request 包發(fā)送 put 請(qǐng)求,因?yàn)檎?qǐng)求必須要包括請(qǐng)求行、請(qǐng)求頭以及請(qǐng)求體,所以 python request 模板會(huì)幫我們組織好。

import requests

data={"username":"test","password":"<PASSWORD>"}
respone=requests.post("http://127.0.0.1:8081",json=data)
print(respone)

Sever 端 PyCharm打印結(jié)果

客戶端的請(qǐng)求數(shù)據(jù)
POST / HTTP/1.1
Host: 127.0.0.1:8081
User-Agent: python-requests/2.31.0
Accept-Encoding: gzip, deflate, br, zstd
Accept: */*
Connection: keep-alive
Content-Length: 46
Content-Type: application/json

{"username": "test", "password": "<PASSWORD>"}
打印完畢=====

此處的請(qǐng)求行為:

POST / HTTP/1.1

請(qǐng)求頭為:

Host: 127.0.0.1:8081
User-Agent: python-requests/2.31.0
Accept-Encoding: gzip, deflate, br, zstd
Accept: */*
Connection: keep-alive
Content-Length: 46
Content-Type: application/json

請(qǐng)求體為:

{"username": "test", "password": "<PASSWORD>"}

五、服務(wù)端響應(yīng)參數(shù)

通過(guò)瀏覽器訪問(wèn) http://127.0.0.1:8081/ 時(shí),雖然 server 端接受到請(qǐng)求了,也給瀏覽器反回了 hello world 但瀏覽器仍然報(bào)錯(cuò)了

另外當(dāng)我們通過(guò) python request 發(fā)送 put 請(qǐng)求時(shí),同樣 server 端接受到請(qǐng)求了,也返回了 hello world 但 request 程序仍然報(bào)錯(cuò)了

Traceback (most recent call last):
  File "/Users/isx/opt/anaconda3/lib/python3.11/site-packages/urllib3/connectionpool.py", line 791, in urlopen
    response = self._make_request(
               ^^^^^^^^^^^^^^^^^^^
  File "/Users/isx/opt/anaconda3/lib/python3.11/site-packages/urllib3/connectionpool.py", line 537, in _make_request
    response = conn.getresponse()
               ^^^^^^^^^^^^^^^^^^
  File "/Users/isx/opt/anaconda3/lib/python3.11/site-packages/urllib3/connection.py", line 461, in getresponse
    httplib_response = super().getresponse()
                       ^^^^^^^^^^^^^^^^^^^^^
  File "/Users/isx/opt/anaconda3/lib/python3.11/http/client.py", line 1390, in getresponse
    response.begin()
  File "/Users/isx/opt/anaconda3/lib/python3.11/http/client.py", line 325, in begin
    version, status, reason = self._read_status()
                              ^^^^^^^^^^^^^^^^^^^
  File "/Users/isx/opt/anaconda3/lib/python3.11/http/client.py", line 307, in _read_status
    raise BadStatusLine(line)
http.client.BadStatusLine: Hello world

這是為什么? 上篇文章中,我們也講過(guò),服務(wù)端的響應(yīng)也必須要包括響應(yīng)行、響應(yīng)頭以及響應(yīng)體,而我們寫的 sever 中代碼,趙括響應(yīng)體,所以瀏覽器和 python request 包會(huì)報(bào)錯(cuò)。

#響應(yīng)客戶端的請(qǐng)求
conn.send(b'Hello world') 

我們遵循服務(wù)端的響應(yīng)也必須要包括響應(yīng)行、響應(yīng)頭以及響應(yīng)體這個(gè)要求,改進(jìn) server 代碼

import socket

sock=socket.socket()

sock.bind(('127.0.0.1',8081))
#在 sock.listen(5) 中,參數(shù) 5 表示最多可以排隊(duì)等待處理的連接數(shù)量為 5。
# 如果有更多的連接請(qǐng)求到達(dá),超過(guò)該數(shù)量的連接將被拒絕。
sock.listen(5)
while True:
    conn,addr=sock.accept()
    data=conn.recv(1024)
    print('客戶端的請(qǐng)求數(shù)據(jù)\r\n',data.decode('utf-8'))
    print("打印完畢=====")

    conn.send(b'HTTP/1.1 200 OK \r\nDate: Tue, 02 Mar 2024 12:00:00 GMT\r\nServer: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips\r\nContent-Type: text/plain\r\nHello world')
    conn.close()

六、擴(kuò)展

content-type

content-type 是請(qǐng)求頭以及響應(yīng)頭中最重要的參數(shù),它可以分別告訴客戶端和服務(wù)端該如何處理請(qǐng)求體或者響應(yīng)體中的參數(shù)。舉個(gè)例子: server代碼

import socket

sock=socket.socket()

sock.bind(('127.0.0.1',8081))
#在 sock.listen(5) 中,參數(shù) 5 表示最多可以排隊(duì)等待處理的連接數(shù)量為 5。
# 如果有更多的連接請(qǐng)求到達(dá),超過(guò)該數(shù)量的連接將被拒絕。
sock.listen(5)
while True:
    conn,addr=sock.accept()
    data=conn.recv(1024)
    print('客戶端的請(qǐng)求數(shù)據(jù)\r\n',data.decode('utf-8'))
    print("打印完畢=====")

    conn.send(b'HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\n{"username": "test", "password": "<PASSWORD>"}')
    conn.close()

為了更好的呈現(xiàn)響應(yīng)的結(jié)果,這個(gè)我們借助 postman 工具。當(dāng) Content-Type: text/plain,postman 接受服務(wù)端返回的數(shù)據(jù)類型為 text

當(dāng) Content-Type:application/json 時(shí),postman 服務(wù)端返回的數(shù)據(jù)類型為 json

七、總結(jié)

本文通過(guò)實(shí)際代碼和請(qǐng)求示例,深入探討了HTTP協(xié)議的實(shí)現(xiàn)和交互過(guò)程。通過(guò)對(duì)Socket的使用,讀者能夠更直觀地理解HTTP請(qǐng)求和響應(yīng)的過(guò)程。同時(shí),文章強(qiáng)調(diào)了請(qǐng)求和響應(yīng)中的參數(shù)組成,以及服務(wù)端響應(yīng)中的必要元素。最后,通過(guò)content-type的討論,讀者能夠更好地理解數(shù)據(jù)類型對(duì)于請(qǐng)求和響應(yīng)的影響。

到此這篇關(guān)于Python通過(guò)Socket手動(dòng)實(shí)現(xiàn)HTTP協(xié)議的文章就介紹到這了,更多相關(guān)Python Socket HTTP協(xié)議內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于python計(jì)算滾動(dòng)方差(標(biāo)準(zhǔn)差)talib和pd.rolling函數(shù)差異詳解

    基于python計(jì)算滾動(dòng)方差(標(biāo)準(zhǔn)差)talib和pd.rolling函數(shù)差異詳解

    這篇文章主要介紹了基于python計(jì)算滾動(dòng)方差(標(biāo)準(zhǔn)差)talib和pd.rolling函數(shù)差異詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • PyCharm 專業(yè)版安裝圖文教程

    PyCharm 專業(yè)版安裝圖文教程

    這篇文章主要介紹了PyCharm 專業(yè)版安裝圖文教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Pytorch中的backward()多個(gè)loss函數(shù)用法

    Pytorch中的backward()多個(gè)loss函數(shù)用法

    這篇文章主要介紹了Pytorch中的backward()多個(gè)loss函數(shù)用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Python+tkinter實(shí)現(xiàn)高清圖片保存

    Python+tkinter實(shí)現(xiàn)高清圖片保存

    作為愛玩電腦的你是不是也需要經(jīng)常更換一下自己的電腦壁紙呢?但是在網(wǎng)上有很多心儀的圖片想要保存下來(lái),如果一張張的去保存那效率又低。所以本文用Python寫一個(gè)保存圖片的功能,把我們的圖片給保存到我們的電腦,需要的可以參考一下
    2022-03-03
  • 使用Python paramiko模塊利用多線程實(shí)現(xiàn)ssh并發(fā)執(zhí)行操作

    使用Python paramiko模塊利用多線程實(shí)現(xiàn)ssh并發(fā)執(zhí)行操作

    ssh是一個(gè)協(xié)議,OpenSSH是其中一個(gè)開源實(shí)現(xiàn),paramiko是Python的一個(gè)庫(kù),實(shí)現(xiàn)了SSHv2協(xié)議(底層使用cryptography)。這篇文章主要介紹了使用Python paramiko模塊利用多線程實(shí)現(xiàn)ssh并發(fā)執(zhí)行操作,需要的朋友可以參考下
    2019-12-12
  • Python中擴(kuò)展包的安裝方法詳解

    Python中擴(kuò)展包的安裝方法詳解

    這篇文章主要給大家總結(jié)了關(guān)于Python中擴(kuò)展包的安裝方法,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。
    2017-06-06
  • python 寫一個(gè)性能測(cè)試工具(一)

    python 寫一個(gè)性能測(cè)試工具(一)

    這篇文章主要介紹了利用python 寫一個(gè)性能測(cè)試工具,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-10-10
  • Python利用docx模塊實(shí)現(xiàn)快速操作word文件

    Python利用docx模塊實(shí)現(xiàn)快速操作word文件

    這篇文章主要為大家詳細(xì)介紹了Python如何利用docx模塊實(shí)現(xiàn)快速操作word文件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-09-09
  • Python 防止死鎖的方法

    Python 防止死鎖的方法

    這篇文章主要介紹了Python 防止死鎖的方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • Python進(jìn)階之Excel基本操作介紹

    Python進(jìn)階之Excel基本操作介紹

    在現(xiàn)實(shí)中,很多工作都需要與數(shù)據(jù)打交道,Excel 作為常用的數(shù)據(jù)處理工具,一直備受人們的青睞,本文主要為大家介紹了一些Python中Excel的基本操作,希望對(duì)大家有所幫助
    2025-01-01

最新評(píng)論