首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ajax轮询聊天在快速聊天的消息接收前端复制。

Ajax轮询聊天在快速聊天的消息接收前端复制。
EN

Stack Overflow用户
提问于 2015-04-23 10:35:53
回答 2查看 268关注 0票数 4

我开发了一个javascript chat (后端上的php),使用:

代码语言:javascript
复制
1) long-polling to get new messages for the receiver 
2) sessionStorage to store the counter of messages  
3) setInterval to read new messages and if sessionStorageCounter < setIntervalCounter then the last message is shown to receiver.
4) javascript to create,update and write the chat dialogues

该模块工作正常,但是当用户进行快速聊天时,接收方的前端会收到两到三条相同的消息(计数器没有失败,查询也没有提供双重插入)。

代码似乎是正确的(这就是我没有提供代码的原因),所以间隔延迟可能是原因(在减少间隔延迟时,没有任何变化)。

您认为上面的模式是错误的实践吗?您认为哪种模式可以消除错误?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-30 02:38:09

如果我自己解决这个问题(而不是使用一个已经处理这个问题的现有库),我的方法是:

  • 让服务器在到达时为每条消息分配一个唯一的ID (GUID)。
  • 在客户端上,存储最近收到的消息的ID。
  • 当轮询新消息时,使用成功接收的最后一条消息的ID进行轮询。然后,服务器通过在自己的队列中查找该消息并重播所有后续消息来进行响应。
  • 为了防止“丢弃”消息,每条消息还可以携带即时消息的ID (允许客户端进行一致性检查)。

如果重新轮询确实导致副本从服务器传递到客户端,则在每个消息中存在唯一的If使得消除它们变得微不足道。将服务器端消息队列视为事件流,每个客户端跟踪其最后读取的位置。客户端不会猜测消息的适当顺序,有多少条消息,等等,因为它的状态完全由‘我看到了什么’组成,几乎没有机会失去同步。

票数 5
EN

Stack Overflow用户

发布于 2015-05-04 17:19:56

因为它是实时聊天,所以setInterval间隔可能很小,可以同时向服务器请求两三次新消息。确保服务器处理程序是同步的,并且它忽略了来自同一个用户的重复查询。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29820912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档