Python - 单向 websocket
Posted
技术标签:
【中文标题】Python - 单向 websocket【英文标题】:Python - Unidirectional websocket 【发布时间】:2019-07-17 15:37:37 【问题描述】:我正在尝试在客户端和服务器 (python) 之间创建单向 websocket 连接。我目前使用的原型库是 websockets 和 simplesocketserver。我有一个从服务器到客户端的 hello world 示例,但我需要能够在客户端不提示的情况下将数据从后端发送到客户端。所有 websockets 示例似乎都显示服务器正在侦听客户端然后响应。
到目前为止我已经尝试过:
使用 websockets 8.0,自发地从服务器向客户端发送数据,这有效,但仅适用于硬编码字符串,我不明白如何在客户端自发地按需发送真实数据
李>以完全相同的方式使用 simplesocketserver
开始调查服务器发送的事件 - 这是否更合适?来自 websockets 文档的示例:
import asyncio
import websockets
async def hello(websocket, path):
name = await websocket.recv()
print(f"< name")
greeting = f"Hello name!"
await websocket.send(greeting)
print(f"> greeting")
start_server = websockets.serve(hello, "localhost", 8765)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
注意:需要单向通信是由于现有架构。
任何有关这方面的指导或资源都会很棒,我希望我忽略了一些简单的事情。谢谢!
【问题讨论】:
【参考方案1】:我遇到了类似的问题。经过一些尝试和错误,我找到了一个适合我的解决方案,也许它也适合你。我已经在 Linux 以及 Firefox 和移动 Safari(并行)上对此进行了测试。
InputThread
等待命令行上的输入(单词)并将它们写入一个列表,每次添加新字符串或连接客户端时,该列表都会发送到所有连接的客户端。
最好的问候, 菲利普
代码sn-p
import asyncio
import websockets
import json
from threading import Thread
words = []
clients = []
async def register_client(websocket, path):
# register new client in list and keep connection open
clients.append(websocket)
await send_to_all_clients()
while True:
await asyncio.sleep(10)
async def send_to_all_clients():
global words
for i, ws in list(enumerate(clients))[::-1]:
try:
await ws.send(json.dumps("words": words))
except websockets.exceptions.ConnectionClosedError:
# remove if connection closed
del clients[i]
class InputThread(Thread):
def run(self):
global words
async def sending_loop():
while True:
i = input()
if not i.strip():
continue
words.append("options": i.strip().slit())
await send_to_all_clients()
asyncio.run(sending_loop())
InputThread().start()
asyncio.get_event_loop().run_until_complete(
websockets.serve(register_client, "localhost", 8765))
asyncio.get_event_loop().run_forever()
【讨论】:
以上是关于Python - 单向 websocket的主要内容,如果未能解决你的问题,请参考以下文章