HTML5简单聊天室

问题描述:

我想要做的是一个简单的HTML5聊天室,没有什么奇特的,一旦有人说了一些东西,它会将它发送给当前连接到服务器的所有人,就是这样。没有存储,没有任何复杂。但它必须是灵活的,但我的网站应该能够根据需要自动创建单独的聊天室。我见过很多演示和示例,但它们都需要我安装node.js或类似的需要终端访问的东西(我没有)。我目前正在其中一个免费的网站主机上运行,​​为您提供一个ftp客户端,一个mysql数据库,一些php支持,就是这样。有没有办法做到这一点?或者我错过了一些东西,有没有办法在这些服务器上安装软件包?也许有人知道获得终端访问的方式?任何形式的帮助将不胜感激,谢谢。HTML5简单聊天室

+1

如果你有root权限(你现在没有权限),你可以安装tornado/node.js等。现在你可以做聊天室了,只需发送很多ajax请求来检查新消息,尽管它赢了不要那么快。考虑购买VPS,如果你真的需要root访问,它不会花费太多,但你可以安装自己的软件(改变Apache为Nginx,龙卷风,卡桑德拉...) – therealszaka 2012-01-15 16:26:22

+0

你不能推动客户端没有像节点的工具.js文件。你应该检查与服务器的间隔ajax,而不是推,尝试谷歌:ajax聊天室拉 – 2012-01-15 16:26:52

+0

。 – 2012-01-15 17:05:15

在那里做过。正确的做法并不是微不足道的。

我认为你必须做出一个重要的决定:你想让聊天真的是瞬间的,或者可以等待2秒钟的延迟,直到每个人都看到新的消息。

如果延迟没有问题,您可以每隔2秒轮询服务器以查看是否有新消息可用。没有人喜欢延迟,但取决于你想做什么,它可能并不是那么糟糕。服务器然后会检查每个请求上的数据库/文件并返回更新。这是一个非常简单的解决方案,它可以工作。 (如果你认为每2秒轮询一次浪费资源和服务器上不必要的负载...继续阅读,替代方案可能会更糟糕。)

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

现在,这是比较容易的部分。但是,你如何在服务器上实现这一点?让我们看看这种情况:聊天中有10个用户,这意味着10个客户端每个都会有一个等待新数据的悬挂彗星请求。其中一位用户在聊天中写入了一些内容,并导致向服务器发送附加请求以发布文本。你如何在服务器上执行一个PHP脚本,导致其他10个执行停止等待并返回新数据? (你可以用Perl取代PHP,或任何其他的东西)。你需要一些允许脚本的几次执行相互交谈的东西。 (或PHP代码本身可能是轮询每秒钟一个数据库,但是又引入了延迟。)任何形式的进程间通信(IPC)的是在这些脚本语言困难的,尤其是你不知道什么样的模式的Web服务器用它来执行它们。例如,Apache可以为每个请求设置一个进程,或者为每个请求设置一个线程,或者两者兼有。但是,也许你的主机使用IIS或其他东西,所以在这种情况下很难做IPC。我最终做的是在PHP中创建一个始终运行的服务器组件,其任务是在不同执行的PHP脚本之间传递消息。是的,这需要shell访问。所有的PHP执行都将通过套接字连接到该服务器组件,并且消息可以传递。正确的做法很棘手,但最终效果很好。

不幸的是,彗星的要求是非常浪费的内存和CPU周期。我的Apache服务器有一个每个PHP执行模型。所以当聊天中有100人时,这意味着随时有100个待处理的彗星请求,这意味着有100个Apache进程正在运行。即使一个新鲜的Apache进程只用了10MB,总共也只有1GB!这是很多的记忆,这些过程只是等待发生。聊天是一个令人难以置信的记忆猪。此外,这样的聊天会产生很多请求:每当有人在聊天中说出某些内容时,所有100个请求都会返回,您将在此之后收到100个新请求。聊天中的用户数量通常是用户数的两倍,意味着请求数量是其的四倍。而且你真的希望这是活泼的。 Apache并不总是如此高效地处理这个问题。有一些Web服务器软件专门针对彗星请求进行了调整,并且可以很好地扩展,但这又需要更多的访问服务器的权限。

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

嗯,我知道这并不能帮助你,因为你很受你的托管服务提供商的限制。没有外壳访问,实际上你只能做很多事情。如果你确定用2秒延迟(或使之1秒),你不同时预计超过20个用户,你可以真的只是去投票。有一些方法可以优化这一点,例如,活跃用户可以获得1秒的民意调查,而那些很少写点东西的人可以获得5秒的民意调查。

也就是说,也许你也可以寻找某种托管解决方案。我确信有可以通过iframe嵌入的聊天内容。

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

+0

感谢您的洞察力,刚刚完成了一个需要聊天室和聊天室的项目,您在这里列出的发现已经为我确认了一些事情。辉煌的职位! – Nick 2012-07-20 03:43:53

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

我对此不能多说,但目前常用的技术是comet
在彗星你打开一个请求到服务器(例如像AJAX的东西),但你不关闭它。你只要保持它打开,但你只需要从服务器发送数据到客户端。这项技术也需要一些特殊的服务器,但我认为如果你有一点Google,你肯定会找到一种方法来实现Comet with PHP(但我认为Python会更适合这样的事情)...

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

HTML 5有一个很酷的新功能称为网络套接字,它允许真正的客户端和服务器之间的双向通信。但是,您不会找到任何便宜的共享托管计划,这将允许您托管自己的Web Socket服务器。

您可以通过使用“老式”方式来伪造双向通信:使用AJAX。基本上,客户端JavaScript每隔几秒向数据库发出一个请求,以检查是否有任何新的聊天消息要显示。发布新消息只需将该消息发布到服务器。

彗星只是一个花哨的(更高效的,服务器端)的方式来做到这一点。

正如很多人所说,实现这一目标的流行方法是使用ajax,comet(或其他一些长轮询机制)或WebSockets。

我的建议是使用WebSockets,但正如前面提到的,您的主机可能不允许您设置套接字服务器。

如果您遇到这种情况,我推荐使用Server Sent Events,这是另一个HTML5解决方案,它已被WebSockets所掩盖。

它将允许您将事件发送到浏览器,并使其易于在PHP中实现。