Skip to content

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 可以准确生成。

但以下部分需要人工理解:

  1. TCP 协议机制:三次握手、四次挥手、粘包问题——这些是协议层面的概念,不是代码层面的语法。AI 能描述它们,但人在遇到实际网络问题时需要自己分析协议交互过程。
  2. 阻塞与非阻塞socket.recv() 默认是阻塞的,这意味着线程卡住——这是很多首次写网络程序的人遇到的第一个"为什么程序不动了"的场景。
  3. HTTP 协议状态码和请求方法:虽然 AI 列出了所有状态码,但人在调试 API 时需要一个一个地理解状态码的含义。

👤 人工干预率:20% | 人类重点关注

为什么需要人工干预:

  1. 理解客户端-服务器交互模型:服务端先启动监听,客户端再发起连接——这个最基本的时间序很多人第一次接触时会弄反
  2. TCP vs UDP 的选型:用 TCP 还是 UDP 取决于你对"可靠性"和"实时性"的权衡,这不是语法层面的问题
  3. HTTP 协议请求/响应的结构:后续所有 Web 开发都基于 HTTP,理解它的结构至关重要

人类与 AI 协作建议:

  1. 先让 AI 生成 UDP 版的"聊天程序",跑通后改成 TCP 版,对比区别
  2. 让 AI 生成服务端代码,你负责用浏览器或 curl 测试
  3. 重点关注下方的 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 状态码速查

状态码含义说明
200OK请求成功
201Created资源创建成功(POST)
204No Content删除成功,无返回体
301Moved Permanently资源永久重定向
302Found资源临时重定向
400Bad Request客户端请求错误
401Unauthorized未认证
403Forbidden无权限
404Not Found资源不存在
500Internal Server Error服务器内部错误
502Bad Gateway网关错误
503Service 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']}")

OPC 超级个体实战指南