Python 网络编程主要依靠 Python 提供的标准库 socket 和其他第三方库来实现网络通信。网络编程的核心是通过 TCP/IP 协议栈与其他计算机进行通信。Python 提供了便捷的接口,使得网络编程更加容易。以下是 Python 网络编程的基本概念和示例。


1. socket 库基础

1.1 创建 TCP 客户端和服务器

TCP 服务器

import socket

# 创建一个 TCP socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定到特定的地址和端口
server_socket.bind(("localhost", 12345))

# 开始监听连接
server_socket.listen(5)

print("服务器启动,等待连接...")

# 接受客户端连接
client_socket, client_address = server_socket.accept()
print(f"连接来自: {client_address}")

# 接收数据
data = client_socket.recv(1024)
print(f"收到的数据: {data.decode()}")

# 发送回应
client_socket.send("你好,客户端!".encode())

# 关闭连接
client_socket.close()
server_socket.close()

TCP 客户端

import socket

# 创建一个 TCP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接到服务器
client_socket.connect(("localhost", 12345))

# 发送数据
client_socket.send("你好,服务器!".encode())

# 接收回应
data = client_socket.recv(1024)
print(f"收到的回应: {data.decode()}")

# 关闭连接
client_socket.close()


2. UDP 网络编程

UDP 是无连接的协议,不保证数据的顺序和可靠性,但速度较快,适用于不要求严格可靠性的应用场景。

2.1 UDP 服务器

import socket

# 创建 UDP socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 绑定到指定地址和端口
server_socket.bind(("localhost", 12345))

print("UDP 服务器启动,等待消息...")

# 接收数据
data, client_address = server_socket.recvfrom(1024)
print(f"收到来自 {client_address} 的数据: {data.decode()}")

# 发送回应
server_socket.sendto("你好,客户端!".encode(), client_address)

# 关闭连接
server_socket.close()

2.2 UDP 客户端

import socket

# 创建 UDP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 发送数据到服务器
client_socket.sendto("你好,服务器!".encode(), ("localhost", 12345))

# 接收回应
data, server_address = client_socket.recvfrom(1024)
print(f"收到来自 {server_address} 的回应: {data.decode()}")

# 关闭连接
client_socket.close()


3. HTTP 请求和响应

3.1 使用 http.client 发起 HTTP 请求

import http.client

# 创建一个 HTTP 连接
conn = http.client.HTTPConnection("www.example.com")

# 发送 GET 请求
conn.request("GET", "/")

# 获取响应
response = conn.getresponse()
print(f"状态码: {response.status}")
print(f"响应内容: {response.read().decode()}")

# 关闭连接
conn.close()

3.2 使用 requests 库发送 HTTP 请求(推荐)

requests 是一个非常流行且功能强大的 HTTP 库,它简化了 HTTP 请求的过程。

pip install requests

import requests

# 发送 GET 请求
response = requests.get("https://www.example.com")
print(f"状态码: {response.status_code}")
print(f"响应内容: {response.text}")


4. 使用 socketserver 简化服务器端编程

socketserver 提供了一个高级的接口,简化了服务器端编程,特别适用于编写简单的服务器程序。

4.1 TCP 服务器示例(socketserver

import socketserver

class MyHandler(socketserver.BaseRequestHandler):
    def handle(self):
        # 获取客户端发送的数据
        data = self.request.recv(1024).strip()
        print(f"接收到数据: {data.decode()}")
        
        # 发送响应
        self.request.sendall(b"你好,客户端!")

# 创建 TCP 服务器
server = socketserver.TCPServer(("localhost", 12345), MyHandler)

# 启动服务器
print("服务器启动...")
server.serve_forever()


5. 多线程和多进程服务器

5.1 多线程服务器

多线程服务器可以同时处理多个客户端连接。

import socket
import threading

def handle_client(client_socket):
    # 接收数据
    data = client_socket.recv(1024)
    print(f"收到的数据: {data.decode()}")
    
    # 发送回应
    client_socket.send(b"你好,客户端!")
    
    # 关闭连接
    client_socket.close()

# 创建服务器 socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("localhost", 12345))
server_socket.listen(5)

print("服务器启动,等待连接...")

while True:
    client_socket, client_address = server_socket.accept()
    print(f"连接来自: {client_address}")
    
    # 为每个客户端创建一个线程来处理请求
    client_thread = threading.Thread(target=handle_client, args=(client_socket,))
    client_thread.start()

5.2 多进程服务器

多进程服务器使用进程池来处理客户端连接,适用于需要更高并发的场景。

import socket
import multiprocessing

def handle_client(client_socket):
    data = client_socket.recv(1024)
    print(f"收到的数据: {data.decode()}")
    client_socket.send(b"你好,客户端!")
    client_socket.close()

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("localhost", 12345))
server_socket.listen(5)

print("服务器启动,等待连接...")

while True:
    client_socket, client_address = server_socket.accept()
    print(f"连接来自: {client_address}")
    
    # 使用多进程处理每个客户端请求
    client_process = multiprocessing.Process(target=handle_client, args=(client_socket,))
    client_process.start()


6. 常用库

6.1 asyncio 网络编程(异步 I/O)

asyncio 是 Python 3.4 引入的标准库,它提供了异步 I/O 操作,适用于需要高并发的网络应用。

import asyncio

async def handle_client(reader, writer):
    data = await reader.read(100)
    message = data.decode()
    addr = writer.get_extra_info('peername')

    print(f"Received {message} from {addr}")

    print("Send: Hello!")
    writer.write(b"Hello!")
    await writer.drain()

    print("Closing the connection")
    writer.close()

async def main():
    server = await asyncio.start_server(
        handle_client, '127.0.0.1', 12345)

    addr = server.sockets[0].getsockname()
    print(f'Serving on {addr}')

    async with server:
        await server.serve_forever()

asyncio.run(main())


7. 参考资料

出站链接

站内链接

Python 的网络编程功能非常强大,适合从小型应用到大型分布式系统的各种场景!