【问题标题】:Python 3 Websockets, how to properly close socketPython 3 Websockets,如何正确关闭套接字
【发布时间】:2018-07-27 06:40:01
【问题描述】:

我有以下类来打开我的 websocket:

import os
import asyncio  
import websockets
import threading

class Server:

    def get_port(self):
        return os.getenv('WS_PORT', '9002')

    def get_host(self):
        return os.getenv('WS_HOST', 'localhost')

    def shutdown(self):
        self.loop.call_soon_threadsafe(self.loop.stop)

    def start(self):
        return websockets.serve(self.handler, self.get_host(), self.get_port())

随后是一些传入消息的异步处理方法。用于获取消息的循环函数在其自己的线程中运行,仅供参考。

我可以终止程序,但是我无法正确关闭套接字,导致脚本重新启动时出现以下错误

OSError: [Errno 10048] error while attempting to bind on address ('127.0.0.1', 9002):

由于端口已在使用中。通常我会使用一些.close()函数,但是websocket包不提供这样的功能,所以我想知道我是否可以用os包或websocket包来完成这个?

【问题讨论】:

    标签: python python-3.x sockets websocket python-asyncio


    【解决方案1】:

    讨论了正确的关闭过程here。基本思想是使用serve() 方法作为异步上下文管理器。

    async with websockets.serve(echo, 'localhost', 9002):
        await stop
    

    例如,stop 可以是 Future。当您调用 stop.set_result() 时,await“返回”。然后上下文管理器将正常关闭服务器。

    通常,您会使用信号处理程序来触发停止条件(文档中还包含一个示例)。

    当框架未使用socket.SO_REUSEADDR 打开套接字时,您也可能会收到错误消息。 See this question for details.

    【讨论】:

    • 谢谢,您提到的解决方案对我不起作用,因为我在 Windows 上。但是您提供的链接显示了一个有效的解决方案,谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-06-29
    • 2012-02-10
    • 2020-03-20
    • 2018-12-14
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 2014-04-13
    相关资源
    最近更新 更多