Python 3 Websockets,如何正确关闭套接字

时间:2018-02-16 11:00:14

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

我有以下课程来打开我的websockets:

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包来完成它?

1 个答案:

答案 0 :(得分: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.