如何将我的 Rest Api 服务器与我的 Web Socket 服务器通信

Posted

技术标签:

【中文标题】如何将我的 Rest Api 服务器与我的 Web Socket 服务器通信【英文标题】:How to communicate my Rest Api Server with my Web Socket server 【发布时间】:2019-01-13 17:49:39 【问题描述】:

这是我的问题已部分解决,但不是我认为的最佳方式。我有一个 REST API 服务器,它有一个只执行批处理的方法 POST。该方法立即返回 200(没有任何正文)并且批处理继续其在服务器中的任务。这个批处理有一个日志文件,我通常在网上看到tail -f mylogfile.log。我现在想要的是使用 websocket 服务器将尾部进程的输出发送到网页。 websocket服务端代码如下:

import os
import asyncio
import websockets
import subprocess

from frontserv.start_server import WEBSOCKET_INTERCHANGE_FILE


async def main(websocket, path):
    print("-> STARTING")
    exists = os.path.isfile(WEBSOCKET_INTERCHANGE_FILE)
    if not exists:
        f = open(WEBSOCKET_INTERCHANGE_FILE, "w+")
        f.close()

    exe = ["tail", "-f", WEBSOCKET_INTERCHANGE_FILE]
    message = ""
    p = subprocess.Popen(exe, stdout=subprocess.PIPE, stderr=None)
    while True:
        retcode = p.poll()
        print(message)
        message = message + p.stdout.readline().decode("utf-8") + "<br>"
        await websocket.send(message)
        await asyncio.sleep(0.1)


start_server = websockets.serve(main, '127.0.0.1', 5678)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

我可以访问批处理代码,并且我认为有更好的方法来解决这个问题。如果我可以向 websocket 服务器发送消息而不是记录到文件,以向浏览器发送消息,我认为这将是一个更好的实现。

最好的问候!

【问题讨论】:

我将使用 pub/sub 方法,因此日志记录过程将数据发布到命名通道,并且 WebSocket 服务器侦听该命名通道以推送任何更新(例如,使用 Redis 或使用 WebSocket客户端到同一个 WebSocket 服务器)...我可以在 C 和 Ruby 中执行此操作,但我不是 python 人。 您可以通过生成日志处理程序类从应用程序本身流式传输日志记录。我做了一个similar thing 【参考方案1】:

如果您只是想通过 websockets 将进程的输出发送到客户端,我建议您查看websocketd

你只需告诉它一个要监听的端口和一个要运行的命令

$ websocketd --port=8080 my-program

它会在客户端连接时运行命令并为他们提供输出。

【讨论】:

以上是关于如何将我的 Rest Api 服务器与我的 Web Socket 服务器通信的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Spring Security 与我现有的 REST Web 服务集成

如何将我的持续集成系统与我的错误跟踪系统集成?

编写一个包装器将现有的 REST API 公开为 SOAP Web 服务?

React.js 与 Node.js Rest API

如何在我的 Web 应用程序中实现 REST。我想为我的网站制作一个休息 API?

如何在 heroku 或 amazon web 服务上部署我的 rest api?