python websockets,如何设置连接超时

Posted

技术标签:

【中文标题】python websockets,如何设置连接超时【英文标题】:python websockets, how to setup connect timeout 【发布时间】:2019-01-29 12:25:56 【问题描述】:

假设 WebSocket 服务器暂时关闭,它丢弃传入的数据包(而不是拒绝它们)

目前,连接尝试和TimeoutError之间大约需要 95 秒

我似乎找不到减小该窗口的方法(所以我可以尝试另一个 WebSocket 服务器)

这是我正在运行的演示代码:(刚刚取自official docs

#!/usr/bin/env python

import asyncio
import websockets
import os
import socket
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)-8s [%(name)s.%(funcName)s:%(lineno)d]: %(message)s', datefmt='%m-%d %H:%M:%S', )


host = os.environ.get('SERVER_URL','localhost:9090')
self_id = os.environ.get('SELF_ID',socket.gethostname())

connect_url =f'ws://host/self_id'
logging.info(f'Connect to: connect_url')

async def hello(uri):
    logging.info(f'Connecting to uri')
    async with websockets.connect(uri, timeout=1, close_timeout=1) as websocket:
        logging.info(f"Conected to uri")
        async for message in websocket:
            await websocket.send(message)

asyncio.get_event_loop().run_until_complete(
    hello(connect_url))

【问题讨论】:

【参考方案1】:

你可以像这样使用 asyncio 的 wait_for():

import asyncio
from concurrent.futures import TimeoutError as ConnectionTimeoutError
# whatever url is your websocket server
url = 'ws://localhost:9090'
# timeout in seconds
timeout = 10  
try:
    # make connection attempt
    connection = await asyncio.wait_for(websockets.connect(url), timeout)
except ConnectionTimeoutError as e:
    # handle error
    print('Error connecting.')

它会引发一个<class 'concurrent.futures._base.TimeoutError'> 异常,可以用except ConnectionTimeoutError 块捕获。

在 python3.8 中,它引发了一个 TimeoutError,可以用 except asyncio.exceptions.TimeoutError 块捕获。

【讨论】:

缺少import asyncio 行,这使它有点不完整,但感谢您的回答:-) 不客气。这是我在实现中使用的,到目前为止效果很好。

以上是关于python websockets,如何设置连接超时的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 cpprestsdk 设置 websocket SSL 连接?

如何在 Windows Azure 上设置 Websocket 连接?

当python中的连接失败时如何重新连接到websocket

Android WebSocket开发

python 如何建立socket长连接

如何使用 CloudFormation 为 API 网关 v2 websocket 连接设置 VPC