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 的网络编程功能非常强大,适合从小型应用到大型分布式系统的各种场景!
发表回复