Python网络编程

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:爬虫框架

七、学习路线

  1. 掌握 TCP/UDP socket 基础
  2. 熟练 requests/http
  3. 学习 asyncio 异步
  4. 实战:聊天服务器、文件传输、API 客户端
相关推荐
必须会一定会1 小时前
Agent Plugins 1.0实战:plugin.json、skills、mcp.json目录结构与迁移
开发语言·人工智能·ai编程
St_rive1 小时前
Page Object设计模式
java·开发语言·设计模式
CTA量化套保1 小时前
近期零基础量化学习:先分阶段,再用 AI 检查缺口
人工智能·python
wp123_11 小时前
硬件元器件笔记|IPX8 防水 Type‑C 母座安费诺 124018802112A 与 TONEVEE TY48086‑24A 分析
c语言·开发语言·笔记
wuyk5551 小时前
4.树:一对多的层次数据结构
开发语言·数据结构·stm32·单片机
清水白石0082 小时前
Python 死锁排查全攻略:从线程卡死到锁依赖定位与工程化修复
linux·网络·python
Elias不吃糖2 小时前
Langfuse 入门:Trace、Prompt、Dataset、Experiment、Evaluator
前端·python·prompt·langfuse
luj_17682 小时前
桥牌思维启示:系统设计的模块化架构
c语言·开发语言·c++·经验分享·算法
TechWayfarer3 小时前
批量查IP归属地,在线API、脚本、离线库怎么选?三种方案实测对比
网络·python·网络协议·tcp/ip