Python 网络编程入门:从 Socket 底层到 HTTP 并发实战

摘要

网络编程是 Python 后端、爬虫、即时通讯开发的核心基础。很多初学者直接上手 requests、httpx,却不懂底层 Socket 通信原理,遇到粘包、连接超时、并发阻塞等问题无从排查。本文由浅入深,从 Socket 套接字、TCP/UDP 协议差异讲起,搭配可直接运行 TCP 回声服务、UDP 消息收发、多线程聊天室、同步 / 异步 HTTP 客户端完整源码,最后配套阶梯式实战练习,零基础也能跟着敲代码落地,适合 Python 新手、爬虫入门、后端开发阅读。 关键词:Python 网络编程、Socket、TCP、UDP、requests、httpx、异步 HTTP、聊天室、网络实战

一、前言:为什么一定要学网络编程?

日常开发中所有联网程序底层都离不开网络通信:微信聊天、网页加载、游戏实时同步、API 接口请求、爬虫采集,全部基于网络编程实现。

不少学习者存在误区:只调用第三方 HTTP 库,跳过 Socket 底层,一旦出现网络异常、接口并发卡顿、数据丢包问题,完全无法定位根源。

本文学习路线:底层 Socket 通信 → TCP/UDP 协议对比 → 上层同步 / 异步 HTTP 客户端 → 4 套完整可运行实战项目 → 分层课后练习。 学习目标:

  1. 理解客户端 / 服务器通信模型,掌握 socket 模块全套 API;
  2. 分清 TCP 可靠传输、UDP 高速传输适用场景;
  3. 熟练使用 requests 同步、httpx 异步发送网络请求;
  4. 独立实现多用户聊天室、文件传输、批量 API 采集工具。

二、网络通信基石:Socket 套接字

Socket 是操作系统提供的网络通信抽象接口,相当于两台设备通话的 "通信插座",Python 内置socket模块,无需额外安装即可使用。

2.1 Socket 核心参数说明

python

运行

复制代码
import socket
# 地址族:AF_INET代表IPv4,AF_INET6代表IPv6
# 套接字类型:SOCK_STREAM=TCP,SOCK_DGRAM=UDP
# 创建TCP套接字
tcp_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 创建UDP套接字
udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

2.2 C/S 客户端服务器通用流程

TCP 通信完整步骤

表格

操作步骤 服务器端 客户端
1 创建 socket 对象 创建 socket 对象
2 bind 绑定 IP + 端口
3 listen 开启监听
4 accept 阻塞等待连接 connect 连接服务端地址
5 recv/send 收发数据 recv/send 收发数据
6 close 关闭连接 close 关闭连接
UDP 通信特点

无连接协议,不需要 connect、listen、accept,直接通过sendto发送、recvfrom接收,同时获取对方地址。

2.3 Socket 高频方法速查

python

运行

复制代码
# 服务端专用
sock.bind((host, port))   # 绑定地址端口
sock.listen(num)          # 设置最大等待连接数
client_sock, addr = sock.accept() # 接收客户端连接

# 客户端专用
sock.connect((host, port)) # 发起TCP连接

# 通用收发
data = sock.recv(buffer_size)
sock.send(data)
sock.close()

# UDP专用
data, addr = sock.recvfrom(1024)
sock.sendto(data, (host, port))

三、TCP 与 UDP 核心差异对比

两种传输协议适用场景完全不同,核心区分:TCP 追求可靠,UDP 追求速度。

3.1 TCP(面向连接、可靠传输)

  1. 通信前三次握手建立连接,断开四次挥手;
  2. 数据有序、不重复、不丢失,自带流量 / 拥塞控制;
  3. 头部开销大,传输效率偏低; 适用场景:文件传输、网页访问、聊天软件、接口请求、邮件。

3.2 UDP(无连接、高速传输)

  1. 无需建立连接,直接发包;
  2. 无重传校验,可能丢包、乱序;
  3. 头部极简,延迟极低; 适用场景:视频会议、直播、网络游戏、DNS 域名查询。

3.3 直观对比表

表格

特性 TCP UDP
连接模式 面向连接 无连接
数据可靠性 有序不丢包 可能丢包乱序
传输效率 较低 极高
头部占用 20 字节 + 仅 8 字节
典型场景 爬虫、文件、聊天室 直播、游戏、语音通话

四、上层网络工具:HTTP 客户端全解

Socket 是底层,日常 Web 交互使用封装好的 HTTP 库,主流分为同步 requests、异步 httpx 两大阵营。

4.1 主流库选型对比

表格

同步 / 异步 HTTP2 支持 优势 适用场景
requests 同步 不支持 简单易上手,文档丰富 脚本、单次接口请求
httpx 同步 + 异步 支持 类型提示、并发友好 高并发爬虫、异步服务
urllib 同步标准库 不支持 无需安装 无第三方权限环境
aiohttp 纯异步 部分支持 WebSocket 完善 实时长连接服务

4.2 requests 同步请求实战

覆盖 GET、POST、请求头、会话保持、异常捕获完整示例:

python

运行

复制代码
import requests

headers = {
    "User-Agent": "Python-Network-Demo/1.0"
}
# GET带参数
params = {"q": "python网络编程", "page": 1}
res = requests.get("https://jsonplaceholder.typicode.com/posts", params=params, headers=headers, timeout=5)
print(res.status_code)
print(res.json())

# POST提交JSON
payload = {"username": "test", "pwd": "123456"}
res_post = requests.post("https://httpbin.org/post", json=payload)

# Session保持Cookie会话
session = requests.Session()
session.headers.update(headers)
session.get("https://jsonplaceholder.typicode.com/users")

4.3 httpx 异步并发请求

高并发场景首选,支持同时批量请求多个接口:

python

运行

复制代码
import httpx
import asyncio

async def batch_request():
    urls = [
        "https://jsonplaceholder.typicode.com/posts/1",
        "https://jsonplaceholder.typicode.com/posts/2"
    ]
    async with httpx.AsyncClient() as client:
        tasks = [client.get(url) for url in urls]
        responses = await asyncio.gather(*tasks)
        for resp in responses:
            print(f"状态码:{resp.status_code}")

asyncio.run(batch_request())

五、四大完整实战项目(可直接复制运行)

项目 1:TCP 回声服务器 & 客户端

客户端发送任意文本,服务器原样返回,入门第一个通信 Demo。

服务端 tcp_echo_server.py

python

运行

复制代码
import socket

def run_server(host="127.0.0.1", port=8888):
    server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server_sock.bind((host, port))
    server_sock.listen(5)
    print(f"TCP回声服务启动 {host}:{port}")
    while True:
        client, addr = server_sock.accept()
        print(f"客户端接入 {addr}")
        while True:
            data = client.recv(1024)
            if not data:
                break
            msg = data.decode("utf-8")
            print(f"收到消息:{msg}")
            client.sendall(data)
        client.close()

if __name__ == "__main__":
    run_server()
客户端 tcp_echo_client.py

python

运行

复制代码
import socket

def run_client(host="127.0.0.1", port=8888):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((host, port))
    while True:
        text = input("输入消息,exit退出:")
        if text == "exit":
            break
        sock.sendall(text.encode("utf-8"))
        resp = sock.recv(1024)
        print("服务端回传:", resp.decode("utf-8"))
    sock.close()

if __name__ == "__main__":
    run_client()

项目 2:UDP 消息收发工具

无连接通信演示,适合理解直播、游戏底层发包逻辑。

UDP 接收服务端

python

运行

复制代码
import socket

def udp_receiver(port=9999):
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.bind(("127.0.0.1", port))
    print("UDP接收端启动")
    while True:
        data, addr = sock.recvfrom(1024)
        msg = data.decode("utf-8")
        print(f"来自{addr}:{msg}")
        ack = f"已收到:{msg[:10]}"
        sock.sendto(ack.encode("utf-8"), addr)

if __name__ == "__main__":
    udp_receiver()
UDP 发送客户端

python

运行

复制代码
import socket

def udp_sender(host="127.0.0.1", port=9999):
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    while True:
        text = input("发送UDP消息:")
        if text == "exit":
            break
        sock.sendto(text.encode("utf-8"), (host, port))
    sock.close()

if __name__ == "__main__":
    udp_sender()

项目 3:多线程 TCP 聊天室

支持多人同时在线、改名、查看在线用户、全员广播,小型即时通讯 Demo。 完整服务端 + 客户端代码篇幅较长,核心逻辑:

  1. 服务端多线程处理每一个客户端连接;
  2. 全局字典存储所有在线用户 socket 与昵称;
  3. 封装广播函数,消息推送给全部在线客户端;
  4. 内置指令/users查看在线列表、/name修改昵称、/exit下线。

项目 4:多功能 HTTP 采集工具

整合 requests 同步单条采集、httpx 异步批量请求,自动打印接口状态、解析 JSON 数据,可作为爬虫基础模板。

六、阶梯式课后练习(由浅入深巩固)

初级练习

  1. TCP 时间服务器:客户端连接后自动返回当前格式化时间;
  2. UDP 消息计数器:统计接收消息条数并回复序号。

中级练习

  1. TCP 文件传输工具:客户端上传本地文件至服务端保存,支持分块传输;
  2. API 数据统计工具:采集 JSONPlaceholder 接口,统计每个用户帖子、评论数量并导出 CSV。

高级实战项目

  1. 增强版聊天室:新增私聊、文件发送、在线状态、管理员踢人功能;
  2. HTTP 缓存代理服务器:转发网页请求,缓存静态资源、过滤敏感关键字;
  3. 服务器资源监控系统:客户端实时获取服务端 CPU、内存占用数据。

七、全文总结

  1. Socket 是所有网络通信底层基础,TCP 可靠、UDP 高速按需选择;
  2. 简单脚本使用 requests 同步接口,高并发场景优先 httpx 异步;
  3. 客户端 / 服务器模型是所有联网程序通用架构;
  4. 学习路径:底层 Socket 通信 → 协议原理 → HTTP 封装库 → 完整网络项目开发。

掌握本篇内容后,可无缝过渡爬虫开发、后端接口、即时通讯服务、并发编程学习。下一篇将讲解 Python 多线程、协程并发,解决网络请求阻塞问题。

相关推荐
玉鸯1 小时前
多 Agent 并行时如何保证状态一致性?
分布式·python·agent
aGdF8E3gQ2 小时前
【Application Insights】采样率对Function App日志收集的影响和解决方法
python·flask·wpf
ATMQuant2 小时前
以AI量化为生:25.vnpy 4.4升级实战 - 魔改版框架如何安全跟进上游
人工智能·python·量化交易·vnpy
卷无止境3 小时前
拯救乱码方块:pandas 绘图中文字体的一揽子解决方案
后端·python
李昊哲小课3 小时前
fastapi sse websocket 智能家居实时控制台
python·websocket·智能家居·fastapi·sse
杰佛史彦明 本王是暴君3 小时前
PyTorch KernelAgent 源码解读 ---(2)--- 总体流程
人工智能·pytorch·python
Zane19943 小时前
别再手写 try/finally 了:一文讲透 with 语句背后的上下文管理器协议
后端·python
李可以量化4 小时前
量化高性能服务框架 Tornado 全面解析(上):异步非阻塞的核心能力与场景落地
大数据·python·量化交易·tornado·qmt·ptrade
内蒙深海大鲨鱼4 小时前
3.Introduction to PyTorch YouTube Series--Autograd
人工智能·pytorch·python