【发布时间】:2021-04-14 11:12:00
【问题描述】:
使用 Quart 我试图通过 websocket 从一个客户端接收数据,然后让 Quart websocket 服务器通过 websocket 将其发送到不同的客户端。
两个客户端将单独共享相同的 url,其他对客户端将有自己的 url。此回声测试分别适用于两个客户端:
@copilot_ext.websocket('/ws/<unique_id>')
async def ws(unique_id):
while True:
data = await websocket.receive()
await websocket.send(f"echo {data}")
我已经尝试使用https://pgjones.gitlab.io/quart/tutorials/websocket_tutorial.html#broadcasting 此处的示例进行广播,尽管我可以捕获并打印不同的 websocket,但从一个客户端向另一个客户端发送数据时运气不佳:(
connected_websockets = set()
def collect_websocket(func):
@wraps(func)
async def wrapper(*args, **kwargs):
global connected_websockets
send_channel, receive_channel = trio.open_memory_channel(2)
connected_websockets.add(send_channel)
try:
return await func(send_channel, *args, **kwargs)
finally:
connected_websockets.remove(send_channel)
return wrapper
@copilot_ext.websocket('/ws/<unique_id>')
@collect_websocket
async def ws(que, unique_id):
while True:
data = await websocket.receive()
for send_channel in connected_websockets:
await send_channel.send(f"message {data}")
print(send_channel)
仅仅存储 websocket 对象并遍历它们也不起作用
connected_websockets = set()
@copilot_ext.websocket('/ws/<unique_id>')
async def ws(unique_id):
global connected_websockets
while True:
data = await websocket.receive()
connected_websockets.add(websocket)
for websockett in connected_websockets:
await websockett.send(f"message {data}")
print(type(websockett))
【问题讨论】:
-
您能否提供一些有关您的网络或客户端设置的详细信息,您是否可能遇到防火墙问题?
-
不,在本地主机上运行。我也可以使用第一个测试回显发送/接收
-
那么你使用的是 80 端口吗?
-
您使用的是 Linux、mac 还是 windows?
-
它是一个运行在 Linux 上的 Quart 服务器。回声测试从本地主机客户端到本地主机 websocket 服务器都有效,因此网络变量已被取消