【问题标题】:python websockets, how to setup connect timeoutpython websockets,如何设置连接超时
【发布时间】: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))

【问题讨论】:

    标签: python python-3.x websocket


    【解决方案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 行,这使它有点不完整,但感谢您的回答:-)
    • 不客气。这是我在实现中使用的,到目前为止效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2012-05-01
    相关资源
    最近更新 更多