Python 网络编程:Socket/TCP/UDP 协议实现
网络编程是 Python 的重要应用领域,Socket 编程实现了网络通信的基础功能。本文将深入探讨 Python 网络编程的核心技术,包括 Socket 编程、TCP 协议、UDP 协议等。
Socket 基础
Socket 是网络通信的基本单元,提供了进程间通信的接口。
import socket
def socket_basic_demo():
print("Socket 基础演示:")
print("1. 创建 Socket")
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print(f"Socket 家族: {sock.family}")
print(f"Socket 类型: {sock.type}")
sock.close()
socket_basic_demo()
TCP 服务器
TCP 服务器提供可靠的面向连接的服务。
def tcp_server_demo():
print("TCP 服务器演示:")
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen(5)
print("服务器启动,等待连接...")
while True:
client_socket, address = server_socket.accept()
print(f"客户端连接: {address}")
data = client_socket.recv(1024)
print(f"接收数据: {data.decode()}")
client_socket.send(b"Hello Client!")
client_socket.close()
tcp_server_demo()
TCP 客户端
TCP 客户端连接到服务器并发送数据。
def tcp_client_demo():
print("TCP 客户端演示:")
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 12345))
client_socket.send(b"Hello Server!")
data = client_socket.recv(1024)
print(f"接收数据: {data.decode()}")
client_socket.close()
tcp_client_demo()
UDP 服务器
UDP 服务器提供无连接的数据报服务。
def udp_server_demo():
print("UDP 服务器演示:")
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(('localhost', 12345))
print("服务器启动,等待数据...")
while True:
data, address = server_socket.recvfrom(1024)
print(f"接收来自 {address} 的数据: {data.decode()}")
server_socket.sendto(b"Hello Client!", address)
udp_server_demo()
UDP 客户端
UDP 客户端发送数据报到服务器。
def udp_client_demo():
print("UDP 客户端演示:")
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client_socket.sendto(b"Hello Server!", ('localhost', 12345))
data, address = client_socket.recvfrom(1024)
print(f"接收数据: {data.decode()}")
client_socket.close()
udp_client_demo()
网络编程架构
非阻塞 Socket
非阻塞 Socket 允许程序在等待 I/O 时执行其他任务。
def nonblocking_socket_demo():
print("非阻塞 Socket 演示:")
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setblocking(False)
try:
sock.connect(('localhost', 12345))
except BlockingIOError:
print("连接进行中...")
sock.close()
nonblocking_socket_demo()
多路复用
多路复用同时监控多个 Socket。
import select
def multiplexing_demo():
print("多路复用演示:")
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen(5)
server_socket.setblocking(False)
inputs = [server_socket]
while inputs:
readable, _, _ = select.select(inputs, [], [])
for sock in readable:
if sock is server_socket:
client_socket, address = sock.accept()
print(f"客户端连接: {address}")
inputs.append(client_socket)
else:
data = sock.recv(1024)
if data:
print(f"接收数据: {data.decode()}")
else:
inputs.remove(sock)
sock.close()
multiplexing_demo()
SSL/TLS 加密
SSL/TLS 加密保护网络通信安全。
import ssl
def ssl_demo():
print("SSL/TLS 加密演示:")
context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen(5)
ssl_socket = context.wrap_socket(server_socket, server_side=True)
print("SSL 服务器启动")
ssl_demo()
HTTP 客户端
HTTP 客户端发送 HTTP 请求。
import urllib.request
def http_client_demo():
print("HTTP 客户端演示:")
url = 'https://httpbin.org/get'
response = urllib.request.urlopen(url)
data = response.read()
print(f"状态码: {response.status}")
print(f"响应长度: {len(data)}")
http_client_demo()
WebSocket 通信
WebSocket 提供全双工通信。
import asyncio
import websockets
async def websocket_server(websocket, path):
async for message in websocket:
print(f"接收消息: {message}")
await websocket.send(f"Echo: {message}")
async def websocket_demo():
print("WebSocket 通信演示:")
server = await websockets.serve(websocket_server, 'localhost', 8765)
await server.wait_closed()
asyncio.run(websocket_demo())
总结
Python 网络编程通过 Socket、TCP、UDP 等技术,实现了灵活的网络通信。掌握这些网络编程技术,对于构建网络应用至关重要。
在实际应用中,需要根据通信需求选择合适的协议和技术,平衡性能和可靠性。良好的网络编程实践能够显著提高应用的通信效率。
IT极限技术分享汇