Python中兩種網路程式設計方式:Socket和HTTP協議

华为云开发者联盟發表於2024-04-16

本文分享自華為雲社群《Python網路程式設計實踐從Socket到HTTP協議的探索與實現》,作者:檸檬味擁抱。

在當今網際網路時代,網路程式設計是程式設計師不可或缺的一項技能。Python作為一種高階程式語言,提供了豐富的網路程式設計庫,使得開發者能夠輕鬆地實現各種網路應用。本文將介紹Python中兩種主要的網路程式設計方式:Socket程式設計和基於HTTP協議的網路程式設計,並透過實際案例來演示它們的應用。

1. Socket程式設計

Socket是實現網路通訊的基礎。透過Socket,程式可以在網路中傳輸資料,實現客戶端與伺服器之間的通訊。Python提供了socket模組,使得Socket程式設計變得簡單而直觀。

下面是一個簡單的Socket伺服器和客戶端的實現:

# 伺服器端
import socket

# 建立socket物件
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 獲取本地主機名
host = socket.gethostname()
port = 9999

# 繫結埠
server_socket.bind((host, port))

# 設定最大連線數,超過後排隊
server_socket.listen(5)

while True:
    # 建立客戶端連線
    client_socket, addr = server_socket.accept()

    print("連線地址: %s" % str(addr))

    msg = '歡迎訪問Socket伺服器!' + "\r\n"
    client_socket.send(msg.encode('utf-8'))

    client_socket.close()
# 客戶端
import socket

# 建立socket物件
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 獲取本地主機名
host = socket.gethostname()
port = 9999

# 連線服務,指定主機和埠
client_socket.connect((host, port))

# 接收服務端傳送的資料
msg = client_socket.recv(1024)

print(msg.decode('utf-8'))

client_socket.close()

執行以上程式碼,可以在本地搭建一個簡單的Socket伺服器,並透過客戶端連線並接收訊息。

2. HTTP協議的實踐

HTTP(HyperText Transfer Protocol)是一種用於傳輸超媒體文件(例如HTML)的應用層協議。Python提供了多種庫用於HTTP通訊,其中最常用的是requests庫。

以下是一個使用requests庫傳送HTTP GET請求的示例:

import requests

url = 'https://api.github.com'
response = requests.get(url)

print("狀態碼:", response.status_code)
print("響應內容:", response.text)

透過requests.get()函式可以傳送HTTP GET請求,並獲取響應的狀態碼和內容。

3. 使用Socket進行簡單的網路通訊

Socket程式設計在Python中是一種基礎的網路通訊方式,它提供了一種在網路上傳送和接收資料的方法,可用於構建各種型別的網路應用程式,包括即時通訊、檔案傳輸等。

下面是一個簡單的基於Socket的聊天程式,包括服務端和客戶端:

# 伺服器端
import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 12345

server_socket.bind((host, port))
server_socket.listen(1)

print("等待客戶端連線...")
client_socket, client_address = server_socket.accept()
print("連線地址:", client_address)

while True:
    data = client_socket.recv(1024).decode('utf-8')
    if not data:
        break
    print("客戶端訊息:", data)
    message = input("伺服器訊息:")
    client_socket.send(message.encode('utf-8'))

client_socket.close()
# 客戶端
import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 12345

client_socket.connect((host, port))

while True:
    message = input("客戶端訊息:")
    client_socket.send(message.encode('utf-8'))
    data = client_socket.recv(1024).decode('utf-8')
    print("伺服器訊息:", data)

client_socket.close()

執行以上程式碼,可以實現一個簡單的基於Socket的聊天程式。客戶端和伺服器端可以互相傳送訊息,實現簡單的即時通訊功能。

4. 使用HTTP協議進行網路通訊

HTTP協議是一種應用層協議,廣泛用於傳輸超文字文件(如HTML)的資料傳輸。在Python中,使用HTTP協議進行網路通訊通常透過requests庫來實現,這個庫提供了簡單易用的介面,方便傳送HTTP請求和處理響應。

下面是一個使用requests庫傳送HTTP POST請求的示例:

import requests

url = 'https://httpbin.org/post'
data = {'key1': 'value1', 'key2': 'value2'}

response = requests.post(url, data=data)

print("狀態碼:", response.status_code)
print("響應內容:", response.text)

執行以上程式碼,可以向指定的URL傳送一個HTTP POST請求,並獲取伺服器返回的響應。

5. 使用Socket進行多執行緒網路通訊

在實際應用中,往往需要處理多個客戶端的連線請求。為了實現高併發處理,可以使用多執行緒來處理每個客戶端的連線。Python的threading模組提供了多執行緒支援,可以很方便地實現多執行緒網路通訊。

以下是一個使用多執行緒處理Socket連線的示例:

# 伺服器端
import socket
import threading

def handle_client(client_socket):
    while True:
        data = client_socket.recv(1024).decode('utf-8')
        if not data:
            break
        print("客戶端訊息:", data)
        message = input("伺服器訊息:")
        client_socket.send(message.encode('utf-8'))
    client_socket.close()

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 12345

server_socket.bind((host, port))
server_socket.listen(5)

print("等待客戶端連線...")

while True:
    client_socket, client_address = server_socket.accept()
    print("連線地址:", client_address)
    client_thread = threading.Thread(target=handle_client, args=(client_socket,))
    client_thread.start()
# 客戶端
import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 12345

client_socket.connect((host, port))

while True:
    message = input("客戶端訊息:")
    client_socket.send(message.encode('utf-8'))
    data = client_socket.recv(1024).decode('utf-8')
    print("伺服器訊息:", data)

client_socket.close()

透過在伺服器端的主迴圈中建立新的執行緒來處理每個客戶端的連線,可以實現同時處理多個客戶端的請求,提高伺服器的併發處理能力。

6. 使用HTTP協議進行網路通訊

HTTP(HyperText Transfer Protocol)是一種用於傳輸超文字文件(如HTML)的應用層協議。在網路程式設計中,基於HTTP協議的通訊方式更為常見,特別是在Web開發和API互動中。Python提供了多種庫用於HTTP通訊,其中最常用的是requests庫。

以下是一個使用requests庫傳送HTTP GET請求的示例:

import requests

url = 'https://api.github.com'
response = requests.get(url)

print("狀態碼:", response.status_code)
print("響應內容:", response.text)

透過requests.get()函式可以傳送HTTP GET請求,並獲取響應的狀態碼和內容。requests庫還提供了豐富的引數和方法,用於處理各種HTTP請求和響應,如設定請求頭、傳遞引數、處理Cookie等。

7. 使用Socket進行多執行緒網路通訊

在實際應用中,往往需要處理多個客戶端的連線請求。為了實現高併發處理,可以使用多執行緒來處理每個客戶端的連線。Python的threading模組提供了多執行緒支援,可以很方便地實現多執行緒網路通訊。

以下是一個使用多執行緒處理Socket連線的示例:

# 伺服器端
import socket
import threading

def handle_client(client_socket):
    while True:
        data = client_socket.recv(1024).decode('utf-8')
        if not data:
            break
        print("客戶端訊息:", data)
        message = input("伺服器訊息:")
        client_socket.send(message.encode('utf-8'))
    client_socket.close()

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 12345

server_socket.bind((host, port))
server_socket.listen(5)

print("等待客戶端連線...")

while True:
    client_socket, client_address = server_socket.accept()
    print("連線地址:", client_address)
    client_thread = threading.Thread(target=handle_client, args=(client_socket,))
    client_thread.start()
# 客戶端
import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 12345

client_socket.connect((host, port))

while True:
    message = input("客戶端訊息:")
    client_socket.send(message.encode('utf-8'))
    data = client_socket.recv(1024).decode('utf-8')
    print("伺服器訊息:", data)

client_socket.close()

透過在伺服器端的主迴圈中建立新的執行緒來處理每個客戶端的連線,可以實現同時處理多個客戶端的請求,提高伺服器的併發處理能力。

8. 使用Socket進行多執行緒網路通訊

在實際應用中,往往需要處理多個客戶端的連線請求。為了實現高併發處理,可以使用多執行緒來處理每個客戶端的連線。Python的threading模組提供了多執行緒支援,可以很方便地實現多執行緒網路通訊。

以下是一個使用多執行緒處理Socket連線的示例:

# 伺服器端
import socket
import threading

def handle_client(client_socket):
    while True:
        data = client_socket.recv(1024).decode('utf-8')
        if not data:
            break
        print("客戶端訊息:", data)
        message = input("伺服器訊息:")
        client_socket.send(message.encode('utf-8'))
    client_socket.close()

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 12345

server_socket.bind((host, port))
server_socket.listen(5)

print("等待客戶端連線...")

while True:
    client_socket, client_address = server_socket.accept()
    print("連線地址:", client_address)
    client_thread = threading.Thread(target=handle_client, args=(client_socket,))
    client_thread.start()
# 客戶端
import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 12345

client_socket.connect((host, port))

while True:
    message = input("客戶端訊息:")
    client_socket.send(message.encode('utf-8'))
    data = client_socket.recv(1024).decode('utf-8')
    print("伺服器訊息:", data)

client_socket.close()

透過在伺服器端的主迴圈中建立新的執行緒來處理每個客戶端的連線,可以實現同時處理多個客戶端的請求,提高伺服器的併發處理能力。

總結

本文深入介紹了Python中的網路程式設計,重點探討了兩種主要方式:Socket程式設計和基於HTTP協議的網路程式設計。首先,我們瞭解了Socket程式設計,它是一種底層的網路通訊方式,可以實現自定義的通訊協議,具有靈活性和高度控制性。我們透過示例演示瞭如何使用Socket程式設計在伺服器端和客戶端之間進行簡單的通訊,並介紹瞭如何使用多執行緒來處理多個客戶端的連線請求,以提高伺服器的併發處理能力。

其次,我們介紹了基於HTTP協議的網路程式設計,這是一種更高層次的抽象,適用於構建Web應用、訪問API等場景。我們使用了requests庫來傳送HTTP請求,並獲取伺服器的響應,演示瞭如何傳送GET和POST請求,並處理響應的狀態碼和內容。基於HTTP協議的網路程式設計更簡單易用,適合於與現有的Web服務進行互動。

透過本文的學習,我們可以瞭解到Python提供了豐富的網路程式設計工具和庫,使得開發者能夠輕鬆實現各種網路應用。無論是底層的Socket程式設計還是基於HTTP協議的網路程式設計,都可以滿足不同場景下的需求。掌握網路程式設計技術對於開發網路應用和系統非常重要,希望本文能夠幫助讀者更好地理解和應用Python中的網路程式設計技術,為其在專案開發中提供幫助和啟發。

點選關注,第一時間瞭解華為雲新鮮技術~

相關文章