7

作为 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)如何与一个完成其余工作(例如,为页面提供服务,向/从 db 写入/读取等)的 web 框架结合在一起。例如,SockJS-Tornado 组件如何与框架的 Web 服务器通信?特别是,高度赞赏使用 web2py(python 网络框架)执行此操作的任何方向。

4

3 回答 3

4

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

一般有两种集成模式,假设你要使用 sockjs-tornado:

  1. 您的所有网站都可能从 Tornado 获得服务。这样,将 sockjs-tornado 挂接到某个路径,例如“http://mysite.com/sockjs”。在这种情况下,您的网站和 sockjs 都将由 mysite.com 域提供。
  2. 您可以将您的网站保留在它编写的任何语言/框架中,并将 sockjs-server 添加为另一个组件,在不同的域下,例如。'http://sockjs.mysite.com/sockjs'。

此外,您可以使用任何变体 - 例如:在内部拥有两台服务器,但通过使用智能负载均衡器(如 haproxy)将它们公开为一个域。

于 2012-05-08T10:50:04.533 回答
1

如果您使用 web2py 作为框架,您可以在 gluon/contrib 中查看 comet_messaging.py。它提供了一个函数(comet_send),用于将消息从 web2py 应用程序发送到您的 websocket 客户端。它基于 tornado(不支持 SockJS),但 DistributeHandler 可以子类化 SockJS 连接以提供后备传输支持。在这种方法中,您的客户端通过典型的 GET 或 POST HTTP 请求发送消息,这些请求由 web2py 控制器(或其他框架)处理,并从调用 comet_messaging.comet_send() 的 web2py 控制器接收消息,后者向 tornado 实例发送 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 处理程序。

于 2012-05-29T00:09:57.470 回答
0

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

基本上你需要:

  • Tornado + SockJS-Tornado
  • Redis + Brukva

我在自己的项目中使用了这个配置,效果很好。

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

于 2013-02-07T08:53:16.503 回答