私はこれについての解決策をかなり長い間探していましたが、サイコロはありません。
編集: チャット サーバーを作ろうとしているとは言いませんでした。人々がログインすると、その ID が ausers
および alisteners
リストに追加されます。そして彼らはチャットを始めます。ただし、いずれかがタブまたはブラウザを閉じようとしても、ユーザーが両方のリストから削除されることはないため、ログインしたままになります。
Edit2: 上記の番号付けが少しわかりにくいと思ったので、スクリプトの下部にもその部分を投稿しました。
これまでのところ、 on_connection_close() 関数 (起動されることはありません。理由はわかりません)、on_finish()
関数 ( a が呼び出されるたびに起動されるfinish()
) を試したので、どちらも法案に適合しません。 .
今、私は関数を含む少しの解決策を考え出しましたon_finish()
:
UpdateHandler
クラスのpost()
関数が呼び出されるたびにself.done = 0
設定されます。finish()
関数が起動される直前に、を設定しself.done = 1
ました。- これで
on_finish()
関数が呼び出さself.done
れ、コンソールに出力され、1 になります。 - 同じ
on_finish()
関数でIF
self.done = 1
ステートメントを実行すると、期待どおりに返されTRUE
、Tornadoio_loop.add_timeout
がパラメーターを使用time.time()+3
して (ユーザーが Web サイト内の別のページに移動したか、Web サイトから完全に離れたかを確認するために 3 秒間スリープするように) とコールバックそれは最終的に呼び出されます。 - 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 つのスペースでインデントしてください。編集の詳細については、[?] ツールバー アイコンをクリックしてください。