0

我开发了一个基于 Flash 的聊天客户端,它显示属于某个组的用户发布的消息以及他们的用户名和写作时间。数据与组 id、用户 id 和消息一起存储在 mysql 数据库中,以便它在聊天会话之外持续存在,并允许用户稍后登录以查看讨论,而不是聊天,更多的是公告板。当用户写消息时,我希望聊天客户端立即更新,看起来像是实时聊天。到目前为止,我的解决方案是在我的 Flash 代码中包含一个间隔,该间隔调用一个 PHP 页面,该页面在数据库中查询新评论并将其返回给 Flash。

我认为从我读到的这种方法称为长轮询?那正确吗?这对于音量是否足够强大?当有变化时,我会更好地考虑将数据推送到客户端吗?如何检测这些变化?例如,我查看了 APE,但我认为这不会将消息存储在数据库中。

有什么建议么?

4

2 回答 2

2

轮询的坏处是,它会很快变得昂贵。

假设您有 10000 个在线用户,他们希望聊天的延迟不超过 1 秒。然后你会以每秒 10000 个请求轰炸你的服务器。

对于较小的事情或不需要更新的事情,轮询是一种很好的方法,因为它很简单而且不会出错。

如果这只是针对最多 100 人使用聊天的小社区,那么这应该不是问题。

除此之外,您可以使用 APE 或 SmartFox,或 Red5 或许多不同的东西来创建持久中继服务器,即与所有客户端永久连接并通知它们任何更改(例如新消息)的服务器。

与往常一样,我的个人建议是使用Haxe。您可以使用聊天教程开始。Haxe 的学习曲线相当陡峭,但我认为这完全值得。我很高兴将 ActionScript 和 PHP 都抛在了后面。

编辑:您所描述的不是长轮询。此外,您几乎无法使用 PHP 进行长轮询,至少如果经典地与 Apache 一起使用的话。Apache 会创建一定数量的 PHP 进程。每当请求到达时,它都会寻找一个免费的 PHP 进程并让它处理该请求。PHP 进程完成后,会将响应发送回客户端。如果没有可用的空闲进程,它将缓冲请求,直到有进程可用。因此,如果您尝试以经典方式使用 PHP 进行长轮询,您可能会完全阻塞整个服务器。

于 2010-03-03T17:58:17.300 回答
1

如果您想在收到新消息时通知应用程序,那么您必须在服务器上实现某种形式的应用程序来监视数据库/收到数据库更改警报,然后将更新传递给客户端。

这应该比仅轮询更有效,因为如果您考虑到低流量场景,那么轮询无论如何都会使服务器崩溃 - 这样您只会在有理由时生成流量。 ..

当您输入评论时,您的客户端可以直接(通过 Web 服务)通知此应用程序更改,然后此帮助应用程序可以更新数据库...

应该说,尽管我不是聊天程序方面的专家-从未亲自参与过...

于 2010-03-03T16:38:53.203 回答