如何检查通过 socket-io 发送的消息是不是被读取?

Posted

技术标签:

【中文标题】如何检查通过 socket-io 发送的消息是不是被读取?【英文标题】:How do I check if a message sent through socket-io is read?如何检查通过 socket-io 发送的消息是否被读取? 【发布时间】:2016-06-27 21:11:42 【问题描述】:

我在节点上使用 socket-io 来管理聊天应用程序。

我想知道,一旦收到消息,我如何检查消息的“已看到”和“未看到”状态。 jquery上有活动吗?我不确定我是否应该从 jquery 或 socket-io 端管理它。谢谢!

【问题讨论】:

html5 页面可见性 API 怎么样? developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API 【参考方案1】:

您必须实现自己的逻辑,以便在阅读消息时发回响应。 没有这样的 socket-io jquery 事件可以在读取时触发。Yon 可以通过检查选项卡当前是否处于活动状态来在收到消息时发出消息,因为如果选项卡当前处于活动状态,您可以考虑读取消息的方式或您的聊天窗口已打开。

【讨论】:

谢谢!如果我可以要求完成这个问题,我将如何继续检查选项卡是否处于活动状态? @J.Gal - 你会尝试在 window.onfocus 和 window.onblur 事件上设置一个标志。以下 sn-p 已在 Firefox、Safari 和 Chrome-var isActive 上测试过; $(window).focus(function() isActive = true; ); $(window).blur(function() isActive = false; );【参考方案2】:

阅读消息后,您必须发回消息。在 socket.io 中没有“读取”某些内容的概念。

这是您必须在自己的用户界面中发明的东西,当您认为它已阅读时,您可以向发件人发送一条消息,表明它现在已阅读。除非每封邮件都需要一些操作才能打开它才能阅读(就像电子邮件经常做的那样),否则很难知道收件人何时真正“阅读”了它。在典型的聊天程序中,消息只是自动显示,您不知道收件人是否正在查看它。

【讨论】:

这是有道理的,但是“阅读”意味着消息已“传递”,而不是用户实际阅读。示例:假设用户正在一个选项卡上浏览 reddit,并且消息已发送。它仍然没有读。这就是我想要区分的。 @J.Gal - 你的服务器不知道它是什么时候交付的吗?如果收件人不在线,您是否在服务器中排队消息,然后当用户在线时您发送它?如果是这种情况,那么当您的服务器可以将消息传递给收件人时,您只需要从您的服务器将消息发送回发件人即可。你没有在这里解释你的服务器架构,所以这只是一个想法。 是的,我明白你的意思,但我的兴趣还是想知道消息何时被阅读,而不是被传递。我认为服务器在那里没有什么可做的,我想由客户端来确定用户是否在聊天页面中。 @J.Gal - 如果浏览器没有加载聊天页面,则没有任何内容可以发送聊天消息。您的服务器将无法交付它。您的服务器应该能够告诉发件人是否是这种情况。如果聊天页面加载到收件人浏览器中,则该页面中的代码可以决定您想要“阅读”的含义,并且可以在发件人认为满足条件时将“已阅读”消息发送回给发件人。跨度> @J.Gal - 你没有详细描述你希望它如何工作或你的系统如何工作,所以我们很难提出具体的建议。通过编辑您的问题以解释您的架构的所有这些额外细节以及您想要“阅读”的含义,您的问题可以得到很大改善。【参考方案3】:

为了管理已见/未见,我们需要在从用户接收/读取后触发背景消息,这就像确认回执。很简单。

【讨论】:

以上是关于如何检查通过 socket-io 发送的消息是不是被读取?的主要内容,如果未能解决你的问题,请参考以下文章

Socket-io客户端不断发送连接请求

如何检查通过 FCM 发送到主题的消息的统计信息?

Flask Socket-IO 服务器客户端不通信(使用 tweepy 和 twilio)

如何让我的 Python Discord 机器人检查消息是不是由机器人本身发送?

如何检查消息是不是在后台与应用程序挂起

socket-io广播