如何实现每隔固定时间通过Socket无限循环向服务端发送数据
Socket循环发送数据问题修复方案
问题根因
- 冗余socket初始化:连续两次创建socket对象,覆盖了第一次的正确配置,可能引发未知连接异常
- recv阻塞卡住流程:默认socket的
recv()方法为阻塞模式,只要服务端没有返回响应,代码会永久停在该调用位置,无法进入下一轮循环,这是只能发送一次数据的核心原因 - 休眠时长不符合要求:现有循环内总休眠时长仅为6秒,达不到2分钟发送一次的需求
- 无异常重连逻辑:未处理连接断开、发送失败等异常场景,一旦网络波动程序会直接终止
修复后代码
import socket import time port = 8000 # 按实际情况修改为服务端真实IP ip = "127.0.0.1" # 封装socket初始化逻辑,异常时可直接调用重连 def init_socket(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 设置recv调用超时时间为5秒,避免永久阻塞 s.settimeout(5) s.connect((ip, port)) return s s = init_socket() print('连接到服务端', ip, '端口', port) while True: try: ph = phsensor() start_counter = 1 time.sleep(1) start_counter = 0 caudal = (count * 60 * 2.25 / 1000) print("流量为: %.3f 升/分钟" % (caudal)) count = 0 time.sleep(5) if caudal < 1: print("进水不足") led1.value(1) else: led1.value(0) if caudal > 2: print("水循环正常") data = ';'.join([str(caudal), str(ph)]).encode('utf-8') s.send(data) # 接收服务端响应,超时会抛出异常进入重连逻辑 dataFromServer = s.recv(1024) # 剩余休眠114秒,加上前面的6秒逻辑等待,总间隔刚好为2分钟 time.sleep(114) except (socket.timeout, ConnectionError, BrokenPipeError) as e: print("连接异常,正在重连:", str(e)) # 关闭异常旧连接,重建新连接 s.close() s = init_socket()
关键修改说明
- 新增
socket.settimeout(5)给recv调用设置5秒超时,避免永久阻塞卡死循环 - 封装socket初始化逻辑,连接异常时自动重连,保证程序持续运行
- 调整休眠时长,总发送间隔刚好为2分钟
- 移除冗余的重复socket创建代码,保留正确的TCP socket初始化配置
- 捕获常见的连接异常,不会因单次网络波动直接终止程序
内容的提问来源于stack exchange,提问作者Octavio Bottari
相关产品推荐
相关产品推荐

