【问题标题】:Refresh chat box when new msg received收到新消息时刷新聊天框
【发布时间】:2015-09-14 17:34:31
【问题描述】:

我是 PHP 新手。我将使用 PHP 制作一个简单的 Web 应用程序,一个聊天框。

我不知道有什么更好的方法可以在收到新消息后立即刷新聊天窗口。我唯一想到的就是经常刷新页面。我知道这不是一个好主意。

我知道如何使用 AJAX,所以我只能刷新聊天框(不刷新整个页面)。但在 AJAX 中,客户端也必须发送请求。

服务器有没有办法在收到新消息时刷新聊天框?

【问题讨论】:

  • 代码示例会有很大帮助。需要有一个两个客户端都可以看到的标志,所以可能是一个被触及的数据库项目或文件。然后使用 AJAX。输入并提交消息时,标志设置为TRUE。然后另一个客户端可以继续检查这个标志(也许也通过 AJAX)。一旦它注意到它被翻转为TRUE,它就可以收集并显示消息,将标志设置回FALSE
  • 突然想到 Web 套接字,但我个人对它们没有任何经验,因此无法提供帮助

标签: javascript ajax chat server-push


【解决方案1】:

Web 应用程序中的标准通信顺序是 HTTP 请求由 Web 客户端(浏览器)发起,然后由服务器响应。

您需要的是角色互换并且服务器机器请求客户端机器接收消息。

这称为server push。链接的 Wikipedia 文章列出了许多解决方法。

客户端反复询问服务器是否有新消息到达是最简单的方法,它被称为轮询,但频率高会给服务器带来压力(如果有多个客户端这样做,则成倍增加),而频率低则是对于许多用例来说响应不够。

尽管其他用户 emsch 使用了大字体,但 WebSockets 并不适合所有人(目前),因为并非每个浏览器都支持它。 比较您的浏览器/操作系统矩阵,例如browser implementation

几年前我最喜欢的是BOSH,比起Comet 等其他方法,我更喜欢它:BOSH 需要一个由服务器保持的连接才能使服务器响应,并且可能需要第二个连接到服务器以用于客户作为响应。由于可能会发生超时,因此一段时间后会以低频率执行空交换。因此,如果没有消息到达服务器或客户端,BOSH 的行为就像一个缓慢的轮询。

如果您不熟悉 Web 和网络开发,我建议您寻找一个不错的消息传递库。

  • 如果您需要支持旧版浏览器,请使用支持上述几种技术并回退到最佳适用案例的库
  • 如果您可以使用现代浏览器,请选择一些基于 WebSockets 的库。

【讨论】:

    【解决方案2】:

    是的,有一种方法可以通过服务器通知客户端。它被称为

    WebSocket

    使用这项技术,您可以随时将数据从服务器发送到客户端,反之亦然。 它会创建一个 TCP 连接并保持打开状态,直到您手动关闭它。

    我之前没有在 php 中使用过它,但是快速的谷歌搜索给了我一些库的结果,所以你应该找到一个合适的解决方案。不过,我认为 node.js 服务器在其他一些连续运行的服务器上更适合此功能。

    然后,您可以在客户端通过 JavaScript 中的 WebSocket 进行通信。
    先打开连接

    var webSocket = new WebSocket("ws://www.example.com/socketserver");
    

    然后你可以等待传入的流量并在函数中处理数据

    webSocket.onmessage = function (event) {
        console.log(event.data);
    }
    

    这只是一个非常简短的概述。你会发现很多关于这个主题的信息,例如在Mozilla Developer Network

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-27
      • 1970-01-01
      相关资源
      最近更新 更多