node.js socket.io-client + python socketio

时间:2012-09-13 01:06:11

标签: python node.js socket.io gevent

我正在尝试使用Socket.IO来允许我的Node.JS应用程序与Python后端进行通信。我希望Node.JS充当客户端,Python充当服务器,所以除了gevent-socketio python模块之外,我还使用socket.io-client Node.JS模块。

https://github.com/LearnBoost/socket.io-client https://github.com/abourget/gevent-socketio

这是我的python服务器:

#!/usr/bin/env python
from socketio.server import SocketIOServer
from socketio.namespace import BaseNamespace

class MyNamespace(BaseNamespace):
    def on_foobar(self,data):
        print 'received method for foobar'
        print data


server = SocketIOServer(('localhost', 1234),resource=MyNamespace,policy_server=False)
print 'SocketIO server listening...'
server.serve_forever()

这是我的Node.JS服务器(充当客户端):

#!/usr/bin/env node
var io = require('socket.io-client');
var PySocket = io.connect('localhost:1234');
PySocket.emit('foobar',{'key1':'value1'});

由于某种原因,python服务器没有看到连接。任何人都可以指出我缺少的东西吗?

1 个答案:

答案 0 :(得分:1)

你需要在Python方面多一点。

Namespace对象不作为参数传递给SocketIOServer对象。 resource(后来重命名为namespace)只是要识别的路径的名称(如http:// localhost / [namespace] / [socket.io协议路径的其余部分]。)同意术语有重叠,但我们很少处理socket.io以外的资源/命名空间。

现在,为了运行你的python IO服务器,你需要使用一些框架来包装它...实际上将一些传入的请求分派给正确的处理程序。该处理程序必须执行socketio_manage(),这是您应该将Namespace对象作为参数传递的函数。此外,您的框架可能希望提供其他文件,例如.swf ... gevent-socketio不会为您执行此操作。另外,如果你想让你的python进程做任何事情(比如与数据库交互,加载一些配置文件),我建议你选择一个框架,因为它可以减轻你生活中的大部分需要做的事情。

如果你真的只想拥有一个socket类型的服务器,从node.js到python,那么为什么不使用标准的TCP / UDP套接字呢?在这种情况下,您不需要框架的开销,Socket.IO协议的编码/解码等。

您的具体用例是什么?也许这可以为前进的道路提供一些启示。