python - Python 中的代码,在 Node.js 和 Socket.IO 中通信,在 HTML 中呈现

标签 python html node.js socket.io

您有一个 Python 脚本 diagnosis.py 可以生成基于事件的实时数据。使用 Node.js,您可以将其作为子进程启动并捕获其输出,然后使用 Socket.IO 将其发送到客户端并使用 HTML 呈现。

服务器

var util  = require('util'),
    spawn = require('child_process').spawn,
    ls    = spawn('python', ['diagnosis.py']);

var app = require('http').createServer(handler)
  , io = require('socket.io').listen(app)
  , fs = require('fs')

app.listen(80);

function handler (req, res) {
  fs.readFile(__dirname + '/index.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }

    res.writeHead(200);
    res.end(data);
  });
}

io.sockets.on('connection', function (socket) {
    ls.stdout.on('data', function (gdata) {
      socket.emit('news', gdata.toString());
    });
});

客户

<html>
    <head>
        <script src="/socket.io/socket.io.js"></script>
        <script>
          var d = "";
          var socket = io.connect('http://localhost');
          socket.on('news', function (data) {
            d += data;
            document.getElementById('data').innerHTML = d;
            console.log(data);
          });
        </script>
    </head>
    <body>
        <div id="data"></div>
    </body>
</html>

问题

这很好,但如果您正在寻找与 Socket.IO 相同的 HTML-Node.js 通信能力,但在 Node.js 和 Python 之间寻找呢?你会怎么做?那里没有 Web 服务器,因此 Socket.IO 没有多大意义,并且通过裸 TCP 进行通信并不能提供相同的功能/优雅。 Node.js和Python如何实现全双工通信?

enter image description here

更新我回答了我自己的问题,但我愿意接受另一种方法。 RPC 并不能完全满足我的要求。

最佳答案

Apache Thrift是在所有主要语言之间编写 RPC 代码的一种非常棒的方式。你编写一个通用的 Thrift 规范来声明类型和服务,然后代码生成器为你想要的语言创建绑定(bind)。您可以拥有用于在您的 Node 和 python 代码库之间调用方法的 api。

关于更通用的低级方法,ZeroMQ是一个消息队列库,也支持所有主要语言。有了这个,你可以设计你自己的解决方案来实现你想要的通信方式(不仅仅是纯粹的 RPC)。它具有请求/回复、推送/拉取、发布/订阅和配对的模式。它为您提供了足够的工具来构建任何类型的可扩展系统。

我都用过,它们都是很好的解决方案。

作为一个非常粗略的例子,Thrift 规范可能是这样的。假设您想将事件从 python 传递到 node.js,对其进行处理并返回一些响应:

myspec.thrift

struct Event {
    1: string message; 
}

service RpcService {
    string eventOccurred(1:Event e)
}

这定义了一个名为 Event 的数据结构,其中包含一个字符串成员来保存消息。然后一个名为 RpcService 的服务定义了一个名为 eventOccured 的函数,该函数需要一个 Event 作为参数,并返回一个字符串。

当您为 python 和 node.js 生成此代码时,您可以使用 python 的客户端代码和 node.js 的服务器端代码

python

from myrpc import RpcService, ttypes

# create a connection somewhere in your code
CONN = connect_to_node(port=9000)

def someoneClickedSomething():
    event = ttypes.Event("Someone Clicked!")
    resp = CONN.eventOccurred(event)
    print "Got reply:", resp

node.js

// I don't know node.js, so this is just pseudo-code

var thrift = require('thrift');
var myrpc = require('myrpc.js');

var server = thrift.createServer(myrpc.RpcService, {
  eventOccurred: function(event) {
    console.log("event occured:", event.message);
    success("Event Processed.");
  },
});
server.listen(9000);

关于python - Python 中的代码,在 Node.js 和 Socket.IO 中通信,在 HTML 中呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13848943/

相关文章:

javascript - html 模板 vs 通过 js 推送代码

node.js - NodeJS、Express、MongoDB - 将多个 Mongoose 查询传递到渲染页面

mysql - Node JS和mysql连接不上(客户端不支持服务端请求的认证协议(protocol),考虑升级mysql客户端)

javascript - 使用 mongojs 按时间戳查找文档

python - Google App Engine 项目中未显示 html 中的嵌入图像

python - C 字符串中的十六进制小数

python - 如何从字节对象中删除双反斜杠 (`\\` )?

Python Mechanize 如何使用缓存密码?

javascript - 如何判断元素是否具有流体宽度

KO 模板中的 JavaScript