gpt4 book ai didi

python - 在不同的线程/事件循环中启动Websocket服务器

转载 作者:行者123 更新时间:2023-12-03 13:18:45 24 4
gpt4 key购买 nike

我正在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函数,使代码成为

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

(2)在启动后台线程之前设置服务器对象:
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()

最后,在尝试连接到服务器之前,请稍等一会儿以使服务器开始监听(理想情况下,您将拥有一个更好的同步机制,但是短暂的 sleep 在大多数情况下是可行的):
print("Server launched")
# give some time for server to start, before we try to connect
time.sleep(2)

关于python - 在不同的线程/事件循环中启动Websocket服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58123599/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com