Python Socket通信基础与服务端客户端实现指南
本文详细解析基于 Python 的 Socket 套接字通信机制,涵盖地址族与连接类型配置,提供完整的服务端监听与客户端连接代码示例,帮助开发者快速掌握底层网络交互、数据收发编码及连接管理的标准操作流程。
Python Socket 核心参数与对象初始化
Socket(套接字)提供底层的网络服务,主要依赖 IP 协议进行数据端点传输。在进行通信前,需先实例化 socket 对象。其构造函数 socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) 包含以下关键配置:
- family(地址族):决定使用的网络层协议。常用选项包括
AF_INET(IPv4)、AF_INET6(IPv6)及AF_UNIX(本地进程间通信)。 - type(传输类型):定义数据传输特征。
SOCK_STREAM为流式套接字,强调传输有序且安全(基于 TCP);SOCK_DGRAM为数据报套接字,追求高速但无顺序保证且可能丢包(基于 UDP)。 - proto(协议号):通常为 0。若使用 CAN 总线相关族,则需指定如
CAN_RAW等特定协议。

多数模块提供的 get 与 set 命名函数,前者用于提取当前状态,后者用于覆盖配置,两者输入输出通常保持一致。掌握这些基础参数后,即可进入具体的双向通信搭建环节。
搭建 Socket 双向通信的操作步骤
完整的网络通信依赖于“服务端”与“客户端”的配合。以下是使用原生库实现局域网内数据互通的具体路径。
第 1 步:编写 Socket 服务端脚本
目的:建立网络监听节点,等待设备接入并处理请求。
入口:新建 .py 文件并在终端执行。
动作:
1. 导入库并调用 socket.gethostname() 获取本机 IP 地址。
2. 选定端口号(如 12345),利用 s.bind((host, port)) 将套接字锁定在该地址上。
3. 调用 s.listen(3) 开启阻塞监听,设置积压队列上限。
4. 在循环中调用 s.accept() 挂起进程直至收到连接,返回新的会话对象 c 与客户端元组 addr。
import socket
s = socket.socket()
host = socket.gethostname() # 自动识别本机地址
port = 12345 # 设定通信端口
s.bind((host, port)) # 绑定地址与端口
s.listen(3) # 启动监听,维持3个排队连接
while True:
c, addr = s.accept() # 阻塞等待,接收新连接
print("Linked @ Addr", addr)
# 循环接收并回传数据
while True:
data = input("input data:")
# 发送需转为二进制字节流
c.send(data.encode("utf-8"))
if data == "exit":
c.close() # 正常断开该客户端连接
break
第 2 步:编写 Socket 客户端脚本
目的:主动向服务端发起握手,交换实时信息。
入口:新建独立 .py 文件。
动作:
1. 构造相同架构的 Socket 对象。
2. 使用 s.connect((host, port)) 指向服务端地址,握手成功后进入数据通道。
3. 在循环内调用 s.recv(1024) 接收缓存区字节,通过 .decode("utf-8") 还原字符串并打印。
import socket
s = socket.socket()
host = socket.gethostname()
port = 12345
s.connect((host, port)) # 连接至同机服务端
while True:
raw_data = s.recv(1024).decode("utf-8")
if raw_data:
print("receive data:", raw_data)
# 判定退出信号并清理资源
if raw_data.startswith("exit"):
s.close()
break
第 3 步:执行测试与结果验证
操作顺序:务必保持时序严谨。首先在终端运行服务端代码,程序将停留在 accept 处处于空闲监听状态;随后打开第二个终端窗口运行客户端脚本。
完成判断:客户端执行瞬间,服务端控制台会立刻刷新出 Linked @ Addr 提示(包含对方 IP 与随机高位端口)。此时在服务端交互框输入文本回车,客户端便会同步打印出接收到的字符流。双方任意一端键入 exit 均可触发断连退出循环。
# 服务端实际运行表现
Linked @ Addr ('192.168.1.113', 9953)
input data:hello world
input data:who are you
input data:can u speak chinese?
input data:exit
# 客户端实际运行表现
receive data: hello world
receive data: who are you
receive data: can u speak chinese?
receive data: exit
核心控制函数与连接生命周期管理
除基础的建连发信外,针对复杂网络场景需精确控制链路状态。服务端专属职责集中在 bind()(绑址)、listen(N)(监听排队,N ≥ 0)以及 accept()(拆包返回新句柄)。客户端则依赖 connect() 建立握手,若需捕获异常而非抛出崩溃,应切换使用 connect_ex() 获取错误码。
数据流转方面,send(bytes) 为非阻塞发送,返回实际写入字节数(可能小于请求长度);若需确保整段载荷落盘,请改用 sendall()。sendfile() 仅限 Unix 系统直传文件句柄,Windows 环境下行为等同于普通 send。sendto() 则为面向无连接的广播发送指定。
接收端在不同 OS 存在差异化支持。在 Windows 平台上,可通过 recv(bufsize) 获取纯数据体,或使用 recvfrom(bufsize) 同时抓取载荷与源头地址。若内存映射需求较高,可使用 recv_into() 系列函数直接将字节填入预分配缓冲区。
当交互结束或遭遇突发网络故障时,切勿简单终止进程。正确的资源释放顺序如下:
close():彻底关闭文件描述符并回收内核资源。detach():剥离对象控制权但不切断底层 fd,适用于特殊句柄继承。shutdown(how):实施半开半关策略。SHUT_RD拒绝后续读入,SHUT_WR阻断后续写入,SHUT_RDWR双向切断通道。
以上就是 Python 套接字 Socket 通信与对象控制的详细内容,更多关于 Python 网络编程实操的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













