2012-09-13 194 views
1

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

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

您需要在Python方面多一点。

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

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

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

您的特定用例是什么?也许这可能会让我们看到前进的道路。

+0

特殊用例= node.js和python之间的基本通信。我不需要提供.swf或任何其他类型的内容,所以我认为我不需要框架。 – ejang

+0

TCP/UDP有点烦人,因为我必须跟踪缓冲区大小等。有更简单的套接字库吗? – ejang

+0

此外,socket.io emit()函数非常有用,因为我可以指定python可以专门响应而不必从数据中解析出特定标志的方法。我认为用普通套接字是不可能的,除非我在多个端口上建立连接,这很烦人 – ejang