首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Python编写代码,用Node.js和Socket.IO进行通信,以HTML表示

问用Python编写代码,用Node.js和Socket.IO进行通信,以HTML表示
EN

Stack Overflow用户
提问于 2012-12-12 21:26:50
回答 4查看 17.5K关注 0票数 18

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

服务器

代码语言:javascript
复制
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());
    });
});

客户端

代码语言:javascript
复制
<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和Node.js之间的交流能力呢?你会怎么做?那里没有web服务器,所以Socket.IO没有太多的意义,并且光用TCP进行通信并不能提供相同的能力/优雅。如何实现Node.js和Python之间的全双工通信?

​

​

更新--我回答了我自己的问题,但我对另一种方法持开放态度。不过,RPC并没有完全实现我想要的功能。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-13 23:21:20

在这个问题的启发下,我使用这个库将diagnosis.py转换为Socket.IO客户机。这样,我就可以将实时数据发送到Node.js Socket.IO服务器:

代码语言:javascript
复制
socketIO.emit('gaze', ...)

然后让它执行一个socket.broadcast.emit来向所有Socket.IO客户机(浏览器和diagnosis.py)发出数据。

RPC可能是跨语言开发的更标准的方法,但当目标是交换数据时,我发现这样做有点过分。它也不支持偶发的IO。

更新在2013年1月由于socket.broadcast.emit产生了大量不必要的流量,我试图找到一个更好的方法来做到这一点。我想出的解决方案是使用名称空间,这是我提到的基本python客户端库所支持的。

Python

代码语言:javascript
复制
self.mainSocket = SocketIO('localhost', 80)
self.gazeSocket = self.mainSocket.connect('/gaze')
self.gazeSocket.emit('gaze', ...)

若要连接到凝视命名空间,请执行以下操作。

Node.js

代码语言:javascript
复制
var gaze = io.of('/gaze').on('connection', function (socket) {
    socket.on('gaze', function (gdata) {
        gaze.emit('gaze', gdata.toString());
    });
});

这会发出只接收到连接到凝视命名空间的客户端的数据。

浏览器

代码语言:javascript
复制
var socket = io.connect('http://localhost/gaze');
socket.on('gaze', function (data) {
    console.log(data);
});
票数 2
EN

Stack Overflow用户

发布于 2012-12-12 21:36:22

阿帕奇是在所有主要语言之间编写RPC代码的非常棒的方法。您可以编写一个通用的Th深层规范,声明类型和服务,然后代码生成器为您想要的语言创建绑定。您可以使用apis在节点和python代码库之间调用方法。

在一种更通用的低级别方法中,ZeroMQ是一个消息队列库,它也支持所有主要语言。有了这个,您就可以设计自己的解决方案,以满足您想要的通信方式(而不仅仅是纯粹的RPC)。它有请求/回复、推送/拉、发布/订阅和配对的模式。它为您提供了足够的工具,可以将任何类型的可伸缩系统组装在一起。

我使用了这两种方法,它们都是很好的解决方案。

就像一个非常粗略的例子一样,Thrift规范可能是这样的。让我们假设您希望将事件从python传递到node.js,并对其进行处理并得到一些响应:

myspec.thrift

代码语言:javascript
复制
struct Event {
    1: string message; 
}

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

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

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

python

代码语言:javascript
复制
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

代码语言:javascript
复制
// 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);
票数 8
EN

Stack Overflow用户

发布于 2012-12-12 21:36:44

您可以查看一些消息传递系统,如0mq http://www.zeromq.org/。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13848943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档