Python Socket 网络编程入门与实战指南

桃夭
桃夭
发布时间:2026-10-12 | 2人浏览过
原创

本文详解 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 网络通信技术的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表