我正在 python 3 中构建一个 Websocket 服务器应用程序。我正在使用这个实现:https://websockets.readthedocs.io/ 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) 修复start_loop
根据 websockets 示例运行,因此代码变为
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()
最后,在尝试连接到服务器之前,先休眠一小会儿,让服务器开始侦听(理想情况下您会有更好的同步机制,但大多数情况下短暂的休眠就可以了):
print("Server launched")
# give some time for server to start, before we try to connect
time.sleep(2)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)