2009-06-08 78 views

回答

8

號的客戶端必須 「民意調查」 repeatadly服務器。

我認爲這裏的關鍵是要考慮交互設計。訣竅是欺騙用戶認爲聊天是即時的,但實際上每隔1或2或3或10秒更新一次。

思路:

1)當用戶發送消息時,在聊天直接顯示它並觸發輪詢。

2)如投票回來與來自其他用戶的多條消息,不添加一次全部,實際上它們添加一段1-2秒左右,隨機間距,使它看起來像他們「即刻」獨立進入。(如果一串消息立即進入,用戶很快意識到在那裏然後連續更新了聊天)。

3)如果用戶空閒了x時間。每10秒左右將投票率降至一次。

4)如果用戶處於活動狀態,即發送大量消息,則更頻繁地進行輪詢。

5)爲您寫入聊天上次更新時間的每個頻道設置一個靜態文件。例如,文件chat-teenfun-lastupdate.txt的內容爲1224934239或您喜歡的任何時間格式。靜態提供此文件並讓客戶端輪詢此文件以檢查通道是否已更新,而不是調用chat-poll.php?ch=teenfun進行動態檢查。根據動態腳本所涉及的工作,靜態文件的速度大約提高10-100倍,而當您獲得250多個用戶輪詢時,您將需要它。

祝你好運,玩得開心!

/0

PS。 另外,你可以讓客戶端實現對服務器的ajax調用,並讓它們「掛起」。這就是你接受他們的請求,並假裝開始發回數據,但你只是暫停。當事情發生時,您可以使用適當的數據完成響應。爲此,我相信你需要編寫自己的HTTP服務器,具體做這個,因爲你不能在內存中存儲250個php進程。也許Lighttpd可以以某種方式用於這種LUA緩存模式。我不知道。雖然會很有趣。地獄我得嘗試一下:)

1

只要沒有HTTP推送技術,您將永遠不會只使用JavaScript進行實時聊天。

可能workarrounds:

  • 使用Flash電影或Java小程序在服務器端執行一些socket通信
  • 保持輪詢請求回幾秒鐘
+1

你知道,這裏有一些在PHP/JS這樣的事情的現實生活中的例子?我也爲我的工作寫了一篇文章,是的,它有侷限性,但這不是不可能的。即使沒有推技術。 – elcuco 2009-06-08 17:02:39

+0

實時對我來說實時(連接速度除外)...但你是對的:外面有很多事情,真的感覺像實時... – TheHippo 2009-06-08 17:10:26

6

肯定有,但我認爲這對很多用戶來說效率不高。您可以做輪詢每個客戶端輪詢服務器,看看是否有任何新的消息,或者你可以使用comet technique,其中服務器可以推送新郵件到客戶端 - 退房的Comet plugin for XAJAX。如何使用XAJAX和PHP來實現這一點超出了我的想法,但我將如何嘗試實現它。

讓每個客戶端連接到服務器(登錄等),則:

  1. 對於由客戶端(發送者)發送的每個消息更新消息隊列客戶端(接收器)
  2. 讓客戶端輪詢服務器爲隊列中的新消息/通過慧星推送新消息。
  3. 如果有新消息,則更新GUI。
  4. 清洗,泡沫,重複

使用像ejabberd一個真正的IM服務器可以很長的路要走,更高效,讓用戶可以通過桌面客戶端連接(如果這就是你想要的)。我可能會使用它作爲後端,IOW ejabberd將是服務器,PHP將是使用XMPP in PHP的客戶端,並充當webgui的代理。

參見:
Google Techtalk on Gmail's chat feature (and scalability issues)

這是我的$ 0.02

0

我見過的最好的策略是做一個AJAX請求消息,然後重新啓動完全相同的請求,一旦完成。

在服務器端,使腳本「停頓」60秒或直到收到新消息。這將保持打開相同的連接最多60秒,但是當接收到新消息時,它會輸出並立即停止,提示客戶端AJAX打開另一個連接。

這提供了幾乎即時的新消息通知,並且在服務器上比每隔x秒創建一個新連接要容易得多。

1

您可以使用websockets,但作爲一個新的HTML5功能它是有限的。對你來說幸運的是socksjs,它在不處理它的瀏覽器上實現了websockets。

在主機方面,您應該可以使用任何websockets服務器,PHP有一些。

1

如果您正在尋找實施使用PHP/JSP等腳本語言編寫的聊天服務器,掛起HTTP連接的技術將不得不從您的選項列表中勾選。原因是大多數網絡服務器(特別是共享主機)不喜歡太多的連接掛起。

您可以在"Optimized Chat Server Protocol for Server Side Scripting Languages"出版物中找到實現Web客戶端和PHP聊天服務器所需的一切。