我的应用程序支持使用Google App Engine渠道API在“主”设备和多个“遥控器”之间建立双向连接。为了节省数据消耗,“主”仅将其数据发送到已在数据存储实体中记录的远程设备。它看起来像这样:
{ “ag5zfnBhbmRvcmEtaG9tZXIVCxINU29ja2V0U2Vzc2lvbhjZswEMremote1”: “AHRlWrqfFk1Od_9FMObXMnbQRV0NPlAD41aRaYCZ8-dzpAV4aZI-6XjGqhlRBbGL8P4slwTUTw4mI2Mb8VgqWSnMbNyO7ewRHCwVnqCvY9vA-XS4vyESFlNS3nRbdeEjuCXEXMSMxiguixfjPDF5fiseQkXm2SOp2c0YD6onfM7PpN6gGDicH5A”, “ag5zfnBhbmRvcmEtaG9tZXIVCxINU29ja2V0U2Vzc2lvbhjZswEMremote0”: “AHRlWrr5tXCamZ5fN4z8LUM1Wj_60GFNYS7kOEokAM_QeAAL7nlYo5EDuYeEpz_kepwK-k1kQ543jDeTLmUXws9n_3L-ty1rsYUN3SIILfaf4_4UXDVujj6tWed2nmXvbZ8ScX7dOilJBjc_xdvIu6NRDhqe-Pt1oinRXcsAc_NpDFQEOs_5bH8”}
它只是一个将频道键与令牌匹配的键。然后,该实体还可以确定哪些遥控器在线,哪些可以重复使用以及何时到期。它们使用通道存在入站处理程序添加,并通过其断开处理程序从实体中删除。但是,由于这些设备可能随时断开连接,因此为每个遥控器重新创建通道令牌是不切实际的。因此,当连接到服务器时,服务器会检查是否有任何未过期的旧令牌未使用,并通过将旧通道令牌通过密钥返回到数据存储区实体中的令牌查找来指示远程设备使用它。
当频道按原样接收数据时,频道存在不会收到连接的请求。更有趣的是,当远程断开连接时,它永远不会得到ping,这很可能是由于iPhone(远程平台)的safari中的unbeforeload问题。但是在开发服务器中它完美运行。这是一个错误还是以这种方式重用令牌是不可靠的。
请注意 虽然我可以在确定遥控器是否应该使用旧的或新的令牌时更新新遥控器存在的数据存储,但我宁愿使用频道存在作为更清洁的方法来验证插座实际上是否与客户端连接
EDIT 此外,我发现如果远程令牌在另一个远程尝试使用之前已经处于非活动状态大约4-8分钟,则不会发生此现象。
EDIT2 此外,我注意到,当使用iPhone时,无论使用新旧令牌,通道几乎总是在可靠连接后几分钟触发其onerror处理程序。但是,在笔记本电脑上这不会发生。