You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现每隔固定时间通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 12:45:01