4

我正在試圖爲Comet提供一個實用的客戶端(JavaScript)實現。 http://en.wikipedia.org/wiki/Comet_(programming))談論這個理論,但我很難找到一個有效的實現。我明白這裏有一個很好的服務器端要求,但我只對客戶端部分感興趣。彗星的客戶端技術

具體我想回答的問題是 -

  1. 我如何在JavaScript中檢測到連接已經 成功建立。例如。如果我要使用腳本標記 長查詢方法,並且瀏覽器永遠無法訪問服務器, 我該怎麼知道?
  2. 當長時間輪詢時,如果服務器沒有響應,則瀏覽器最終會進入「請求超時」狀態。 如何在Javascript中檢測到並重新建立長期民意調查?
  3. 如何確保我的技術可以跨瀏覽器使用?基本上我想要 知道正確的方法組合(腳本標籤,xhr等), 覆蓋大多數瀏覽器。

我試着尋找Comet框架,但是我發現每個框架(CometD,Atmosphere)等都帶有服務器端實現,並且使得客戶端交易對用戶透明。然而我試圖找出他們如何實現客戶端的壯舉。我有我自己的服務器實現和協議。

謝謝。

+0

這些都是人們一直試圖回答的大問題。祝你好運! – Kristian 2012-03-10 21:40:08

回答

1

以下是我公司如何解決這些問題:

1)如果你可以讓沒有立即收到一個錯誤的連接,你還挺有假設已建立連接。如果你沒有立即收到答覆(不好或不好),你只需要假設它正在工作......這使得一些強大的客戶端客戶端,所以智能地使用序列ID很重要。

2)馬上再試一次。通常服務器會在客戶端執行前超時,併發送一個錯誤代碼,告訴您發生了什麼。只要確保在服務器端使用類似20秒的合理輪詢時間即可。

3)您必須使用不同的域名,而不是其他請求到同一服務的機器並使用jsonp。例如,如果您的頁面是從example.com託管的,那麼通常會有一個chat.example.com子域名,因爲大多數瀏覽器一次只允許3個或4個打開的連接到相同的域名。由於相同的原產地政策,Jsonp是必要的。除此之外:測試,測試,測試。

瑞恩·達爾(node.js的創造者),有一個非常簡單的聊天客戶端/服務器實現的位置:https://github.com/ry/node_chat

祝你好運!

1
  1. 如果運輸是一種長期投票,你不能知道這一點。當我在jQuery套接字中設計長輪詢傳輸時遇到了同樣的問題,因爲套接字對象在連接建立時觸發了open事件。所以我添加了一條規則,即當服務器收到第一個長輪詢請求時,服務器必須立即作出響應,告訴客戶端服務器接受此請求並建立連接。有關您的信息,如果第一個長輪詢請求沒有在指定的超時時間內完成,則套接字對象會觸發事件close

  2. 我同意@ Hersheezy的回答。再試一次。

  3. 測試是答案。傳輸的組合依賴於您的瀏覽器應用程序和服務器應用程序的環境。例如,如果您將支持IE6,但不支持跨域連接和移動設備,則不需要使用長輪詢傳輸。只需使用WebSocket,Server-Sent Events和HTTP Streaming傳輸就足夠了,如果你沒有能力準備WebSocket服務器,那麼正確的傳輸將是Server-Sent Events和Streaming。

我一直在做的jQuery Socket這是agonastic JavaScript庫服務器,並提供了基於瀏覽器的應用程序接口。也許這會對你有所幫助。目前,它是pre-alpha版本,我正在編寫一個涵蓋服務器端處理的文檔。

謝謝。