4

私はこれについての解決策をかなり長い間探していましたが、サイコロはありません。

編集: チャット サーバーを作ろうとしているとは言いませんでした。人々がログインすると、その ID が ausersおよび alistenersリストに追加されます。そして彼らはチャットを始めます。ただし、いずれかがタブまたはブラウザを閉じようとしても、ユーザーが両方のリストから削除されることはないため、ログインしたままになります。

Edit2: 上記の番号付けが少しわかりにくいと思ったので、スクリプトの下部にもその部分を投稿しました。

これまでのところ、 on_connection_close() 関数 (起動されることはありません。理由はわかりません)、on_finish()関数 ( a が呼び出されるたびに起動されるfinish()) を試したので、どちらも法案に適合しません。 .

今、私は関数を含む少しの解決策を考え出しましたon_finish():

  1. UpdateHandlerクラスのpost()関数が呼び出されるたびにself.done = 0設定されます。
  2. finish()関数が起動される直前に、を設定しself.done = 1ました。
  3. これでon_finish()関数が呼び出さself.doneれ、コンソールに出力され、1 になります。
  4. 同じon_finish()関数でIF self.done = 1ステートメントを実行すると、期待どおりに返されTRUE、Tornadoio_loop.add_timeoutがパラメーターを使用time.time()+3して (ユーザーが Web サイト内の別のページに移動したか、Web サイトから完全に離れたかを確認するために 3 秒間スリープするように) とコールバックそれは最終的に呼び出されます。
  5. 3秒後、self.doneまだ1に等しいかどうか、またはユーザーがまだWebサイトにいる場合は0になることを確認したい.

ところで、サーバーは 30 秒ごとに接続を終了し、ユーザーに通知を送信して新しい接続を開始し、接続がタイムアウトしないようにします。クライアントがブラウザーを閉じて 30 秒の長いタイムアウトが経過すると、サーバーは通知を送信しようとします。クライアントがまだ私の Web サイトにある場合は、新しい接続を開始し、post()上記の UpdateHandler クラスの関数を呼び出して設定します。変数を 0 に戻します (これが、3 秒のマージンself.doneを与えた理由です)。io_loop.add_timeout

これで問題が解決したので、先に進んで、それがどのように機能するかを試してみたいと思いました. サーバーを起動し、ブラウザーを開いて正しい URL に移動し、サーバーがどのように応答するかを確認しました (printスクリプトにいくつかのステートメントを配置することによって)。ユーザーが接続を維持すると、post() 呼び出し (その時点で表示) の後self.done = 0に 3 秒間スリープし、その後コールバック関数が呼び出されますが、self.done = 1これは奇妙に出力されます。

これが最も効率的な方法ではないことはわかっていますが、思いつくことができる唯一の解決策であり、期待どおりに機能しませんでした。

結論:

誰かが良い代替案を持っていることを願っています。あるいは、私の理論の中で、私が見逃していて全体が壊れている点さえあることを願っています。クライアントが 30 秒のタイムアウトが終了するのを待たずにブラウザを閉じたことを Tornado に知らせる方法を本当に知りたいです。たぶん、開いている接続などにpingを実行します。少し調べてみましTORNADIOたが、あまり好きではありませんでした。もちろん、可能であれば純粋なトルネードでこれをやりたいです。

コードをできるだけ早く送信します。「フォーマット方法」などを30分ほど調べてみましたが、編集を送信しようとするとエラーが発生します。

  • あなたの投稿には、コードとして適切にフォーマットされていないコードが含まれているようです。コード ツールバー ボタンまたは CTRL+K キーボード ショートカットを使用して、すべてのコードを 4 つのスペースでインデントしてください。編集の詳細については、[?] ツールバー アイコンをクリックしてください。
4

2 に答える 2

0

私はこの問題を5〜6日間抱えていて、最終的に問題が何であるかを見つけました。実際には正確ではありませんが、解決しました。インターネットで検索してみましたが、何も見つかりませんでした。上記の投稿で、数か月前に同じスクリプトを試したときに機能したことを覚えていると言いましたが、nginx当時は使用について言及していませんでした。Apache + mod_proxyで苦労してきましたが、何が問題なのかわかりませんが、今回もう一度apache試してみるとうまくいきました!nginx

同じ問題がある場合(on_connection_closeが起動されない)「TRY」nginx。@Nikolayもあなたの助けに感謝します。

于 2012-09-23T01:20:43.730 に答える