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

如何使用异步定时器解决Python Socket服务端挂起问题

Python Socket服务端超时重连实现

针对Android客户端后台失联导致服务端挂起的问题,直接用异步定时器+超时断开重连的方案实现,以下是可运行的Python代码:

import socket
import threading

# 全局变量:控制定时器与客户端连接
timer = None
client_socket = None
TIMEOUT_SECONDS = 60

def reset_timer():
    """重置超时定时器"""
    global timer
    if timer is not None:
        timer.cancel()
    # 重新启动60秒定时器,超时后执行断开逻辑
    timer = threading.Timer(TIMEOUT_SECONDS, handle_timeout)
    timer.start()

def handle_timeout():
    """超时处理:发送终止消息并重启监听"""
    global client_socket
    try:
        if client_socket:
            client_socket.sendall(b"TerminatingMessage")
            client_socket.close()
            print("客户端超时,已终止连接")
    except Exception as e:
        print(f"超时处理异常: {e}")
    finally:
        client_socket = None
        OpenSocket()

def OpenSocket():
    """启动Socket服务端,等待客户端连接"""
    global client_socket
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    # 绑定本地IP和端口,根据实际情况修改
    server_socket.bind(("0.0.0.0", 12345))
    server_socket.listen(1)
    print("等待客户端连接...")
    
    try:
        client_socket, addr = server_socket.accept()
        print(f"客户端 {addr} 已连接")
        server_socket.close()  # 关闭监听socket,专注处理当前连接
        
        # 通信循环
        while True:
            # 发送业务消息,替换成你的实际内容
            message = b"Hello from server"
            client_socket.sendall(message)
            print("已发送消息给客户端")
            
            # 启动/重置超时定时器
            reset_timer()
            
            # 接收客户端回复
            try:
                recv_data = client_socket.recv(1024)
                if not recv_data:
                    print("客户端主动断开连接")
                    break
                
                # 处理收到的消息,添加你的业务逻辑
                print(f"收到客户端消息: {recv_data.decode('utf-8')}")
                
            except Exception as e:
                print(f"接收消息异常: {e}")
                break
            
    except Exception as e:
        print(f"服务端异常: {e}")
    finally:
        if client_socket:
            client_socket.close()
        # 重启监听
        OpenSocket()

if __name__ == "__main__":
    OpenSocket()

关键逻辑说明

  • 定时器重置:每次发送消息后调用reset_timer(),刷新60秒超时窗口;收到客户端回复时也会重置定时器,确保连接存活。
  • 超时断开:60秒未收到回复时,自动发送终止消息、关闭当前连接,然后重启服务端监听新连接。
  • 异常防护:捕获客户端主动断开、通信异常等场景,避免服务端崩溃。

使用注意

  1. 修改绑定的IP和端口为你实际使用的配置。
  2. 替换发送的消息内容为你的业务数据。
  3. 在消息处理区域添加对应的业务逻辑。

内容的提问来源于stack exchange,提问作者user1530405

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:35:18