1

我正在尝试使用 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 服务器没有看到连接。谁能指出我错过了什么?

4

1 回答 1

1

在 Python 方面你需要更多一点。

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

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

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

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

于 2012-09-14T12:57:31.123 回答