作为 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框架(执行此操作的任何方向都受到高度赞赏。
你是对的,对于SockJS,你需要一个支持sockjs的服务器和一个浏览器内JavaScript客户端库。
通常有两种集成模式,假设你想使用 sockjs-tornado:
- 您可能从龙卷风获得所有网站服务。有了这个,将袜子龙卷风钩到某个路径上,例如"http://mysite.com/sockjs"。在这种情况下,您的网站和 sockjs 都将从 mysite.com 域提供服务。
- 您可以将您的网站保留在编写的任何语言/框架中,并将 sockjs-server作为另一个组件,在不同的域下,例如。"http://sockjs.mysite.com/sockjs"。
此外,您可以使用此的任何变体 - 例如:内部有两个服务器,但通过使用智能负载器(如 haproxy(将它们公开为一个域。
如果你使用web2py作为框架,你可以在gluon/contrib中看起来comet_messaging.py。它提供了一个函数(comet_send(,用于将消息从web2py应用程序发送到Websocket客户端。它基于龙卷风(不支持SockJS(,但DistributeHandler可以对SockJS连接进行子类化以提供回退传输支持。在这种方法中,您的客户端通过典型的GET或POST HTTP请求发送消息,这些请求由web2py控制器(或其他框架(处理,并从调用comet_messaging.comet_send((的web2py控制器接收消息,该控制器向龙卷风实例发送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-tornado 被它窒息了。仍在尝试弄清楚如何从路径到on_open处理程序中获取参数。
这提供了如何将 SockJS 集成到 Django 中的完整答案: https://stackoverflow.com/a/10950702/675065
基本上你需要:
- 龙卷风
- +袜子JS-龙卷风
- 雷迪斯+布鲁克瓦
我在自己的项目中使用此配置,效果很好。
或者:你尝试高速公路的方式:http://autobahn.ws/(我还没有尝试过(