我正在尝试使用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服务器没有看到连接。任何人都可以指出我缺少的东西吗?
答案 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协议的编码/解码等。
您的具体用例是什么?也许这可以为前进的道路提供一些启示。