2012-05-03 12 views
7

Socket.ioの代わりにSockJS(https://github.com/sockjs/sockjs-client)があります。これはSocket.ioよりも優れた保守性と安定性を持つようです。SockJSを別のWebフレームワークと統合する方法

この質問は(概念的な理解について

私の現在の理解はあなたがSockJS-クライアントとSocketJSサーバーを必要とするということであるチャットアプリケーションを構築するために、たとえば、WebフレームワークでSockJSを使用するアーキテクチャである私私はSockJS-Tornado(https://github.com/MrJoes/sockjs-tornado)を使用して、WebSocketスタイルの通信を行うことができます。

しかし、SockJS(SockJS-client + SockJS-Tornado)は、他の作業(ページの提供、DBへの書き込み/読み込みなど)を行うWebフレームワークとどのように結びついていますか。例えば、SockJS-TornadoコンポーネントはフレームワークのWebサーバーとどのように通信しますか?特に、web2py(pythonのWebフレームワーク)を使ってこれを行う方向性は高く評価されています。

+0

あなたはこのようなRabbitMQのかZeroMQとしてメッセージキューを使用することができます。 – igorw

+0

@igorw、メッセージキューを使ってSockJS-TornadoサーバをフレームワークのWebサーバに接続できるので、SockJS-Tornadoが受け取ったものをフレームワークと共有できるのですか?あなたは詳細を教えていただけますか?ありがとう。 – MLister

+0

ところで、また、http://autobahn.ws/ – Alp

答えて

4

SockJSのためには、sockjs対応サーバーとブラウザ内のjavascriptクライアントライブラリが必要です。あなたはすべてのサイトがトルネードから提供があり

  1. は、一般に、2つの統合パターンがあり、あなたはsockjs-竜巻を使用したいとしましょう。それで、「http://mysite.com/sockjs」のように、いくつかの経路にsockjs-tornadoを接続します。このシナリオでは、あなたのウェブサイトとsockjsの両方がmysite.comドメインから提供されます。

  2. あなたのサイトは書かれている言語/フレームワークのままにしておき、sockjs-serverasを別のドメインのように別のドメインの下に追加することができます。 'http://sockjs.mysite.com/sockjs'

さらに、さまざまなバリエーションを使用することができます。たとえば、2つのサーバーを内部的に持つ一方で、スマートロードブロッカー(haproxyなど)を使用して1つのドメインとして公開します。

+1

提案ありがとうございます。私が提案した第2の選択肢についてもっと知りたいと思います。特に、SockJS-Tornadoとフレームワークで使用されているWebサーバーをどのように連携させるか。たとえば、ブラウザからサーバー側(SockJS-TornadoとフレームワークのWebサーバーで構成されています)の要求のワークフローは何ですか?ありがとう。 – MLister

+2

別々のサーバーを2つ保管してください。 One - あなたの古いアプリ。新しい - sockjs-tornado。単一のドメインとして公開したい場合や、2つの別々のドメインを使用する場合は、ルーティングにHAProxyを使用してください。 sockjsとあなたのアプリケーションの間の通信が必要な場合は、Redis Pub/sub、RabbitMQまたはzeromqを使用して、2つの間でメッセージを交換してください。 – Marek

+0

こんにちは@Marek。どうすれば私は2つの別々のサーバーを持つ必要がありますアプリケーションとsockjsの間でメッセージを交換するのですか?私の現在のセットアップは、私は3つ目のものを実行する必要があるということです..zmqサーバスクリプトでは、4つのソケットがバインドされています。 #zmq.PULL forwarder_to_server.bind( "tcp:// *:5562")#zmq.PUSH receiver_from_websocket.bind( "tcp:// * :5563 ")#zmq.PULL forwarder_to_websocket.bind(" tcp:// *:5564 ")#zmq.PUSH –

1

フレームワークとしてweb2pyを使用している場合、gluon/contribのcomet_messaging.pyを見ることができます。 web2pyアプリケーションからwebsocketクライアントにメッセージを取得する機能(comet_send)を提供します。これは竜巻(SockJSサポートなし)に基づいていますが、DistributeHandlerはSockJS接続をサブクラス化してフォールバック転送サポートを提供できます。このアプローチでは、クライアントはweb2pyコントローラ(または他のフレームワーク)によって処理される典型的なGETまたはPOST HTTPリクエストを介してメッセージを送信し、web2pyコントローラからcomet_messaging.comet_send()を呼び出してポストリクエストを竜巻インスタンスに送り、リスナーのリストにそれを出します。 (オープン注意on_openなり)のような外観をcomet_messagingで

修正ライン:

class DistributeHandler(sockjs.tornado.SockJSConnection): 
    def on_open(self, r): 
    group,token,name = [None, None, None] 
    self.group = group or 'default' 
    self.token = token or 'none' 
    self.name = name or 'anonymous' 

urls=[ 
    (r'/', PostHandler), 
    (r'/token', TokenHandler), 
    (r'/realtime', DistributeHandler)] 

sockJS-竜巻だったので、私はDistributeHandler URLSpecでの正規表現のグループを削除する必要がありましたお知らせそれを窒息させる。まだパスからon_openハンドラへのパラメータを取得する方法を理解しようとしています。

0

これは、DjangoのにSockJSを統合する方法についての完全な答えを提供します:https://stackoverflow.com/a/10950702/675065

基本的にはあなたが必要とする:

  • トルネード+ SockJS-トルネード
  • のRedis + Brukva

を私は自分のプロジェクトでこの設定を使用すれば、かなりうまく動作します。

または:あなたはアウトバーンの方法を試してみてください。http://autobahn.ws/(私はまだそれを試していなかった)

関連する問題