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的主要内容,如果未能解决你的问题,请参考以下文章

Python - 单向 websocket

python数据结构链表之单向链表

Python3中定义一个单向链表

python实现单向链表

python 单向链表实现

python数据结构链表之单向链表