とある技術の快 速 聊 天light chat若葉堂本舗技術開発部
そもそもlightChatって何?
2005年より提供しているWebチャット誰でもすぐに参加できる直近ログのログは常に表示書き込みがリアルタイムで反映される
RSが動作する環境なら必ず使える
≒WindowsPCWebブラウザだけで利用可能専用クライアントやプラグインがいらない
なんでlightChatを作ったの?
簡単に使えるチャットが欲しかったからIRC利用に対してのハードルが高いログイン名必須通常は過去ログを参照できない≒飛び込みで参加しにくいクライアントの導入が必須通常のWebチャットリアルタイム性が皆無Adobe FLASHでのチャットFLASH plug-inが必要
なんでブラウザだけで出来るの?
ブラウザ(≒HTML)だけでは実現できません表示切替はページ全体の書き換えが必要HTTPではPush配信をサポートしていない1回ページを返すとそこで通信終了サーバ側の情報更新を伝えることができないそもそもHTTPはステートレス通信の間をまたいだ状態を持たない常に新しい接続
じゃぁ、なんで出来てるの?
サーバ側の工夫とJavaScriptでカバー表示切替JavaScriptを使ってパーツだけ差し替えPush配信疑似サーバPushでカバー通信を繋ぎっぱなしにするサーバ側で更新があったらページを返す1回ページを返すとそこで通信終了ページが帰ってきたら再度繋ぎなおすステートレス通信の間をまたいだ状態を持たないクライアント側で状態を持つ
もうちょっと詳しい解説
通信モデルの違い
一般的なWebチャット
通信モデル:一般的なチャット(起動直後)ブラウザServerPHPDataBaselightChatページ要求ログ取得ログ返却lightChatページHTML返却
通信モデル:一般的なチャット(待機)ブラウザServerPHPDataBaselightChatページ要求ログ取得ログ返却lightChatページHTML返却ブラウザ側で5秒経過したら再読み込みlightChatページ要求ログ取得ログ返却lightChatページHTML返却
通信モデル:一般的なチャット(書き込み)ブラウザServerPHPDataBaselightChatページ要求ログ取得ログ返却lightChatページHTML返却lightChat書き込みログ書込ログ取得lightChatページHTML返却ログ返却
通信モデル:一般的なチャット(更新取得)ブラウザServerPHPDataBaselightChatページ要求ログ取得ログ返却lightChatページHTML返却ブラウザ側で5秒経過したら再読み込みlightChatページ要求ログ取得このタイミングでたまたま誰かが書き込んでいたら更新として取得されるログ返却lightChatページHTML返却
lightChat
通信モデル:lightChat(起動直後)ブラウザJavaScriptServerPHPDataBaseTouch filelightChatページ要求lightChatページHTML返却コメットエンジン起動チャットログ要求ログ取得チャットログ返却ログ返却ブラウザ上の表示を書き換え
通信モデル:lightChat(待機)ブラウザJavaScriptServerPHPDataBaseTouch fileチャットログ要求更新監視タイムアウトは25秒監視中に更新が無かった場合チャットログ返却(0件)チャットログ要求~~以降繰り返し~~
通信モデル:lightChat(書き込み)ブラウザJavaScriptServerPHPDataBaseTouch file書き込み書き込み要求書き込み書き込み内容消去最終更新ミリ秒書き込み書き込み完了通知
通信モデル:lightChat(更新取得)ブラウザJavaScriptServerPHPDataBaseTouch fileチャットログ要求更新監視誰かが書き込んだ!更新検知ログ取得チャットログ返却ログ返却ブラウザ上の表示を書き換え(差分箇所のみ)チャットログ要求~~以降繰り返し~~
通信モデルの相違点更新検知旧:実質検知は行っていない新:サーバ側でデータが更新されたか監視データ更新旧:書換時に更新分が含まれていた場合のみ新:サーバで更新があった瞬間
技術的にもうちょっと詳しく
通信一般的にLong pollingと言われる事をしているサーバ側の工夫とJavaScriptでカバー表示切替JavaScriptを使ってパーツだけ差し替えPush配信疑似サーバPushでカバー通信を繋ぎっぱなしにするサーバ側で更新があったらページを返す1回ページを返すとそこで通信終了ページが帰ってきたら再度繋ぎなおすステートレス通信の間をまたいだ状態を持たないクライアント側で状態を持つ

とある技術の快速聊天