日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python客户端软件开发_用 Python 实现一个简易版 HTTP 客户端

發布時間:2023/12/20 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python客户端软件开发_用 Python 实现一个简易版 HTTP 客户端 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

此文為《用 Python 擼一個 Web 服務器》系列教程的一個補充,這個系列教程介紹了如何使用 Python 內置的 socket 庫實現一個簡易版的 Web 服務器。

之所以寫這篇文章,是因為我發現很多人并不清楚 HTTP 客戶端的概念,以為只有瀏覽器才叫 HTTP 客戶端。事實上并非如此,我們在 Web 開發中常見的 Postman、爬蟲程序、curl 命令行工具 等,這些都可以稱為 HTTP 客戶端。

服務器程序示例

這里以一個 Hello World 程序來作為示例服務器,實現如下:# server.py

import socket

import threading

def process_connection(client):

"""處理客戶端連接"""

# 接收客戶端發來的數據

data = b''

while True:

chunk = client.recv(1024)

data += chunk

if len(chunk) < 1024:

break

# 打印從客戶端接收的數據

print(f'data: {data}')

# 給客戶端發送響應數據

client.sendall(b'HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n

Hello World

')

# 關閉客戶端連接對象

client.close()

def main():

# 創建 socket 對象

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 允許端口復用

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# 綁定 IP 和端口

sock.bind(('127.0.0.1', 8000))

# 開始監聽

sock.listen(5)

while True:

# 等待客戶端請求

client, addr = sock.accept()

print(f'client type: {type(client)}\naddr: {addr}')

# 創建新的線程來處理客戶端連接

t = threading.Thread(target=process_connection, args=(client,))

t.start()

if __name__ == '__main__':

main()

極簡客戶端

知道了如何用 socket 庫實現服務器端程序,那么理解客戶端程序的實現就非常容易了。客戶端程序代碼實現如下:# client.py

import socket

# 創建 socket 對象

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 指定服務器 IP 和端口,進行連接

sock.connect(('127.0.0.1', 8000))

# 向 URL "/" 發送 GET 請求

sock.send(b'GET / HTTP/1.1\r\nHost: 127.0.0.1:8000\r\n\r\n')

# 接收服務端響應數據

data = b''

while True:

chunk = sock.recv(1024)

data += chunk

if len(chunk) < 1024:

break

# 打印響應數據

print(data)

# 關閉連接

sock.close()

相對來說客戶端程序要簡單一些,創建 socket 對象的代碼與服務器端程序并無差別,客戶端 socket 對象根據 IP 和端口來連接指定的服務器,建立好連接后就可以發送數據了,這里根據 HTTP 協議構造了一個針對 / URL 路徑的 GET 請求,為了簡單起見,請求頭中僅攜帶了 HTTP 協議規定的必傳字段 Host,請求發送成功后便可以接收服務器端響應,最后別忘了關閉 socket連接。

僅用幾行代碼,我們就實現了一個極簡的 HTTP 客戶端程序,接下來對其進行測試。

首先在終端中使用 Python 運行服務器端程序:python3 server.py。然后在另一個終端中使用 Python 運行客戶端程序:python3 client.py。

可以看到客戶端打印結果如下:b'HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n

Hello World

'

以上,我們實現了一個極簡的 HTTP 客戶端。

參考 requests 實現客戶端

用 Python 寫過爬蟲的同學,一定聽說或使用過 requests 庫,以下是使用 requests 訪問 Hello World 服務端程序的示例代碼:# demo_requests.py

import requests

response = requests.request('GET', 'http://127.0.0.1:8000/')

print(response.status_code) # 響應狀態碼

print('--------------------')

print(response.headers) # 響應頭

print('--------------------')

print(response.text) # 響應體

在終端中使用 python3 demo_requests.py 運行此程序,將打印如下結果:200

--------------------

{'Content-Type': 'text/html'}

--------------------

Hello World

接下來修改我們上面實現的極簡 HTTP 客戶端程序,使其能夠支持 response.status_code、response.headers 和 response.text功能。# client.py

import socket

from urllib.parse import urlparse

class HTTPClient(object):

"""HTTP 客戶端"""

def __init__(self):

# 創建 socket 對象

self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 初始化數據

self.status_code = 200

self.headers = {}

self.text = ''

def __del__(self):

# 關閉連接

self.sock.close()

def connect(self, ip, port):

"""建立連接"""

self.sock.connect((ip, port))

def request(self, method, url):

"""請求"""

# URL 解析

parse_result = urlparse(url)

ip = parse_result.hostname

port = parse_result.port or 80

host = parse_result.netloc

path = parse_result.path

# 建立連接

self.connect(ip, port)

# 構造請求數據

send_data = f'{method} {path} HTTP/1.1\r\nHost: {host}\r\n\r\n'.encode('utf-8')

# 發送請求

self.sock.send(send_data)

# 接收服務端響應的數據

data = self.recv_data()

# 解析響應數據

self.parse_data(data)

def recv_data(self):

"""接收數據"""

data = b''

while True:

chunk = self.sock.recv(1024)

data += chunk

if len(chunk) < 1024:

break

return data.decode('utf-8')

def parse_data(self, data):

"""解析數據"""

header, self.text = data.split('\r\n\r\n', 1)

status_line, header = header.split('\r\n', 1)

for item in header.split('\r\n'):

k, v = item.split(': ')

self.headers[k] = v

self.status_code = status_line.split(' ')[1]

if __name__ == '__main__':

client = HTTPClient()

client.request('GET', 'http://127.0.0.1:8000/')

print(client.status_code)

print('--------------------')

print(client.headers)

print('--------------------')

print(client.text)

代碼實現比較簡單,我寫了較為詳細的注釋,相信你能夠看懂。其中使用了內置函數 urlparse ,此函數能夠根據 URL 格式規則將 URL 拆分成多個部分。

在終端中使用 python3 client.py 運行此程序,打印結果與使用 requests 的結果完全相同。200

--------------------

{'Content-Type': 'text/html'}

--------------------

Hello World

僅用幾十行代碼,我們就實現了一個簡易版的 HTTP 客戶端程序,并且還實現了類似 requests 庫的功能。

接下來你可以嘗試用它去訪問現實世界中真實的 URL,比如訪問 http://httpbin.org/get,看看打印結果如何。

P.S.

Web 開發本質是圍繞著 HTTP 協議進行的,HTTP 協議是 Web 開發的基石。所以對于何為 HTTP 服務端、何為 HTTP 客戶端的概念不夠清晰的話,實際上都是對 HTTP 協議不夠理解。

最后,給大家留一道作業題,實現 requests 庫的 response.json() 方法。

聯系我:

總結

以上是生活随笔為你收集整理的python客户端软件开发_用 Python 实现一个简易版 HTTP 客户端的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 大桥未久av在线 | 亚洲天堂aaa | 成人一区二区在线 | 久久精工是国产品牌吗 | 国产精品人人妻人人爽 | 亚洲一区二区三区四区不卡 | 国产成人在线网站 | 艳母在线视频 | 黄色免费在线视频 | 91激情捆绑调教喷水 | 91久久久久久久久久久 | 视频一区在线免费观看 | 免费无码又爽又黄又刺激网站 | 午夜精品久久久久久久99热浪潮 | 亚洲成人第一区 | 国产中文字幕一区二区三区 | 色乱码一区二区三区熟女 | 婷婷视频在线 | 日韩一区三区 | 国产精品第108页 | 精品一区二区三区四区五区 | 日韩中文字幕二区 | 日本欧美一区 | 天天天天天天操 | 99久久亚洲精品日本无码 | 国产成人资源 | www.xxx日韩 | 国产丝袜美腿一区二区三区 | 热久久影院 | 小早川怜子一区二区三区 | 国产91白丝在一线播放 | 原创少妇半推半就88av | 最近中文字幕在线中文高清版 | 国产午夜福利一区 | 日韩精品一二 | 亚洲女优在线播放 | 成人免费区一区二区三区 | 国产一国产二国产三 | 麻豆传媒网页 | 91操操操| 91爱爱爱爱| 色爱AV综合网国产精品 | 日韩免费看| 国产jizz | 久操福利在线 | 欧美性免费 | 免费裸体美女网站 | 一区二区三区www污污污网站 | 意大利少妇愉情理伦片 | 久久久久国产精品人妻 | 亚洲色图1 | 亚洲在线免费看 | 99国产精品久久久久久久成人 | 成人高清网站 | 一级作爱片 | www操操操| 一区黄色 | 一二三四精品 | 欧美一区二区三区影院 | 久久久久成人精品无码中文字幕 | 免费看欧美大片 | 涩涩成人 | 91成人国产综合久久精品 | 日本三级大片 | 国产乱真实合集 | 91精品国| 日韩精品一区二区三区无码专区 | 国产白浆在线观看 | av黄色在线免费观看 | 久久蜜桃av一区二区天堂 | 国产精品久久网站 | 日本三级黄在线观看 | 一本无码aⅴ久久久国产 | 麻豆视频一区 | www.一级片| 99热在线国产 | 一二三不卡| 久久青青热 | 婷婷亚洲激情 | 污污视频网站在线免费观看 | 91丨国产丨白丝 | 人妻无码中文久久久久专区 | 国产日韩精品一区二区三区在线 | 91日韩| 亚洲三级av | 亚洲精品乱码久久久久久蜜桃不卡 | 国产精品久久久久久久免费大片 | 红桃视频在线播放 | 国产片91 | 天堂8中文| 成人公开视频 | 香蕉视频一区 | 亚洲情热 | 免费精品在线观看 | 91精品国产综合久久久久久 | av男人资源 | 爱爱免费视频网站 | 男人和女人日批 | 亚洲黄色免费 |