簡體   English   中英

在不同的線程/事件循環中啟動 websocket 服務器

[英]Starting websocket server in different thread/event loop

我正在 python 3 中構建一個 Websocket 服務器應用程序。我正在使用這個實現: https://websockets.readthedocs.io/

基本上我想使用不同的線程在同一個進程中啟動服務器和客戶端。

這是我的代碼。 服務器似乎已啟動,但客戶端未連接。

我究竟做錯了什么?

紀堯姆

import asyncio
import websockets
import socket
from threading import Thread

async def hello(websocket, path):
    name = await websocket.recv()
    print(f"< {name}")
    greeting = f"Hello {name}!"
    await websocket.send(greeting)
    print(f"> {greeting}")

def start_loop(loop):
    asyncio.set_event_loop(loop)
    loop.run_forever()

# Get host and port from config file
server_host = socket.gethostname()
server_port = 8081  # random.randint(10000, 60000)

print('server_host: ' + server_host)

# start a new event loop
new_loop = asyncio.new_event_loop()
t = Thread(target=start_loop, args=(new_loop,))
t.start()

start_server = websockets.serve(hello, server_host, server_port, loop=new_loop)

print("Server launched")

async def hello():
    uri = "ws://{}:{}".format(server_host, server_port)
    async with websockets.connect(uri) as websocket:
        name = input("What's your name? ")

        await websocket.send(name)
        print(f"> {name}")

        greeting = await websocket.recv()
        print(f"< {greeting}")

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

問題是您首先啟動了后台線程,然后嘗試使用它(作為一般原則,首先設置您的對象,然后啟動線程)。 另一個問題是您沒有像示例中那樣調用run_until_complete

所以要修復:

(1) 按照websockets例子修復start_loop function,所以代碼變成

def start_loop(loop, server):
    loop.run_until_complete(server)
    loop.run_forever()

(2)在啟動后台線程之前設置你的服務器object:

new_loop = asyncio.new_event_loop()
start_server = websockets.serve(hello, server_host, server_port, loop=new_loop)
t = Thread(target=start_loop, args=(new_loop, start_server))
t.start()

最后,在嘗試連接到服務器之前,先休眠一會兒,讓服務器開始監聽(理想情況下,您會有更好的同步機制,但大多數情況下短暫休眠會起作用):

print("Server launched")
# give some time for server to start, before we try to connect
time.sleep(2)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM