0

我有一个应用程序支持使用 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(远程平台)的 safari 中的 unbeforeload 问题。但是在开发服务器中它工作得很好。这是一个错误还是以这种方式重用令牌可能不可靠。

注意虽然我可以在确定遥控器是否应该使用旧令牌或新令牌时更新新遥控器存在的数据存储,但我宁愿使用通道存在作为更清洁的方法来验证套接字是否确实与客户。

编辑此外,我发现如果一个远程令牌在另一个远程尝试使用它之前已经处于非活动状态大约 4-8 分钟,则不会发生这种现象。

EDIT2 此外,我注意到在使用 iPhone 时,无论使用新令牌还是旧令牌,通道几乎总是在可靠连接后几分钟触发其 onerror 处理程序。但是,在笔记本电脑上不会发生这种情况。

4

0 回答 0