2012-05-03 39 views
7

作爲Socket.io的替代方案,有SockJS(https://github.com/sockjs/sockjs-client),它似乎比Socket.io更好的維護和更穩定。如何將SockJS與其他Web框架集成

這個問題是關於概念的理解使用SockJS與Web框架,比如,建立一個聊天應用程序

我現在的理解是,你需要的SockJS客戶端和SocketJS服務器的體系結構(在我案例中,我打算使用SockJS-Tornado(https://github.com/MrJoes/sockjs-tornado))來進行websocket式的通信。但是SockJS(SockJS-client + SockJS-Tornado)與一個完成剩餘工作(例如提供頁面,寫入/讀取/從數據庫等)的Web框架綁定在一起的方式,SockJS(SockJS-client + SockJS-Tornado)例如,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客戶端庫。

通常有兩種集成模式,讓我們假設你想使用sockjs-龍捲風:

  1. 你可能有你的網站從龍捲風服務。用這個,把sockjs-tornado鉤到某個路徑,例如'http://mysite.com/sockjs'。在這種情況下,您的網站和sockjs將從mysite.com域提供。
  2. 您可以使用任何語言/框架來保存您的網站,並在另一個域下添加sockjs-serveras另一個組件。 'http://sockjs.mysite.com/sockjs'。

此外,您可以使用任何變化 - 例如:內部有兩臺服務器,但使用智能loadblancer(如haproxy)將其公開爲一個域。

+1

感謝您的建議。我想知道更多關於您提出的第二種選擇。特別是,如何將SockJS-Tornado與框架使用的Web服務器連接起來。例如,從瀏覽器到服務器端(包含SockJS-Tornado和框架的Web服務器)的請求的工作流程是什麼?謝謝。 – MLister

+2

保留兩臺獨立的服務器。一個 - 你的舊應用程序。新的 - sockjs龍捲風。如果您希望將其公開爲單個域,或僅使用兩個單獨的域,請使用HAProxy進行路由。如果您需要sockjs與您的應用程序之間的通信 - 請使用Redis Pub/sub,RabbitMQ或zeromq在兩者之間交換消息。 – Marek

+0

hi @Marek。我應該如何交換應用程序和sockjs之間的消息,我應該只有2個獨立的服務器?我目前的設置是,我必須運行第三個..綁定4個套接字的zmq服務器腳本。 receiver_from_server.bind(「tcp:// *:5561」)#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。它提供了一個函數(comet_send),用於從web2py應用程序獲取消息到websocket客戶端。它基於龍捲風(無SockJS支持),但DistributeHandler可以繼承SockJS連接以提供後備傳輸支持。在這種方法中,客戶端通過典型的GET或POST HTTP請求發送消息,這些請求由web2py控制器(或其他框架)處理,並從web2py控制器接收消息,調用comet_messaging.comet_send(),它向龍捲風實例發送post請求,它出現在聽衆列表中。

在comet_messaging樣子的修改過的線(注意打開變爲on_open):

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)] 

通知我不得不刪除正則表達式組中的DistributeHandler URLSpec因爲sockJS-龍捲風是窒息它。仍然試圖找出如何從路徑獲取參數到on_open處理程序。

0

這提供了有關如何SockJS融入Django的一個完整的答案:https://stackoverflow.com/a/10950702/675065

基本上你需要:

  • 旋風+ SockJS基旋風
  • 的Redis + Brukva

我在我自己的項目中使用這個配置,它工作得很好。

或者:你試試高速公路路:http://autobahn.ws/(我沒有嘗試出來呢)