Python 网络编程的核心是使用 socket(套接字) 进行跨设备通信,主要分为 TCP(可靠连接) 、UDP(无连接) 底层编程,以及 HTTP / 异步 / 高级协议 上层开发。下面从基础到实战完整讲解。
一、基础概念
1. 三要素
- IP:设备地址(IPv4/IPv6)
- 端口:进程标识(0~65535,1024+ 可用)
- 协议:TCP / UDP
2. socket 模块(内置)
python
运行
import socket
# TCP(可靠、面向连接)
sock_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# UDP(快速、无连接)
sock_udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
3. 编码要求
- 网络只传 字节(bytes)
- 字符串必须:
.encode('utf-8') - 接收后:
.decode('utf-8')
二、TCP 编程(重点)
特点:面向连接、可靠、有序、流式传输
1. TCP 服务器
python
运行
import socket
# 1. 创建socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 绑定IP+端口
server.bind(('127.0.0.1', 8888))
# 3. 监听(最大连接数)
server.listen(5)
print("TCP服务器已启动,等待连接...")
# 4. 接受连接(阻塞)
client_sock, addr = server.accept()
print(f"客户端 {addr} 已连接")
# 5. 收发数据
while True:
data = client_sock.recv(1024) # 接收
if not data:
break
print(f"收到:{data.decode()}")
client_sock.send(b"OK: " + data) # 回复
# 6. 关闭
client_sock.close()
server.close()
2. TCP 客户端
python
运行
import socket
# 1. 创建socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 连接服务器
client.connect(('127.0.0.1', 8888))
# 3. 收发
client.send(b"Hello TCP Server")
resp = client.recv(1024)
print("服务器回复:", resp.decode())
# 4. 关闭
client.close()
三、UDP 编程
特点:无连接、不可靠、速度快
1. UDP 服务器
python
运行
import socket
udp_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_server.bind(('127.0.0.1', 9999))
print("UDP服务器已启动")
while True:
data, addr = udp_server.recvfrom(1024)
print(f"{addr}: {data.decode()}")
udp_server.sendto(b"UDP OK", addr)
2. UDP 客户端
python
运行
import socket
udp_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_client.sendto(b"Hello UDP", ('127.0.0.1', 9999))
data, addr = udp_client.recvfrom(1024)
print(data.decode())
udp_client.close()
四、HTTP 编程(常用)
1. requests(第三方,最常用)
bash
运行
pip install requests
python
运行
import requests
# GET
r = requests.get("https://httpbin.org/get")
print(r.status_code)
print(r.json())
# POST
r = requests.post("https://httpbin.org/post", data={"key": "val"})
2. http.server(内置简易服务器)
python
运行
from http.server import HTTPServer, BaseHTTPRequestHandler
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
self.wfile.write(b"<h1>Hello Python HTTP</h1>")
server = HTTPServer(('127.0.0.1', 8000), Handler)
server.serve_forever()
五、异步网络(asyncio)
高并发场景(单线程处理多连接)
python
运行
import asyncio
async def handle(reader, writer):
data = await reader.read(100)
addr = writer.get_extra_info('peername')
print(f"{addr}: {data.decode()}")
writer.write(b"Async: " + data)
await writer.drain()
writer.close()
async def main():
server = await asyncio.start_server(handle, '127.0.0.1', 7777)
await server.serve_forever()
asyncio.run(main())
六、常见问题与技巧
1. TCP 粘包 / 拆包
- 原因:TCP 是字节流,无消息边界
- 解决:
- 固定长度
- 分隔符(如 \n)
- 消息头 + 长度
2. 端口占用
bash
运行
# Windows
netstat -ano | findstr :8888
# Linux/macOS
lsof -i :8888
3. 阻塞与非阻塞
python
运行
sock.setblocking(False) # 非阻塞
4. 常用库
- socket:底层 TCP/UDP
- requests:HTTP 客户端
- aiohttp:异步 HTTP
- websockets:WebSocket
- scrapy:爬虫框架
七、学习路线
- 掌握 TCP/UDP socket 基础
- 熟练 requests/http
- 学习 asyncio 异步
- 实战:聊天服务器、文件传输、API 客户端