- 締切済み
退室されずにページを落ちた時の処理
現在チャットを作ってるのですが基本的なチャットシステムはほぼ完成しました。 ですが解決しにくいバグが残っています。 モード0で入室画面 モード1でチャット画面 モード2で退室画面 です。 クッキーはモード判定するクッキーと、ユーザーのチャットの設定のクッキーの2つを発行しています ●各画面の処理の仕方ですが入室画面は ・名前入力欄に""(何も表示していなかったり)、" " "," "."(スペースと,と.)のみで構成された名前はチャット画面に入れない ・また入室メンバー名と同じ名前ではチャット画面に入れない ・クッキーの発行はチャットの設定のクッキーはチャット画面に入れなかった場合発行 ・モード判定のクッキーはチャット画面に入れる時に発行 ・30秒、1分、3分、5分でページの自動更新を設定できるようにしてあるため、モード判定のクッキーはそれぞれ30秒、1分、3分、5分たったら自動的に消えるように時間を設定 ●チャット画面 ・チャット画面に入った直後のみ、メンバー名(IPとリモートホストも同時に)のファイルに記録 ・もちろん入った直後はメンバー名のファイルに書いたとしてもそのままでは画面に反映しないので、入力された内容を表示して問題無いようにする ・退室ボタンを押した時に退室画面にいける ・30秒、1分、3分、5分でページの自動更新を設定できるようにしてあるため、モード判定のクッキーはそれぞれ30秒、1分、3分、5分たったら自動的に消えるように時間を設定 ・自動更新したらその都度30秒、1分、3分、5分たったら自動的に消えるようクッキーを発行する ・チャットの設定のクッキーは発言されるたびに再取得する。(珠樹つなぎ式) ●退室画面 ・チャットの設定のクッキーを発行しないためそのままの状態で残す ・モードの判定のクッキーは即座に消えるよう設定 ・メンバー名の書かれたファイルから入室者のメンバー名(IPとリモートホストも)を消す という処理をしています。 ユーザーがチャットを終える時に退室画面に行ってくれれば私としては問題がなくてラッキーなのですが、退室画面に行ってくれずにページを閉じちゃってチャットを終えられたら2つ問題があります。 ■問題1 チャット画面で退室されずにページを閉じた直後、すぐさまページを開くとチャット画面から開始してしまうバグ ・珠樹つなぎの形で自動更新を持続させてるため当然なのですが、ページを閉じたらモード指定のクッキーを消す方法 ・もしくは、最初にページを見られた時にモード指定のクッキーを消す方法 ・もしくは、それ以外でページを閉じたら入室画面にいけて、自動更新した時はチャット画面にいける方法 はないでしょうか? ■問題2 チャット画面で退室されずにページを閉じられたら、メンバー名がいつまでも残ってしまうバグ ・1分毎にメンバーがチャット画面にいるかいないか判定する方法(一定期間たっても発言しなかったらチャットにいないと判定されないようにする) ・もしくはページを閉じたら、メンバー名のかかれたファイルから即座にメンバー名を消す方法 ・もしくはそれ以外でページを閉じたら、メンバー名のかかれたファイルからメンバー名を消す方法 はないでしょうか? この2つのバグを何とかできたら基本のチャットシステムは完成なので(残りは面しろ機能をどんどん追加するだけ・・・っと言うよりはさっさと次のプログラムを作った方がいい気もするけれど)是非教えてくださいませ。 (また新たなバグが見つかったら対処しないといけませんが) それとチャットを今まで作った感想ですが、ただのチャットを作るのにもいろんな処理を施す事が分かりました。 機能を一つ追加するだけでも結構勉強になりますしね。 まともなチャットを一つでも作ることはプログラムの勉強に大いに役立つと思います。 いろいろ考えないと思った物が出来ませんしね。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- ORUKA1951
- ベストアンサー率45% (5062/11036)
・1時ぐらいに時間を設定して、1時間以上ロムされればユーザー管理から名前を消す(現実的かも、だけど最終発言から1時間名前が消えてくれない) ・5分に時間を設定して、5分以上ロムされればユーザー管理から名前を消す(他ユーザーは不思議がる) ・手動更新そのものを廃止する(う~~~ん悩む) もNo.2の回答ですむはずです。難しくしないこと、利用できる環境変数は使うこと。
- ORUKA1951
- ベストアンサー率45% (5062/11036)
チャットデータ number(time),username,comment,IP,userAgent ユーザーデータ userName,loginTime,logoutTime,lastGetTime,cookieData ユーザーから要求があると、 HTTP_COOKIE,HTTP_REFERER,REMOTE_ADDR,HTTP_USER_AGENT,PATH_INFO を解析します。 HTTP_COOKIE ・前回データを受け取ったときのタイムスタンプ ・userName ・パスワード ・reflesh間隔 HTTP_REFERER ・呼び出し元(継続していれば掲示板URL) REMOTE_ADDR,HTTP_USER_AGENT ・ユーザー特定--特に必要ではない PATH_INFO ・使用している掲示板 HTTP_COOKIEのタイムスタンプは、reflesh間隔と比較することで、「(無断)退室していたか」が分かります。 ※クッキーの有効期限は、十分長めにしておきます。通常は一ヶ月、もしくは制限なしで良いです。同じ名前(name)、ドメイン(domein)、パス(path)で発行されると上書きされます。 ポイントは、reflashされるたびに、userファイルを点検して書き直すだけでよいです。また、チャット画面が呼び出されるたびに使用中のuserデータはチェックしているはずですから、そのときに一定時間、ないし最後の要求時間にreflash間隔を加えたものを目安に、userファアルに退出を書き込み、画面には「***さんは退出された模様」とでも表示すれば良いです。 >ページを閉じたらモード指定のクッキーを消す方法 これはありません。cookieはサーバーからデータが送られてくるときの応答ヘッダに含まれているものですから >もしくは、最初にページを見られた時にモード指定のクッキーを消す方法 前述しましたが、name,domain,pathの値が同じでしたら上書きされます。 >もしくは、それ以外でページを閉じたら入室画面にいけて、 退出手続きをせずにブラウザを閉じてしまうと、ユーザーファイルの更新履歴との時間差が大きくなります。 >自動更新した時はチャット画面にいける PATH_INFOとHTTP_REFERERと、HTTP_USER_COOKIEです。 たとえばチャットプログラムが hoge.com/chat だとします。 userがはじめと訪問する場合はCOOKIEがありませんから、案内ページが表示されます。ここでユーザー登録をしてもらう。メールアドレスに確認画面のURLを送付するなり、他の手段を用いて検索エンジンなどのロボットや故意の悪戯を防止します。 ユーザー登録が済めばそれぞれの部屋の使用状況を表示しても良いでしょう。 その後、PATH_INFOによる部屋を選んで進みます。 <a href="hoge.com/chat/room1">部屋一</a>へ ここで要求があれば、HTTP_REFERERはhoge.com/chatですから、玄関からの入室が分かりますから、該当する部屋のチャットデータとユーザーデータを作成し、cookieを発行してページを表示する。 通常のreflashは、hoge.com/chat/roome1からですね。PATH_INFOは/chat/roome1になります。 と言う風に進みます。 いきなり書き始めずフローチャートを書いてはじめたほうが効率的です。
- ORUKA1951
- ベストアンサー率45% (5062/11036)
⇒車輪の再発明( http://ja.wikipedia.org/wiki/%E8%BB%8A%E8%BC%AA%E3%81%AE%E5%86%8D%E7%99%BA%E6%98%8E )のような気がしないでもないですが・・・ Cookieは要求時にブラウザがつけますし、応答時にサーバーが付与しますから都度書き換わります。 cookieと、最後のアクセス時間を照合すれば良いでしょう。 どのページから来たかは、HTTP_REERERで補足できるはずです。 ファイル自体は、追記していくだけです。 ・発言記録を時系列で積み上げていくファイル 表示プロセスでどれを表示するかを決めればよい ・ユーザー管理のファイル の二つを用意すれば良いです。二つを分けておくのが味噌
お礼
っと今おもいついたのですが例えば利用者A、利用者Bの2人の利用者がいるとして たとえロムを続けたとしても、自動更新時に記録に残せますよね そして途中でページを閉じてしまった場合、自動更新時に記録した時間が最後にアクセスした時間で一番長くても5分ですから、それ以上の時間記録がなければ名前を消すという処理を行えば、確かにユーザー管理ファイルからユーザー名を消せますね。 ただ、それは誰かがページを利用してたらの場合・・・ああ、誰かがページを見たときにユーザー管理のファイル名から最後の記録から5分以上立った人がいた場合、名前を消す処理をすればいいんだ ただタイミング悪く入れ違いで入ってきたらおかしなバグと思われるかもしれませんが、問題2はほぼ解決ですね 問題は30秒、1分、3分、5分といいましたが時間がない手動更新の場合はどうするの? って事ですね その点は質問時に全く触れませんでしたが ユーザーが手動更新を選んだ場合、どうするかの解決法 ・1時ぐらいに時間を設定して、1時間以上ロムされればユーザー管理から名前を消す(現実的かも、だけど最終発言から1時間名前が消えてくれない) ・5分に時間を設定して、5分以上ロムされればユーザー管理から名前を消す(他ユーザーは不思議がる) ・手動更新そのものを廃止する(う~~~ん悩む) ってところですね問題2はほぼ解決できました ありがとうございました 問題1は引き続きどうすればいいかの案をお願いします
補足
広く受け入れられ確立されている技術や解決法を知らずに(または意図的に無視して)、同様のものを再び一から作ること」を意味する。 確立する技術はたしかに知りませんね 参考例が見つからないため(C言語で作ってるため) <<cookieと、最後のアクセス時間を照合すれば良いでしょう。 すみません ここのところをもう少しく説明していただけますか? 最後のアクセス時間の記録方法が分かれば2つの問題が解決すると思うので << ・発言記録を時系列で積み上げていくファイル 表示プロセスでどれを表示するかを決めればよい ・ユーザー管理のファイル の二つを用意すれば良いです。二つを分けておくのが味噌 この2つは用意してますよ