Python Socket 网络编程入门与实战指南
本文详解 Python 底层网络编程库 socket 的标准操作序列。从创建 TCP 套接字、配置主机端口,到完整实现客户端的数据收发与服务端的监听响应,涵盖 Python 3 中字符串与字节流的版本差异处理,以及标准异常捕获机制,帮助开发者快速掌握局域网或互联网通信的基础实现。
Python Socket 网络编程核心流程
第1步:创建并绑定网络套接字
Python 的网络功能封装在内置的 socket 模块中。首先导入该模块,并使用 socket.socket() 构造函数初始化对象。默认参数为 IPv4 (AF_INET) 和 TCP 流式协议 (SOCK_STREAM),因此直接调用即可创建 TCP 套接字。
import socket
# 创建 TCP socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
第2步:建立连接与传输数据
使用 connect() 方法连接到目标服务器。支持域名解析或直接传递 IP 地址与端口元组:
s.connect(('localhost', 8000))
# 或 s.connect(('www.example.com', 80))
数据传输分为发送与接收。发送可使用 send() 或 sendall()。send() 仅尝试发送部分数据并返回实际长度,需循环直到全部发出;sendall() 内部自动循环,直至所有字节发送完毕或发生错误。特别注意:Python 3 要求原始套接字传输必须是字节类型(bytes)。在旧版环境中原生字符串可直接发送,但 Python 3 会抛出 TypeError。务必在字符串前加 b 前缀(如 b'hello')或使用 .encode() 转换。
# 正确发送字节数据
s.sendall(b'data to send')
接收数据使用 recv(bufsize),返回值同样为 bytes。网络分包可能导致单次调用无法读满指定长度,需循环拼接:
def recv_all(sock, expected_bytes):
chunks = []
bytes_recd = 0
while bytes_recd < expected_bytes:
chunk = sock.recv(min(expected_bytes - bytes_recd, 2048))
if not chunk:
raise RuntimeError('socket connection broken')
chunks.append(chunk)
bytes_recd += len(chunk)
return b''.join(chunks)
第3步:构建回声服务端与客户端
服务端遵循标准监听流程:创建实例 → 绑定地址端口 → 设置监听队列 → 阻塞接受连接 → 循环处理收发 → 关闭连接。
# server.py
import socket
HOST = '' # 绑定所有可用网卡
PORT = 10022 # 监听端口
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(5) # 等待队列长度
print(f'Server listening on {PORT}...')
while True:
conn, addr = s.accept()
with conn:
print(f'Connected by {addr}')
while True:
data = conn.recv(1024)
if not data:
break
conn.sendall(data) # 原样回传
对应客户端只需发起连接,发送指令并读取响应后安全退出:
# client.py
import socket
HOST = 'localhost'
PORT = 10022
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall(b'Hello Socket Server!')
data = s.recv(1024)
print(f'Received: {data.decode("utf-8")}') # bytes 转回字符串显示
第4步:规范释放资源与异常捕获
虽然 Python 垃圾回收会在对象销毁时自动触发 close(),但强烈建议在网络编程中使用 try...finally 或上下文管理器(with 语句)主动关闭连接,防止文件描述符泄漏导致端口占用。网络操作中常见异常包括:
OSError/socket.error:底层系统错误(如连接拒绝、无权限)ConnectionResetError:对端强制断开连接socket.timeout:读写操作超时socket.gaierror:DNS 解析失败
常见问题与注意事项
在实际部署中,服务端绑定空字符串('')代表监听本机所有 IPv4 接口,便于跨设备访问。测试时请确保防火墙已放行对应端口。若遇到 Address already in use 错误,可在 bind 前设置 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 允许端口快速重用。
总结
掌握 Python socket 模块的核心在于理解面向字节流的基础网络模型,严格区分字符编码与字节边界,并养成主动释放句柄的习惯。以上就是 Python Socket 网络编程基础教程的详细讲解,更多关于 Python 网络通信技术的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













