1. 核心概念
Socket(套接字):网络通信的基础,通过 IP 地址和端口实现数据传输。
协议:
TCP:可靠、面向连接的协议(如 HTTP)。
UDP:快速、无连接的协议(如实时视频流)。
客户端-服务器模型:服务器监听请求,客户端发起连接。
2. 基础示例: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) # 开始监听,最多5个等待连接 print("服务器启动,等待连接...") client_socket, addr = server_socket.accept() # 接受客户端连接 print(f"客户端 {addr} 已连接") data = client_socket.recv(1024) # 接收数据(最多1024字节) print(f"收到数据: {data.decode()}") client_socket.send("消息已收到".encode()) # 发送响应 client_socket.close() server_socket.close()
TCP 客户端
import socket client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(('localhost', 12345)) # 连接服务器 client.send("Hello Server!".encode()) # 发送数据 response = client.recv(1024) # 接收响应 print(f"服务器回复: {response.decode()}") client.close()
3. UDP 通信示例
UDP 服务器
import socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server_socket.bind(('localhost', 12345)) while True: data, addr = server_socket.recvfrom(1024) # 接收数据和客户端地址 print(f"收到来自 {addr} 的消息: {data.decode()}") server_socket.sendto("消息已收到".encode(), addr) # 发送响应
UDP 客户端
import socket client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) client.sendto("Hello UDP Server!".encode(), ('localhost', 12345)) response, addr = client.recvfrom(1024) print(f"服务器回复: {response.decode()}") client.close()
4. 高级库和框架
requests
:处理 HTTP 请求(如 REST API)。import requests response = requests.get("https://api.example.com/data") print(response.json())
asyncio
:异步网络编程(适合高并发场景)。import asyncio async def handle_client(reader, writer): data = await reader.read(100) message = data.decode() writer.write(f"收到: {message}".encode()) await writer.drain() writer.close() async def main(): server = await asyncio.start_server(handle_client, 'localhost', 12345) async with server: await server.serve_forever() asyncio.run(main())
Flask
/Django
:构建 Web 服务。from flask import Flask app = Flask(__name__) @app.route('/') def home(): return "Hello World!" if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
5. 常见问题与调试
端口占用:确保端口未被其他程序占用(如
netstat -ano
查看端口状态)。防火墙:检查防火墙是否允许端口通信。
阻塞与非阻塞:使用多线程、异步或
select
模块处理多连接。