2015-04-23 68 views
4

我已經開發一個JavaScript聊天(PHP的在後端)重複:Ajax的輪詢聊天使用得到在上迅速聊天消息接收器前端

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 

模塊工作正常,但是當用戶有一個快速聊天接收者的前端得到兩個或三個相同的消息,(既不是計數器失敗,查詢也不提供雙重插入)。

該代碼似乎是正確的(這就是爲什麼我不提供代碼),所以間隔延遲可能是原因(減少間隔延遲,沒有變化)。

您是否認爲上述模式是不好的做法,您認爲哪種模式可以消除錯誤?

+4

您可以在添加新的聊天消息之前始終檢查DOM,看看是否有相同的消息。這樣你就不會有同樣的信息兩次了, – Robin

+1

我給你的另一個建議是,如果你要在你的應用程序中進行實時聊天,你爲什麼不考慮在服務器端和客戶端使用socketio服務器在後端運行以提供聊天應用程序需求 – Robin

+1

您是否依賴任何時間戳服務器端? – Muggles

回答

5

我的方法,如果解決它自己(而不是使用已經處理這個現有的庫)將是:

  • 在服務器分配一個唯一的ID(GUID),以每封郵件的到達。
  • 在客戶端上,存儲最近收到的消息的ID。
  • 當輪詢新消息時,請使用成功接收的最後一條消息的ID進行輪詢。然後,服務器通過在自己的隊列中查找該消息並重播所有後續消息來作出響應。
  • 爲了防止「下降」消息,每個消息還可以攜帶緊前消息的ID(允許客戶做的一致性檢查)

如果repolling不會導致重複從服務器傳送到客戶端,每條消息上的唯一ID的存在使得消除它們變得微不足道。將服務器端消息隊列想象成一個事件流,每個客戶端跟蹤他們的最後讀取位置。客戶不會猜測消息的適當順序,有多少消息等等 - 因爲它的狀態完全由'我見過的'組成,所以幾乎沒有機會出現同步。

+0

非常感謝你! –

0

由於它是實時聊天,因此setInterval時間間隔可能足夠小,可以向服務器同時詢問兩到三次新消息。確保服務器處理程序已同步,並且忽略來自同一用戶的重複查詢。