チャット アプリケーションを作成するには、(大まかに) 3 つのオプションがあります。
ソケット
フロントエンドには flash/java とソケットを使用し、バックエンドにはソケット対応のプログラミング言語を使用します。バックエンドには、マルチスレッドで NIO に対応しているため、java または python をお勧めします。PHP でそれを行うことは可能です (ただし、php は実際には効率的なマルチスレッド化を行うことができず、一般的にこれにはあまり適していません)。これは、高性能が必要な場合のオプションであり、おそらく探しているものではありません。
ajax と pull を使用する
この場合、何か新しいことが起こった場合、すべてのクライアントが常に (たとえば 2 秒ごとに) ポーリングしています。その間隔でしか応答が得られないので、奇妙に感じます。さらに、サーバーと帯域幅にかなりの負担がかかります. ブラウザは常に更新されるため、アプリケーションがこの手法を使用していることはご存知でしょう。これは次善の解決策です。
ajax を使用してプッシュする
これは multipart-responses で動作し、バックエンドで実行時間の長い (php-) スクリプトがあります。最善の解決策ではありませんが、ほとんどの場合、引っ張るよりも優れており、機能し、いくつかの有名なチャット アプリで使用されています。この手法はCOMETと呼ばれることもあります。
私のアドバイス: 実稼働用のチャット アプリが必要な場合は、既存のものをインストールしてください。チャット アプリケーションのプログラミングはそれほど簡単ではありません。
単に学習したい場合は、単純な ajax/pull アプリから始めてから、ajax と push を使用してプログラムを作成してみてください。
はい、おそらくデータベースが必要になるでしょう。テキスト ファイルで動作する非常に単純な ajax/pull ソリューションを楽しみながら実装することに成功しました (ただし、本番環境では使用しません!)。
サーバー側のバックエンドなしで (フロントエンドの JavaScript だけで) チャット アプリを作成することは (私の知る限りではありますが、かなり確信しています) 不可能です!
アップデート
データのプッシュがどのように行われるかを知りたい場合は、次のソースを参照してください: http://wehrlos.strain.at/httpreq/client.html。非同期マルチパートはあなたが望むものです:)
function asSendSyncMulti() {
var httpReq = new XMLHttpRequest();
showMessage( 'Sending Sync Multipart ' + (++this.reqCount) );
// Sync - wait until data arrives
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 リクエストのように 1 回だけではなく、データが到着するたびに呼び出されます (ここでは jquery やプロトタイプを使用していないため、コードは少し太っています - これは本当に古いです :))。
サーバー側の部分は次のとおりです。
<?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";
?>
update2
データベースに関して: バックエンドにmod_php /cgi のような非共有アーキテクチャがある場合、データベースやテキストファイルなどの何らかの外部ストレージが必要になることは間違いありません。ただし、独自の http サーバーを作成することでメモリに依存することができます (php では可能ですが、深刻な作業にはお勧めしません)。それはそれほど複雑ではありませんが、おそらくあなたの質問の範囲外です^^
update3
私はミスを犯した!私が実際にそのようなことをしたのは久しぶりなので、すべてが混乱しました。ここに修正があります:
マルチパート応答は mozilla ブラウザーでのみ機能するため、使用が制限されます。COMET はマルチパート レスポンスを意味するものではありません。
COMET の意味: 従来のシングルパート応答ですが、データが利用可能になるまで (無限ループとスリープで) 保持されます。そのため、ブラウザーは (最悪の場合) すべてのアクションに対して 1 つの要求/応答を持ち、応答に値するものが何も起こらなくても、x 秒ごとに 1 つの要求ではありません。