如何向websocket用户发送AJAX消息



我已经在Websockets中实现了实时聊天,它就像一个魅力。我与AJAX轮询(以前就存在)并行进行,因为我不想删除对旧浏览器的AJAX轮询支持,所以尽管Websockets将是首选,但我仍将轮询作为一种选择。

我设置websocket代码的方式是:

  • 使用Websockets将消息发送到适当的连接
  • 将消息记录在数据库中

AJAX发送的工作方式是:

  • 将消息记录在数据库中

AJAX轮询的工作方式是:

  • 检查用户上次检索房间的消息的时间,并检索此后的所有消息

我还有一个关于如何让两者相互合作的概念性问题。假设我有用户A和用户B。如果用户A和B都在使用AJAX轮询,或者都在使用websocket,那么就没有任何问题。正如你所期望的那样。但以用户A使用websocket和用户B使用AJAX轮询为例。

A→B

  • 用户A通过websocket发送消息
  • 聊天信息会发送到所有相关连接。在这种情况下,它只是返回到用户A,因为用户B没有使用websocket
  • 聊天信息已登录数据库
  • 用户B请求新消息,用户A的消息被发送回他

B→A

  • 用户B通过AJAX发送消息
  • 消息保存在数据库中

这就是我挂断的电话。Websocket->AJAX用户消息之所以有效,是因为消息最终会出现在AJAX用户可以轮询的数据库中。但是websocket用户根本不轮询数据库,所以AJAX用户的消息无法进入管道。目前,websocket用户没有看到任何来自AJAX用户的消息。他们只有在重新加载整个页面时才能看到它们,此时所有消息都将直接从数据库中检索到。

什么是合适的方法来允许AJAX用户的消息通过websocket发送给相关的websocket用户?基本上,我如何在另一个方向上进行沟通?

关于这个主题,我唯一能找到的就是这个幻灯片——然而,我没有使用长轮询,我也不完全确定它所说的"长轮询"是什么意思;规定";到websocket应用程序。这是否意味着让websocket服务器负责检查新的AJAX消息?难道没有办法";"推";从AJAX脚本到websocket服务器?

感谢ADyson提供了一些关于如何解决此问题的想法。这就是我最终所做的:

我的JS客户端每隔几秒钟就会对服务器进行ping。对于AJAX用户来说,它更频繁,因为他们需要轮询消息。对于Websocket用户来说,他们不需要轮询Websocket消息,所以他们每15秒轮询一次";签入";。这样做的好处是,基本上每个客户端都可以作为一个无限循环运行,这正是这个想法所需要的。

我所做的基本上是在messages表中添加一列,用于跟踪消息源:用于AJAX的0和用于WebSocket的1。然后,我修改了检索消息的函数,以接受$ajaxOnly参数。当我在AJAX民意测验中调用这个时,它是false。对于websocket轮询,我将其称为true。结果是,对于用户所在的所有房间,它会轮询DB并检查是否有任何新的AJAX消息。如果有,它会将它们发送回客户端。

有两个注意事项:

  • 消息将出现无序。Websocket消息是实时中继的,因此在Websocket之前发送的AJAX消息可能会更早地出现在另一个AJAX用户面前,但稍后会出现在其他Websocket用户面前
  • 这不是实时的。它和你的轮询间隔一样慢,在我的情况下,对于websocket来说是15秒,因为轮询是DB密集型的。AJAX轮询更加频繁,因为它们需要获得任何消息

这不是一个完美的解决方案,但它确实实现了允许AJAX消息在接近中实时显示给websocket用户的目标。对我来说,我想完全支持AJAXWebSocket,但AJAX更多的是为了兼容性,理想情况下大多数人都会使用WebSockets,所以这不是一个

好的如果你希望有一个实时解决方案(就像我一样),你会对此感到失望,但这至少是一个可行的解决方案,所以我一直采用它,直到出现更好的解决方案。通过增加客户端ping服务器的频率,可以使其接近实时。

简单的解决方案:当您将消息保存到数据库中时,也可以将其推送到Websocket客户端。

最新更新