创建聊天应用程序有(大致)三种选择:
套接字
使用Flash/Java和套接字作为前端,使用支持套接字的编程语言作为后端。对于后端,我建议使用Java或Python,因为它们都支持多线程和NIO。虽然PHP也可以实现,但是它不能真正高效地进行多线程处理,通常不太适用于此。如果需要高性能,则可以选择此选项,但这可能不是您要寻找的。
使用Ajax和轮询
在这种情况下,所有客户端都会不断地(例如每隔2秒)轮询是否有新的消息。这种方式感觉很奇怪,因为您只能每隔一段时间获得响应。此外,它对您的服务器和带宽造成了相当大的压力。您可以通过浏览器不断刷新来发现应用程序使用此技术。这是一个次优解决方案。
使用Ajax和推送
这种方法使用多部分响应,并在后端具有长时间运行(PHP)脚本。虽然这不是最佳解决方案,但大多数情况下比轮询更好,并且在几个知名聊天程序中使用。此技术有时被称为 COMET。
我的建议:如果您需要用于生产的聊天应用程序,请安装现有的应用程序。编写聊天应用程序并不是很容易。
如果您只是想学习,可以从简单的Ajax/轮询应用程序开始,然后尝试使用Ajax和推送编写一个自己的聊天应用程序。
是的,大多数情况下您需要一个数据库,虽然我成功地实现了一个非常简单的Ajax/轮询解决方案来处理文本文件(但我肯定不会在生产中使用它!)。
就我所知,不能仅使用前端JavaScript创建聊天应用程序而无需服务器端后端!
更新
如果您想知道如何进行数据推送,请查看此处的源代码:http://wehrlos.strain.at/httpreq/client.html。异步多部分是您想要的 :)
function asSendSyncMulti() {
var httpReq = new XMLHttpRequest();
showMessage( 'Sending Sync Multipart ' + (++this.reqCount) );
httpReq.multipart = true;
httpReq.open( 'GET', 'server.php?multipart=true&c=' + (this.reqCount), false );
httpReq.onload = showReq;
httpReq.send( null );
}
function showReq( event ) {
if ( event.target.readyState == 4 ) {
showMessage( 'Data arrives: ' + event.target.responseText );
}
else {
alert( 'an error occured: ' + event.target.readyState );
}
}
showReq被调用每次数据到达时,而不仅仅是像常规ajax请求那样调用一次(我这里并未使用jquery或prototype,所以代码有点臃肿 - 这真的很旧 :)).
下面是服务器端的部分:
<?php
$c = $_GET[ 'c' ];
header('Content-type: multipart/x-mixed-replace;boundary="rn9012"');
sleep( 1 );
print "--rn9012\n";
print "Content-type: application/xml\n\n";
print "\n";
print "Multipart: First Part of Request " . $c . "\n";
print "--rn9012\n";
flush();
sleep( 3 );
print "Content-type: application/xml\n\n";
print "\n";
print "Multipart: Second Part of Request " . $c . "\n";
print "--rn9012--\n";
?>
更新2
关于数据库:如果您的后端采用像mod_php/cgi这样不共享的架构,那么您肯定需要像数据库或文本文件这样的某种外部存储。但是:您可以通过编写自己的HTTP服务器来依赖内存(在PHP中可能是可行的,但我不建议进行严肃的工作)。这并不是很复杂,但可能超出了您问题的范围^^
更新3
我犯了一个错误!我把所有东西搞混了,因为我实际上已经很久没有做类似的事情了。以下是更正:
多部分响应仅适用于Mozilla浏览器,因此受到限制。COMET并不意味着多部分响应。
COMET的意思是:传统的单部分响应,但会被保留(使用无限循环和睡眠),直到有数据可用。因此,浏览器对每个操作都有1个请求/响应(在最坏的情况下),即使没有任何值得响应的内容,也是每x秒一个请求而不是一个请求。