如何将SockJS与另一个Web框架集成

时间:2012-05-03 17:24:00

标签: websocket web2py web-frameworks server-push reverse-ajax

作为Socket.io的替代品,有SockJS(https://github.com/sockjs/sockjs-client),它似乎比Socket.io更好地维护和更稳定。

这个问题是关于概念性理解将SockJS与Web框架一起使用的体系结构,例如,用于构建聊天应用程序

我目前的理解是你需要SockJS客户端和SocketJS服务器(在我的情况下,我打算使用SockJS-Tornado(https://github.com/MrJoes/sockjs-tornado))来进行websockets风格的通信。

但是SockJS(SockJS-client + SockJS-Tornado)如何与执行其余工作的Web框架(例如,提供页面,写入/读取数据库等)相结合。例如,SockJS-Tornado组件如何与框架的Web服务器通信?特别是,高度赞赏使用web2py(python web框架)执行此操作的任何方向。

3 个答案:

答案 0 :(得分:4)

你是对的,对于SockJS,你需要一个支持sockjs的服务器和一个浏览器内的javascript客户端库。

通常有两种集成模式,假设你想使用sockjs-tornado:

  1. 您可以从Tornado获得所有网站服务。有了它,将sockjs-tornado挂钩到某个路径,例如'http://mysite.com/sockjs'。在这种情况下,您的网站和sockjs将从mysite.com域提供。
  2. 您可以将您的网站保留在其编写的任何语言/框架中,并在不同的域下添加sockjs-serveras另一个组件,例如。 'http://sockjs.mysite.com/sockjs'。
  3. 此外,您可以使用其中的任何变体 - 例如:内部有两台服务器,但使用智能加载程序(如haproxy)将它们作为一个域公开。

答案 1 :(得分:1)

如果您使用web2py作为框架,您可以在gluon / contrib中查看comet_messaging.py。它提供了一个函数(comet_send),用于将来自web2py app的消息发送到您的websocket客户端。它基于龙卷风(没有SockJS支持),但DistributeHandler可以子类化SockJS连接以提供后备传输支持。在这种方法中,您的客户端通过典型的GET或POST HTTP请求发送消息,这些请求由web2py控制器(或其他框架)处理,并从web2py控制器接收调用comet_messaging.comet_send()的消息,该消息向龙卷风实例发送一个post请求然后发送它出现在听众列表中。

comet_messaging中的修改后的行看起来像(notice open变为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-tornado正在窒息。仍试图弄清楚如何从路径获取参数到on_open处理程序。

答案 2 :(得分:0)

这提供了关于如何将SockJS集成到Django中的完整答案:https://stackoverflow.com/a/10950702/675065

基本上你需要:

  • 龙卷风+ SockJS-Tornado
  • Redis + Brukva

我在自己的项目中使用此配置,效果非常好。

或者:你尝试高速公路的方式:http://autobahn.ws/(我还没试过)