首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HTML5简单聊天室

HTML5简单聊天室
EN

Stack Overflow用户
提问于 2012-01-16 00:23:42
回答 5查看 6.4K关注 0票数 2

我想做的是一个简单的HTML5聊天室,没有什么花哨的东西,一旦有人说了什么,它就会发送给当前连接到服务器的每个人,仅此而已。没有存储,没有什么复杂的东西。它必须是灵活的,虽然,我的网站应该能够自动创建单独的聊天室,因为他们需要。我看过很多演示和示例,但它们都需要我安装node.js或类似的需要终端访问的东西(我没有)。我目前在一个免费的网站主机上运行,它给你一个ftp客户端,一个mysql数据库,一些php支持,仅此而已。有什么方法可以做到这一点吗?也许我漏掉了什么,有没有一种方法可以在这种服务器上安装软件包?也许有人知道获得终端访问权限的方法?任何形式的帮助都将非常感谢,谢谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-02-11 19:51:21

已经在那里做过了。这不是一件微不足道的事情。

我认为你必须做出一个重要的决定:你希望聊天是即时的,还是可以延迟2秒,直到每个人都看到新的消息。

如果延迟没问题,你真的可以每隔2秒轮询服务器一次,看看是否有新的消息可用。没有人喜欢延迟,但根据你想要做的事情,它可能不会那么糟糕。然后,服务器将在每次请求时检查数据库/文件,并返回更新。这是一个非常简单的解决方案,而且很有效。(如果您认为每2秒轮询一次会浪费资源和服务器上不必要的负载……往下看,另一种选择可能更糟糕。)

完全即时聊天要求服务器可以立即向客户端发送新数据,而无需等待客户端请求。HTTP本身并不支持这一点,如果你不想使用任何Flash/Java,我所知道的唯一方法就是使用comet请求。这些请求(通常是AJAX)会故意在服务器上挂起一段时间,然后在需要发送给客户端的新数据可用时或发生超时时返回。每次comet请求返回时,客户端都会处理数据,并立即发出另一个comet请求,该请求将再次挂起,直到有新数据可用。我相信每个纯HTML/JS的聊天网站都是这样做的(Omegle、Facebook等等)。

现在,这是最简单的部分。但是如何在服务器上实现这一点呢?让我们看一下这种情况:您有10个用户参与聊天,这意味着10个客户端将每个客户端都有一个等待新数据的挂起的comet请求。其中一个用户在聊天中写了一些东西,这导致向服务器发送一个额外的请求来发布文本。如何使这一次在服务器上执行PHP脚本导致其他10次执行停止等待并返回新数据?(您可以用Perl或任何东西替代PHP。)你需要一些东西来允许几个脚本的执行相互对话。(或者PHP代码本身可能每秒轮询一个数据库,但这也会引入延迟。)在这些脚本语言中,任何形式的进程间通信(IPC)都很困难,尤其是您不知道web服务器使用哪种模型来执行它们。例如,Apache可以为每个请求创建一个进程,或者为每个请求创建一个线程,或者两者兼而有之。但是也许你的主机使用了IIS,或者其他什么东西,所以在这种情况下很难进行IPC。我最终做的是用PHP创建一个自己的服务器组件,它一直在运行,它的任务是在PHP脚本的不同执行之间传递消息。是的,这需要shell访问权限。所有的PHP执行都将通过套接字连接到该服务器组件,并且消息可以被传递。这是一个棘手的问题,但在最后它工作得很好。

不幸的是,comet请求可能会非常浪费内存和CPU周期。我的Apache服务器有一个每次PHP执行的进程模型。因此,当有100个人参与聊天时,这意味着任何时候都有100个未决的comet请求,这意味着有100个Apache进程在运行。即使一个新的Apache进程只使用10MB,总共也有1 1GB!这是一个很大的内存,而这些进程只是在等待一些事情发生。这次聊天简直是一次令人难以置信的记忆大战。而且,这样的聊天会产生很多请求:每次有人在聊天中说些什么,所有的100个请求都会返回,然后你就会收到100个新的请求。聊天中两倍的用户通常意味着四倍的请求。而且你真的希望这是快的。Apache在处理这个问题上并不总是那么高效。有一些web服务器软件是专门针对comet请求进行调整的,并且可以很好地扩展,但这仍然需要比您拥有的更多访问服务器的权限。

为了完整起见,这里是我故事的结尾:在此期间,我抛弃了所有的PHP,并完全重写了聊天。在我看来,Apache和PHP都非常不适合这类任务。现在只有一个Java服务器组件集成了一个高效的多线程HTTP服务器。我已经对它进行了压力测试,它的性能非常好:在连接了500个垃圾邮件客户端的情况下,CPU使用率不会超过15%,内存使用率保持在150MB。这比我预想的要好得多。与Apache/PHP相比,它的响应性也有了很大提高。最终结果可以在http://www.dark-chat.info/上查看,尽管由于各种原因,聊天目前有点死气沉沉。随着我获得更多的时间,这种情况有望改变。

好吧,我知道这对你一点帮助都没有,因为你的主机提供商对你有很大的限制。如果没有shell访问,您可以做的事情也就只有这么多了。如果你可以延迟2秒(或1秒),并且你不希望同时有超过20个用户,那么你真的可以使用轮询。有一些方法可以优化这一点,例如,活跃用户可以获得1秒的投票,而那些很少写东西的用户可以获得5秒的投票。

也就是说,也许你也可以四处寻找一些托管的解决方案。我相信你可以通过iframe嵌入周围的聊天内容。

好的,这比我想要的要长得多。但我希望它能帮助一些人。:)

票数 9
EN

Stack Overflow用户

发布于 2012-01-16 00:30:25

不使用任何插件(Flash、Java等)就可以实现聊天的唯一方法是WebSocket。(以特定的时间间隔连接服务器以检查新消息是实现这一点的一种方式,但我认为它太“脏”了……)但是,我认为托管网站可能不提供WebSocket服务器。我建议你通过使用Java/Flash进行连接来制作一个IRC客户端。如果你想使用HTML/JS来制作UI,可以使用Flash中的ExternalInterface或者Java中的JSObject来实现插件和JS之间的通信。

票数 0
EN

Stack Overflow用户

发布于 2012-01-16 01:31:00

关于它我不能说太多,但目前经常使用的一种技术是comet

在Comet中,您打开对服务器的请求(例如,使用AJAX之类的东西),但您不会关闭它。您只需使其保持打开状态,但仅在需要时才将数据从服务器发送到客户端。这项技术还需要一些特殊的服务器,但我认为如果你在谷歌上搜索一下,你肯定会找到一种用PHP实现Comet的方法(但我认为Python对于这样的东西会更好)……

希望这能给你一些想法,如何解决你的问题:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8871245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档