gpt4 book ai didi

php - 如何向 websocket 用户发送 AJAX 消息

转载 作者:行者123 更新时间:2023-12-04 16:13:44 24 4
gpt4 key购买 nike

我已经在 Websockets 中实现了实时聊天,它就像一个魅力。我与 AJAX 轮询(以前存在过)并排完成,因为我不想删除对旧浏览器的 AJAX 轮询支持,因此虽然 Websockets 将是首选,但我仍将轮询作为一种选择。
我设置 websocket 代码的方式是:

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

  • AJAX 发送的工作方式是:
  • 在数据库中记录消息

  • AJAX 投票的工作方式是:
  • 检查用户上次检索房间消息的时间,并检索此后的所有消息

  • 我有更多关于如何让两者相互合作的概念性问题。假设我有用户 A 和用户 B。如果用户 A 和用户 B 都使用 AJAX 轮询或都使用 websockets,则没有任何问题。它按您的预期工作。但是以用户 A 使用 websockets 而用户 B 使用 AJAX 轮询的情况为例。
    A → B
  • 用户 A 通过 websocket 发送消息
  • 聊天消息被发送到所有相关的连接。在这种情况下,它只是回响给用户 A,因为用户 B 没有使用 websockets。
  • 聊天消息被登录到数据库
  • 用户 B 请求新消息,用户 A 的消息被发回给他

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

  • 这就是我挂断的。 Websocket -> AJAX 用户消息有效,因为该消息最终位于数据库中,可以由 AJAX 用户轮询。但是 websocket 用户根本不轮询数据库,因此来自 AJAX 用户的消息无法进入管道。目前,websocket 用户看不到来自 AJAX 用户的任何消息。他们只有在重新加载整个页面时才能看到它们,此时所有消息都直接从数据库中检索。
    允许通过 websocket 将来自 AJAX 用户的消息以某种方式发送给相关的 websocket 用户的适当方法是什么?基本上,我如何在另一个方向上进行交流?
    关于这个主题,我唯一能找到的是 this slideshow - 但是,我没有使用长轮询,并且我不完全确定“提供”给 websocket 应用程序意味着什么。这是否意味着让 websocket 服务器负责检查新的 AJAX 消息?有没有办法从 AJAX 脚本“推送”到 websocket 服务器?

    最佳答案

    感谢 ADyson关于如何解决这个问题的一些想法。这就是我最终做的:
    我让我的 JS 客户端每隔几秒钟就 ping 服务器。对于 AJAX 用户,它更频繁,因为他们需要轮询消息。对于 Websocket 用户,他们不需要轮询 websocket 消息,因此他们每 15 秒轮询一次以“ checkin ”。这具有本质上为每个客户端充当无限循环的好处,这正是该想法所需要的。
    我所做的基本上是在 messages 中添加一列跟踪消息源的表:0用于 AJAX 和 1对于 WebSocket。然后,我修改了检索消息的函数以接收 $ajaxOnly范围。当我在 AJAX 民意调查中调用它时,它是 false .对于 websocket 民意调查,我用 true 来称呼它反而。结果是用户所在的所有房间,它轮询数据库并检查是否有任何新 AJAX 消息。如果有,它会将它们发送回客户端。
    有2个注意事项:

  • 消息将出现乱序。 Websocket 消息是实时中继的,因此在 Websocket 消息之前发送的 AJAX 消息可能更早出现在另一个 AJAX 用户面前,但稍后出现在其他 Websocket 用户面前。
  • 这是不是 即时的。它和你的轮询间隔一样慢,在我的情况下,websockets 是 15 秒,因为轮询是非常数据库密集型的。 AJAX 轮询更频繁,因为它们需要获取任何消息。

  • 这不是一个完美的解决方案,但它确实达到了允许 AJAX 消息近实时地显示给 websocket 用户的目标。对我来说,我想完全支持 AJAX 和 WebSocket,但 AJAX 更注重兼容性,理想情况下大多数人会使用 WebSockets,所以这不是一个很好的解决方案这一事实并不太关心我,因为它确实得到了任务完成。
    如果您希望获得实时解决方案(就像我一样),那么您会对此感到失望,但这至少是一个可行的解决方案,因此我已经采用了它,直到出现更好的解决方案。您可以通过增加客户端 ping 您的服务器的频率来使其接近实时。

    关于php - 如何向 websocket 用户发送 AJAX 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62954676/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com