Python3 网络编程

网络编程让不同进程甚至不同机器交换数据。Python 标准库 socket 直接封装了操作系统的网络接口,聊天室、文件传输、自定义协议服务端等底层网络应用都从它开始。

网络基础:IP、端口与 TCP/UDP

概念说明
IP 地址标识一台主机,如 127.0.0.1(本机回环地址)
端口0~65535,标识主机上的某个服务,如 80、443
TCP面向连接、可靠,先建立连接再传数据(HTTP 基于它)
UDP无连接、不可靠但更快,适合视频通话、DNS 等

TCP 客户端:socket → connect → send → recv

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 创建 TCP 套接字
s.connect(("127.0.0.1", 8000))     # 连接本机 8000 端口
s.sendall("你好,服务器".encode())   # 发送数据
data = s.recv(1024)                # 接收最多 1024 字节
print(data.decode())               # 输出:你好,客户端
s.close()

流程四步:socket() 建套接字 → connect() 建立连接 → sendall/recv 收发数据 → close() 关闭。

TCP 服务端:socket → bind → listen → accept

服务端先启动监听,accept 阻塞等待客户端连入。下面的服务端与上面的客户端配合,形成一问一答的简单对话:

import socket

srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
srv.bind(("127.0.0.1", 8000))     # 绑定地址与端口
srv.listen(5)                     # 开始监听,最多 5 个连接排队
print("等待连接...")
conn, addr = srv.accept()         # 阻塞等待一个客户端连入
print("客户端地址:", addr)         # 输出:客户端地址: ('127.0.0.1', 端口)
msg = conn.recv(1024).decode()
print("收到:", msg)               # 输出:收到: 你好,服务器
conn.sendall("你好,客户端".encode())
conn.close()                      # 结束本次会话
srv.close()

运行方式:先在一个终端启动服务端,再另开终端运行客户端,即可看到双方消息;若想持续服务,把 accept 之后的部分放进 while True 循环即可。

UDP:无连接收发

import socket

udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # UDP 套接字
udp.sendto(b"ping", ("127.0.0.1", 9000))   # 无需连接,直接发送
data, addr = udp.recvfrom(1024)            # 接收并带上来源地址
print(addr, data)
# 输出:(('127.0.0.1', 9000), b'ping')  (需先有对端监听 9000 端口)

UDP 没有 connect/accept,只有 sendto/recvfrom;速度快但不保证送达与顺序。

常见异常处理

网络随时可能失败(对方未启动、超时、断线),关键位置要捕获异常:

import socket

s = None
try:
    s = socket.create_connection(("127.0.0.1", 8000), timeout=3)
    s.sendall(b"hi")
    print("连接成功")
except (socket.timeout, ConnectionRefusedError) as e:
    print("连接失败:", e)   # 输出:连接失败:...(服务端未启动时触发)
finally:
    if s:
        s.close()

小结:TCP 走 connect/bind/listen/accept 四步建立可靠连接,UDP 用 sendto/recvfrom 即发即收;收发数据注意编解码(encode/decode),并记得 close 与捕获异常。

笔记加载中…