解決 Long Polling Comet 會持續顯示讀取中的問題

标签: long polling comet | 发表时间:2011-06-26 10:55 | 作者:(author unknown) 丽维
出处:http://josephj.com/

持續顯示的狀態

使用 nodeJS 達成 Long Polling 的效果已經完成了一陣子(請參考 Browser 與 Server 持續同步的作法介紹),
但是有個問題一直被我們的 QA 拿出來唸,就是在 Tab 上及 window.status 的讀取狀態有時會一直顯示著範例連結):

原本會一直有讀取的狀態

對程式開發人員來說,這樣的問題沒什麼大不了,畢竟 Request 本來就尚未中斷,顯示也沒有不對
但對一般使用者來說則顯得相當不專業,感覺有什麼圖片一直無法讀取到
另外也懷疑許多其他的 Bug 是因此產生。

只有 Firefox 有此問題

同事都說他們實作 Long polling 時都沒碰到這樣的問題
我就覺得超級奇怪的,大家的作法應該都是一樣的啊:透過 YUI 的 JSONPRequest 去呼叫 nodeJS...
就拿出當時實作的範例來測(就是上面圖片的那一頁),才發現 IE 或 Chrome 都沒有此問題
因我主要是拿 Firefox 開發、其他兩位是拿 Chrome 來開發才會有此不同的認知。

參考其他網站的作法

雖然只有 Firefox 有這個問題,但還是得解...
就去看了 Plurk 及 Facebook 這兩個有即時更新的網站
發現這兩個網站即使在 Firefox 下也都沒有我碰到的問題...
有挖 Source Code 的必要性啦 ~~

1. Plurk 的作法

其實我記得很久以前噗浪也有跟我一樣的問題(有人有印象嗎?)
當時反而覺得能看到等待的狀態是件很屌的事、因為能實作 Comet 的網站很少啊 ...
發現噗浪是利用相同網域的 Iframe 去做 Long Polling

plurk-solution

我沒有去測試這樣是否能解決我的問題,因為沙盤推演了一下...
我沒辦法弄一個相同網域的 Iframe,所以必定得用 HTML5 postMessage() 的方法來溝通...
實作上對我較為複雜,所以就先擺在一邊。

2. Facebook 的作法

Okay,當下覺得 Plurk 的作法可能就是我要的了,多看一下 Facebook 的來做確認吧!
咦咦咦!Facebook 的作法居然跟我一樣、沒有用 Iframe,只是多了 async="" 的這個屬性?

facebook-solution

async 若有設定的意義為:「執行不遵守 Request 時的順序」,
看來好像跟我的問題有關連性,但是實作之後並沒有發生任何事情 :p

最終解法!

哇!卡關了,我不太想實作噗浪的方法。
只能求助 Google、找到了 StackOverflow 的一篇文章:
How to prevent my browser from showing “waiting for MyHostName” message during ajax Post/Get operation?
它的解法是在 window 的 load 事件後執行 Long Polling 的第一個 Request 即可避免
我嘗試了使用 YUI 的 DOMReady,一樣運作順利啊 :D

在 DOMReady 後跑就解決了

結語

對於噗浪為什麼要在 iframe 做我還是蠻好奇的,有機會再來研究研究。
另外我們先前有此問題時,發現它會暫停掉其他的 Request 直到 long-polling 中斷才發出去
如今解決了狀態顯示的問題,不確定是否有相依性,得再來觀察觀察。
對於 Long Polling 我真的還是小學生啊 :p

相关 [long polling comet] 推荐:

Browser 與 Server 持續同步的作法介紹 (Polling, Comet, Long Polling, WebSocket)

- Cary - 這樣做就對了!
記得兩年多前,第一次看到 Gmail 中的 GTalk 覺得很好奇:「咦. 線上聊天且是 Google 的熱門系統,只用傳統的 AJAX 應該會操爆伺服器吧. 」很幸運的,當時前公司內部的 Tech Talk 就有位同事分享這個叫 Comet 的技術、是種「為了讓瀏覽器與伺服器頻繁溝通所使用的技術、主要的瓶頸在於 WWW 伺服器上.

解決 Long Polling Comet 會持續顯示讀取中的問題

- 丽维 - 這樣做就對了!
使用 nodeJS 達成 Long Polling 的效果已經完成了一陣子(請參考 Browser 與 Server 持續同步的作法介紹),. 但是有個問題一直被我們的 QA 拿出來唸,就是在 Tab 上及 window.status 的讀取狀態有時會一直顯示著(範例連結):. 對程式開發人員來說,這樣的問題沒什麼大不了,畢竟 Request 本來就尚未中斷,顯示也沒有不對.

用Tornado打造WebSocket与Ajax Long-Polling自适应聊天室

- satan - keakon的涂鸦馆
这几天忙着研究Tornado,想着总得学以致用吧,于是就决定做个聊天室玩玩. 实际上在Tornado的源码里就有chat和websocket这2个聊天室的demo,分别采用Ajax Long-Polling和WebSocket技术构建. 而我要实现的则很简单:将这2种技术融合在一起. 就技术而言,WebSocket的通信开销很少,没有连接数的限制,但由于本身比较新,支持它的浏览器并不多(目前仅有Chrome 6+、Safari 5.0.1+、Firefox 4+和Opera 11+,且Firefox和Opera还因安全原因默认禁用了).

Long time no see,英式中文

- cow - 刁民公園
昨天「星期日檔案」探討港式英語. 節目中好幾個嘉賓包括楊鐵樑先生都說long time no see是港式英語. 楊官的英文程度不會令人懷疑,但long time no see有其背景,不能算作港式英語.

故事十八 STORY 18 by Sun Long

- Yao - Jia Za Zhi
假杂志邀请来讲第十八个故事的又是一位宁波的摄影师孙龙,因为要将的系列作品与大海相关,更是备感亲切. 孙龙的“海岸线”,与张晓在路上的、旁观的状态不一样,更多是一种身在其中的眷恋与深情,主观的情绪在一些细枝末节上若隐若显. 对于从小长大生活的地方,每个人都在自己的心里会藏着一些秘密、情绪,或者不露声色的痕迹.

反向Ajax,第1部分:Comet介绍

- 茫茫 - 译言-每日精品译文推荐
来源Reverse Ajax, Part 1: Introduction to Comet. web开发在过去的几年中有了很大的进展,我们已经远超了把静态网页链接在一起的做法,这种做法会引起浏览器的刷新,并且要等待页面的加载. 现在需要的是能够通过web来访问的完全动态的应用,这些应用通常需要尽可能的快,提供近乎实时的组件.

150行C代码的comet服务器

- - idea's blog
Comet 技术就是常见的 Web 服务器”推”技术, 用于向网页实时地推送数据. 最常见的 Comet 技术应用在网页聊天, 当然还可以应用于很多的方面, 如微博更新, 热点新闻推送, 股票即时行情等等, 甚至是网页游戏!. Comet 技术如此重要, 但市面上并没有真正流行通用的 Comet 服务器和解决方案, 比较知道的互联网公司大多是自己开发, 或者基于开源服务器进行二次开发, 例如基于 Jetty(一个开源 Java Web 容器), 而 Facebook 的聊天系统的 Comet 服务器是基于 Mochiweb(一个开源的 Erlang Web 服务器)..

comet 服务器 icomet 提供 Android API

- - 开源中国社区最新新闻
支持百万连接和 comet/push 服务器 icomet 日前提供了可用于 Android 移动开发的 Java API - iCometClient4j, 用于实现手机上的消息推送功能. 结合 icomet 的 HTTP endless chunk 模式, 可提供节省电池的长连接服务.. iCometClient4j项目地址: https://github.com/DuoZhang/iCometClient4j/.

基于Servlet3.0 comet http长连接

- - 互联网 - ITeye博客
基于 HTTP 长连接的“服务器推”技术. 浏览器作为 Web 应用的前台,自身的处理功能比较有限. 浏览器的发展需要客户端升级软件,同时由于客户端浏览器软件的多样性,在某种意义上,也影响了浏览器新技术的推广. 在 Web 应用中,浏览器的主要工作是发送请求、解析服务器返回的信息以不同的风格显示. AJAX 是浏览器技术发展的成果,通过在浏览器端发送异步请求,提高了单用户操作的响应性.

【转】使用 Java 实现 Comet 风格的 Web 应用

- - 互联网 - ITeye博客
您可能已经听说过 Comet,因为它最近受到了一定的关注. Comet 有时也称反向 Ajax 或服务器端推技术(server-side push). 其思想很简单:将数据直接从服务器推到浏览器,而不必等到浏览器请求数据. 听起来简单,但是如果熟悉 Web 应用程序,尤其是 HTTP 协议,那么您就会知道,这绝不简单.