Google App Engine Channel API を使用して、「マスター」デバイスと複数の「リモート」間の双方向接続をサポートするアプリがあります。データ消費を節約するために、「マスター」はデータストア エンティティに記録されているリモート デバイスにのみデータを送信します。次のようになります。
{"ag5zfnBhbmRvcmEtaG9tZXIVCxINU29ja2V0U2Vzc2lvbhjZswEMremote1": "AHRlWrqfFk1Od_9FMObXMnbQRV0NPlAD41aRaYCZ8-dzpAV4aZI-6XjGqhlRBbGL8P4slwTUTw4mI2Mb8VgqWSnMbNyO7ewRHCwVnqCvY9vA-XS4vyESFlNS3nRbdeEjuCXEXMSMxiguixfjPDF5fiseQkXm2SOp2c0YD6onfM7PpN6gGDicH5A", "ag5zfnBhbmRvcmEtaG9tZXIVCxINU29ja2V0U2Vzc2lvbhjZswEMremote0": "AHRlWrr5tXCamZ5fN4z8LUM1Wj_60GFNYS7kOEokAM_QeAAL7nlYo5EDuYeEpz_kepwK-k1kQ543jDeTLmUXws9n_3L-ty1rsYUN3SIILfaf4_4UXDVujj6tWed2nmXvbZ8ScX7dOilJBjc_xdvIu6NRDhqe-Pt1oinRXcsAc_NpDFQEOs_5bH8"}
これは、チャネル キーをトークンに一致させる単なるキーです。エンティティは、どのリモートがオンラインで、どれが再利用可能で、いつ期限切れになるかを判断することもできます。これらは、チャネル プレゼンス インバウンド ハンドラーを使用して追加され、切断ハンドラーによってもエンティティから削除されます。ただし、これらのデバイスはいつでも切断される可能性があるため、リモートごとにチャネル トークンを再作成することは現実的ではありません。したがって、サーバーに接続するとき、サーバーは有効期限が切れていない古いトークンが使用されていないかどうかを確認し、データストア エンティティのキーツートークン ルックアップを介して古いチャネル トークンを返すことで、リモート デバイスにそれを使用するように指示します。
チャネルはデータを正常に受信しますが、チャネル プレゼンスは接続要求を受信しません。さらに興味深いことに、リモートが切断されたときに ping を取得することはありません。これは、iPhone (リモート プラットフォーム) のサファリで unbeforeload の問題が原因である可能性が最も高いです。ただし、開発サーバーでは完全に機能します。これはバグですか、それともこの方法でのトークンの再利用が信頼できない可能性がありますか?
注 リモートが古いトークンを使用するか新しいトークンを使用するかを決定する際に、新しいリモートの存在のデータストアを更新することもできますが、ソケットが実際にクライアント。
EDITさらに、別のリモートが使用しようとする前にリモートトークンが約4〜8分間非アクティブであった場合、この現象は発生しないことがわかりました。
EDIT2 さらに、iPhone を使用している場合、新しいトークンまたは古いトークンの使用に関係なく、チャネルは信頼できる接続の数分後にほとんどの場合 onerror ハンドラーをトリガーすることに気付きました。ただし、ラップトップではこれは発生しません。