1

Socket.IOを使用して、Node.JSアプリがPythonバックエンドと通信できるようにしようとしています。Node.JSをクライアントとして機能させ、Pythonをサーバーとして機能させたいので、gevent-socketiopythonモジュールに加えてsocket.io-clientNode.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] / [socket.ioプロトコルパスの残りの部分]など)にすぎません。用語に重複があることに同意しますが、以外のリソース/名前空間を扱うことはめったにありませんsocket.io

ここで、Python IOサーバーを実行するには、フレームワークを使用してサーバーをラップする必要があります。実際に着信要求を正しいハンドラーにディスパッチします。そのハンドラーを実行する必要socketio_manage()があります。これは、名前空間オブジェクトをパラメーターとして渡す必要がある関数です。また、フレームワークはおそらく.swfのような他のファイルを提供したいと思うでしょう...gevent-socketioはあなたのためにそれをしません。また、Pythonプロセスで何かを実行したい場合(データベースとの対話、いくつかの構成ファイルのロードなど)、フレームワークを選択することをお勧めします。これにより、ほとんどすべての作業が楽になります。

socketnode.jsからpythonまでのタイプのサーバーが本当に必要な場合は、標準のTCP / UDPソケットを使用してみませんか?その場合、フレームワークのオーバーヘッド、Socket.IOプロトコルのエンコード/デコードなどは必要ありません。

あなたの特定のユースケースは何ですか?たぶん、これは行く途中でいくつかの光を当てることができます。

于 2012-09-14T12:57:31.123 に答える