GCM XMPP 交付回执发送其他机器,GCM 收到其确认后关闭连接

Posted

技术标签:

【中文标题】GCM XMPP 交付回执发送其他机器,GCM 收到其确认后关闭连接【英文标题】:GCM XMPP delivery receipt send other machine and GCM closes connection when receive its ack 【发布时间】:2015-09-05 19:34:35 【问题描述】:

我有一个应用程序在两台机器上运行,每台机器都通过 TCP(XMPP) 通过 GCM 建立了连接。

我遇到的一个问题是,通过一个带有“delivery_receipt_requested”标志的连接发送 xmpp 消息,并不一定意味着在同一连接上接收该消息的回执。这显然是很成问题的,因为连接可能建立在不同的进程上,有时是在不同的机器上。

另一个问题是机器接收到的delivery_receipt(它不发送原始消息)尝试向GCM发送delivery receipt ack,GCM关闭了这个连接。

看起来很奇怪吗? GCM 将送达收据发送到其他机器,当它从该机器接收到delivery receipt ack 时,它会关闭连接,因为该机器没有发送消息?

【问题讨论】:

发现类似问题***.com/questions/30493683/… 另一个类似问题qnalist.com/questions/6061020/… 【参考方案1】:

我找到了连接关闭的原因。我有很多连接,我的应用程序通过连接池中的任何连接将 delivery_receipt_ack 发送到 GCM。一段时间后,谷歌发送 XMPP 错误并显示“收到比预期更多的确认”,然后连接被关闭。

这种通信模型会导致连接关闭的问题,正确的做法是使用接收到的连接deliverty_receipt来发送delivery_receipt_ack,也就是说使用相同的连接发送delivery_receipt_ack来响应delivery_receipt就可以解决问题。

【讨论】:

【参考方案2】:

是否必须发送确认收据?到目前为止,我没有发送任何问题,除了电话连接不良时的巨大延迟,例如来自外国。

【讨论】:

如果你不发送delivery_receipt_ack,GCM会发送很多delivery_receipt。 developers.google.com/cloud-messaging/ccs 回执消息 ID 由原始消息 ID 组成,但带有 dr2: 前缀。您的应用服务器必须使用此 ID 发回一个 ACK​​,在本例中为 dr2:m-1366082849205。

以上是关于GCM XMPP 交付回执发送其他机器,GCM 收到其确认后关闭连接的主要内容,如果未能解决你的问题,请参考以下文章

使用 XMPP 关闭 GCM 连接服务器的套接字

如何使用 Spring Integration 发送 gcm xmpp 消息?

不保证 Gcm 交付

如何通过xmpp gcm将ack从android应用程序发送到服务器

通过 GCM 和 xmpp 输入状态/在线状态

发送 GCM 上游消息后收到空推送消息