13 网络编程
📋 资料说明
- 来源:课程 day12
- 笔记:
尚硅谷大模型技术之Python1.0.docx第 14 章 - 每日一考:
day12_每日一考.md - 视频:❌ 跳过(共 16 个视频:IP → 端口 → UDP → TCP → HTTP → requests → starlette 构建 Web 服务)
🟢 🤖 AI 替代率:80%
为什么是这个水平:
UDP/TCP 客户端的代码模式是固定的(socket → bind/connect → send/recv → close),AI 可以准确生成。
但以下部分需要人工理解:
- TCP 协议机制:三次握手、四次挥手、粘包问题——这些是协议层面的概念,不是代码层面的语法。AI 能描述它们,但人在遇到实际网络问题时需要自己分析协议交互过程。
- 阻塞与非阻塞:
socket.recv()默认是阻塞的,这意味着线程卡住——这是很多首次写网络程序的人遇到的第一个"为什么程序不动了"的场景。 - HTTP 协议状态码和请求方法:虽然 AI 列出了所有状态码,但人在调试 API 时需要一个一个地理解状态码的含义。
👤 人工干预率:20% | 人类重点关注
为什么需要人工干预:
- 理解客户端-服务器交互模型:服务端先启动监听,客户端再发起连接——这个最基本的时间序很多人第一次接触时会弄反
- TCP vs UDP 的选型:用 TCP 还是 UDP 取决于你对"可靠性"和"实时性"的权衡,这不是语法层面的问题
- HTTP 协议请求/响应的结构:后续所有 Web 开发都基于 HTTP,理解它的结构至关重要
人类与 AI 协作建议:
- 先让 AI 生成 UDP 版的"聊天程序",跑通后改成 TCP 版,对比区别
- 让 AI 生成服务端代码,你负责用浏览器或
curl测试 - 重点关注下方的 HTTP 状态码速查表——这你会在所有 Web 项目中反复用到
1. 网络基础概念
| 概念 | 说明 | 类比 |
|---|---|---|
| IP 地址 | 网络中的设备标识 | 家庭地址 |
| 端口 | 设备上的程序标识 | 房间号 |
| 协议 | 通信规则 | 交流用的语言 |
| Socket | 通信的端点抽象 | 电话机 |
2. UDP 编程
UDP 是无连接、不可靠的传输协议,速度快但可能丢包。
UDP 服务器端
python
import socket
# 创建 UDP Socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定地址和端口
server_socket.bind(("127.0.0.1", 8888))
print("UDP 服务器启动,等待数据...")
# 接收数据
data, client_addr = server_socket.recvfrom(1024) # 1024 是缓冲区大小
print(f"收到来自 {client_addr} 的消息: {data.decode()}")
# 回复
server_socket.sendto(f"已收到: {data.decode()}".encode(), client_addr)
server_socket.close()UDP 客户端
python
import socket
# 创建 UDP Socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 发送数据
message = "Hello Server!"
client_socket.sendto(message.encode(), ("127.0.0.1", 8888))
# 接收回复
data, server_addr = client_socket.recvfrom(1024)
print(f"来自服务器的回复: {data.decode()}")
client_socket.close()3. TCP 编程
TCP 是面向连接、可靠的传输协议,保证数据按序到达。
TCP 服务器端
python
import socket
# 创建 TCP Socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定
server_socket.bind(("127.0.0.1", 8888))
# 监听(参数是最大等待连接数)
server_socket.listen(5)
print("TCP 服务器启动,等待连接...")
# 接收连接(会阻塞直到有客户端连接)
client_socket, client_addr = server_socket.accept()
print(f"客户端 {client_addr} 已连接")
# 接收数据
data = client_socket.recv(1024)
print(f"收到: {data.decode()}")
# 发送回复
client_socket.send(f"已收到: {data.decode()}".encode())
# 关闭
client_socket.close()
server_socket.close()TCP 客户端
python
import socket
# 创建 TCP Socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接到服务器
client_socket.connect(("127.0.0.1", 8888))
# 发送数据
client_socket.send("Hello Server!".encode())
# 接收回复
data = client_socket.recv(1024)
print(f"来自服务器的回复: {data.decode()}")
client_socket.close()TCP 多线程服务器(处理多个客户端)
python
import socket
import threading
def handle_client(client_socket, addr):
print(f"新连接: {addr}")
while True:
data = client_socket.recv(1024)
if not data:
break
print(f"{addr}: {data.decode()}")
client_socket.send(f"已收到: {data.decode()}".encode())
client_socket.close()
print(f"{addr} 已断开")
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("0.0.0.0", 8888))
server.listen(5)
while True:
client, addr = server.accept()
thread = threading.Thread(target=handle_client, args=(client, addr))
thread.start()4. HTTP 编程
requests 库调用 Web API
python
import requests
# GET 请求
response = requests.get("https://api.github.com")
print(response.status_code) # 200
print(response.json()) # JSON 格式响应
# 带参数
response = requests.get("https://api.github.com/search/repositories",
params={"q": "python", "sort": "stars"})
# POST 请求
response = requests.post("https://httpbin.org/post",
json={"name": "Alice", "age": 25})
print(response.json())
# 常用方法
# requests.get(url, params=...) # 查询参数
# requests.post(url, json=...) # JSON 请求体
# requests.put(url, data=...) # 更新
# requests.delete(url) # 删除
# requests.head(url) # 仅获取响应头HTTP 状态码速查
| 状态码 | 含义 | 说明 |
|---|---|---|
| 200 | OK | 请求成功 |
| 201 | Created | 资源创建成功(POST) |
| 204 | No Content | 删除成功,无返回体 |
| 301 | Moved Permanently | 资源永久重定向 |
| 302 | Found | 资源临时重定向 |
| 400 | Bad Request | 客户端请求错误 |
| 401 | Unauthorized | 未认证 |
| 403 | Forbidden | 无权限 |
| 404 | Not Found | 资源不存在 |
| 500 | Internal Server Error | 服务器内部错误 |
| 502 | Bad Gateway | 网关错误 |
| 503 | Service Unavailable | 服务暂时不可用 |
5. 练习题
练习 1:UDP 聊天
编写一个 UDP 服务器端,能接收客户端消息并回复随机消息。
练习 2:TCP 数据查询
客户端发送自己的名字给服务器,服务器回复"你好,{名字}"。
练习 3:API 调用
使用 requests 调用一言 API(https://v1.hitokoto.cn/)获取一句名言。
参考答案
练习 1:
python
# 服务器端
import socket, random
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(("0.0.0.0", 8888))
msgs = ["你好", "今天是好天气", "加油!", "晚安"]
while True:
data, addr = server.recvfrom(1024)
reply = random.choice(msgs)
server.sendto(reply.encode(), addr)练习 2:
python
# 服务器端
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("0.0.0.0", 8888))
server.listen(5)
while True:
client, addr = server.accept()
name = client.recv(1024).decode()
client.send(f"你好, {name}".encode())
client.close()练习 3:
python
import requests
response = requests.get("https://v1.hitokoto.cn/")
data = response.json()
print(f"{data['hitokoto']} — {data['from']}")