【发布时间】:2020-09-09 09:42:01
【问题描述】:
我目前正在努力解决“简单”的问题。 我想要一个 python WebSocket 服务器,它能够被外部事件关闭(例如,命令行中的 Ctrl+C)。
到目前为止,这是我的代码:
PORT = 8765
class Server(object):
def __init__(self):
self.online_players = dict()
self.online_players_lock = asyncio.Lock()
self.websocket_server = None
async def add_online_player(self, id, player):
async with self.online_players_lock:
self.online_players[id] = player
async def remove_online_player(self, id):
async with self.online_players_lock:
if id in self.online_players.keys():
del self.online_players[id]
def start(self):
end = False
loop = asyncio.new_event_loop()
thread = threading.Thread(target=listen, args=(loop, self))
thread.start()
while not end:
try:
time.sleep(500)
except KeyboardInterrupt:
end = True
loop.call_soon_threadsafe(stop_listening, loop, server)
async def on_connect(websocket, path, server):
print("New user...")
id = await websocket.recv()
player = WebSocketPlayer(id, websocket, server)
await server.add_online_player(id, player)
# from this point on WebSocketPlayer class handles communication
await player.listen()
def listen(loop, server:Server):
asyncio.set_event_loop(loop)
bound_handler = functools.partial(on_connect, server=server)
start_server_task = websockets.serve(bound_handler, "localhost", PORT, ping_timeout=None, loop=loop)
start_server = loop.run_until_complete(start_server_task)
server.websocket_server = start_server
print("Server running ...")
loop.run_forever()
async def stop_listening(loop, server:Server):
await server.websocket_server.wait_close()
loop.stop()
loop.close()
if __name__ == "__main__":
server = Server()
server.start()
像 loop.add_signal_handler(signum, callback, *args) 这样的异步信号处理程序对我来说不是一个选项,因为它们只在 Unix 上工作。
我目前得到的错误是从未等待过stop_listening 方法,这对我来说很有意义。所以我对修复我的代码示例不是很感兴趣,但更一般地说,如何才能实现我的目标,或者通常如何解决?
非常感谢您
【问题讨论】:
标签: python windows websocket python-asyncio