作为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框架)执行此操作的任何方向。
答案 0 :(得分:4)
你是对的,对于SockJS,你需要一个支持sockjs的服务器和一个浏览器内的javascript客户端库。
通常有两种集成模式,假设你想使用sockjs-tornado:
此外,您可以使用其中的任何变体 - 例如:内部有两台服务器,但使用智能加载程序(如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
基本上你需要:
我在自己的项目中使用此配置,效果非常好。
或者:你尝试高速公路的方式:http://autobahn.ws/(我还没试过)