微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php-如何在聊天中向所有人实时发出“用户正在键入”通知

我想使用jQuery和PHP编写聊天应用程序.我需要帮助的部分是实时用户“ Evx”键入一条消息,然后将该消息实时显示给所有其他用户.这类似于Skype如何使用笔../和Facebook如何在用户键入时发出通知.

我需要的是有关逻辑步骤的帮助,以及有关如何轻松完成实时“用户正在键入”的信息,但仍然可以像其他方式一样起作用.

到目前为止,这是我尝试过的:

//time delay before ajax call
var delay = (function() {
    var timer = 0;
    return function(callback, ms) {
        clearTimeout(timer);
        timer = setTimeout(callback, ms);
    };
})();

$('#usermsg').keydown(function() {
    if ($('#usermsg').val().length === 5) {
        delay(function() {
            $.ajax({
                url: "addusertyping.PHP",
                cache: false,
                success: function() {

                }
            });
        }, 5000);
    }
});

$('#usermsg').keyup(function() {
    if ($('#usermsg').val().length >= 6) {
        // here I should basically check for 
          // an update from server or what not.
    }
});​

有人可以使用我上面尝试的内容来说明有关如何实现用户实时键入的步骤和信息吗?

解决方法:

像Facebook和Google Talk这样的网站在实施聊天时所使用的方法是使用利用Comet或Reverse AJAX利用Web的请求/响应模型的解决方案.

Web 1.0:

在传统的Web 1.0实现中(例如您的实现),浏览器向服务器发起请求.服务器以客户端代码在视图中呈现的数据作为响应.

当我们只是将用户一个页面移至另一页面或响应用户启动的事件时,这非常有用.但是,这种方法在管理服务器启动的事件方面存在固有的缺陷.

在您的示例中,为了模拟实时更新,您必须对服务器进行连续的轮询请求以检查更新.这相当于汽车后座上的小孩不断不断地问他的父母“我们到了吗?我们到了吗?”一遍又一遍没有失败.当连接的客户端数量增加时,这不仅会占用大量带宽,还会给服务器造成沉重的负担.

彗星/反向AJAX:

由于服务器无法在没有请求的情况下启动对浏览器的响应,因此使用一种称为“反向AJAX”或“ Comet”的技术来模拟服务器将事件通知推送到客户端的过程.

Comet的基本前提是浏览器打开与服务器的连接,然后服务器无限期地保持该连接的打开状态.然后,当服务器具有需要传递给所有连接的客户端的更新时,它将响应发送回客户端,从而完成请求/响应周期.客户端收到响应后,立即向服务器发送另一个请求,服务器再次保持打开状态,直到下一次更新.

有适用于PHP的Comet解决方案,因此您可以使用现有平台来完成此任务.但是,我不推荐任何东西.您还需要一个客户端库来方便打开Comet连接.查看Dojo Cometd JavaScript Library.

Comet是用于实现聊天解决方案的两个高级解决方案之一,另一个是WebSockets.但是,某些浏览器仍然缺少对WebSocket的支持.

在寻找有助于Comet的库时,最好选择一个有助于Continuations的库,这有助于确保等待发送响应的线程可以被释放以执行其他任务,而不是闲着等待.通过这种解决方案,一些Comet服务器可以轻松扩展到超过20,000个连接!

这是一篇描述How to Implement Comet on PHP文章.此外,您可能会发现这个StackOverflow问题非常有用,因为它是describes the challenges of using Comet on PHP.

设计注意事项:

在开发聊天解决方案时,我们犯的第一个错误是没有将消息视为更抽象的东西的子类.相反,我们从服务器发送到前端的信息只是一个“聊天消息”.但是,随着产品的进步,我们很快发现可以使用相同的Comet连接将命令发送到浏览器,而不仅仅是消息.

因此,要实现“用户正在输入”,您可能需要在JavaScript中使用一个处理程序,该处理程序首先确定来自服务器的更新是新消息还是“显示用户XYX正在输入”命令.一个好的设计还可以确保您可以将Comet连接用于从服务器启动的其他类型的更新.

最后,您的“用户键入”消息应具有某种程度的延迟,以便用户键入时,他或她的浏览器仅每X秒通知一次服务器.如果将用户键入绑定到一个按键事件,该事件只是通过AJAX请求对服务器进行锤击,那么您只是在将Comet连接降级为轮询.

在收件人端,您很可能希望实现超时功能,以便如果正在键入的用户停止向服务器发送“用户键入”请求,则“用户键入”消息将自动消失.或者,如果该用户的浏览器在其文本框为空时(例如,当用户在输入的文本上退格时)发送了请求,则该浏览器可能会发送“用户不再输入”消息.

简易解决方案?:

最后,我想补充一下,这将涉及到学习曲线,因为您必须从服务器将数据推送到客户端的角度来考虑Web.您将需要进行大量的研究和奉献,并尝试一些示例,并对如何处理应用程序设计有深刻的理解.到目前为止,这是掌握该技术的最佳方法之一,但也可能令人生畏.只需确保花些时间看这些示例,然后自己尝试,如果遇到困难,可以随时寻求帮助.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐