2012-01-15 169 views
2

我想要做的是一個簡單的HTML5聊天室,沒有什麼奇特的,一旦有人說了一些東西,它會將它發送給當前連接到服務器的所有人,就是這樣。沒有存儲,沒有任何複雜。但它必須是靈活的,但我的網站應該能夠根據需要自動創建單獨的聊天室。我見過很多演示和示例,但它們都需要我安裝node.js或類似的需要終端訪問的東西(我沒有)。我目前正在其中一個免費的網站主機上運行,​​爲您提供一個ftp客戶端,一個mysql數據庫,一些php支持,就是這樣。有沒有辦法做到這一點?或者我錯過了一些東西,有沒有辦法在這些服務器上安裝軟件包?也許有人知道獲得終端訪問的方式?任何形式的幫助將不勝感激,謝謝。HTML5簡單聊天室

+1

如果你有root權限(你現在沒有權限),你可以安裝tornado/node.js等。現在你可以做聊天室了,只需發送很多ajax請求來檢查新消息,儘管它贏了不要那麼快。考慮購買VPS,如果你真的需要root訪問,它不會花費太多,但你可以安裝自己的軟件(改變Apache爲Nginx,龍捲風,卡桑德拉...) – therealszaka 2012-01-15 16:26:22

+0

你不能推動客戶端沒有像節點的工具.js文件。你應該檢查與服務器的間隔ajax,而不是推,嘗試谷歌:ajax聊天室拉 – 2012-01-15 16:26:52

+0

。 – 2012-01-15 17:05:15

回答

9

在那裏做過。正確的做法並不是微不足道的。

我認爲你必須做出一個重要的決定:你想讓聊天真的是瞬間的,或者可以等待2秒鐘的延遲,直到每個人都看到新的消息。

如果延遲沒有問題,您可以每隔2秒輪詢服務器以查看是否有新消息可用。沒有人喜歡延遲,但取決於你想做什麼,它可能並不是那麼糟糕。服務器然後會檢查每個請求上的數據庫/文件並返回更新。這是一個非常簡單的解決方案,它可以工作。 (如果你認爲每2秒輪詢一次浪費資源和服務器上不必要的負載...繼續閱讀,替代方案可能會更糟糕。)

完全即時聊天要求服務器可以立即發送新數據客戶,而不用等待客戶要求。 HTTP本身不支持這一點,如果你不想使用任何Flash/Java,我知道這樣做的唯一方法就是使用comet請求。這些請求(通常AJAX),將故意掛在服務器上,同時,將在隨後的瞬間精確返回時,新的數據是可用的需要被髮送到客戶端,或出現超時。每次彗星請求返回時,客戶端都會處理數據並立即發出另一個彗星請求,該請求將再次掛起,直到有新數據可用。我相信純HTML/JS中的每個聊天網站都是這樣做的(Omegle,Facebook等等)。

現在,這是比較容易的部分。但是,你如何在服務器上實現這一點?讓我們看看這種情況:聊天中有10個用戶,這意味着10個客戶端每個都會有一個等待新數據的懸掛彗星請求。其中一位用戶在聊天中寫入了一些內容,並導致向服務器發送附加請求以發佈文本。你如何在服務器上執行一個PHP腳本,導致其他10個執行停止等待並返回新數據? (你可以用Perl取代PHP,或任何其他的東西)。你需要一些允許腳本的幾次執行相互交談的東西。 (或PHP代碼本身可能是輪詢每秒鐘一個數據庫,但是又引入了延遲。)任何形式的進程間通信(IPC)的是在這些腳本語言困難的,尤其是你不知道什麼樣的模式的Web服務器用它來執行它們。例如,Apache可以爲每個請求設置一個進程,或者爲每個請求設置一個線程,或者兩者兼有。但是,也許你的主機使用IIS或其他東西,所以在這種情況下很難做IPC。我最終做的是在PHP中創建一個始終運行的服務器組件,其任務是在不同執行的PHP腳本之間傳遞消息。是的,這需要shell訪問。所有的PHP執行都將通過套接字連接到該服務器組件,並且消息可以傳遞。正確的做法很棘手,但最終效果很好。

不幸的是,彗星的要求是非常浪費的內存和CPU週期。我的Apache服務器有一個每個PHP執行模型。所以當聊天中有100人時,這意味着隨時有100個待處理的彗星請求,這意味着有100個Apache進程正在運行。即使一個新鮮的Apache進程只用了10MB,總共也只有1GB!這是很多的記憶,這些過程只是等待發生。聊天是一個令人難以置信的記憶豬。此外,這樣的聊天會產生很多請求:每當有人在聊天中說出某些內容時,所有100個請求都會返回,您將在此之後收到100個新請求。聊天中的用戶數量通常是用戶數的兩倍,意味着請求數量是其的四倍。而且你真的希望這是活潑的。 Apache並不總是如此高效地處理這個問題。有一些Web服務器軟件專門針對彗星請求進行了調整,並且可以很好地擴展,但這又需要更多的訪問服務器的權限。

所以爲了完整性,這裏是我的故事的結尾:在此期間,我拋棄了所有的PHP和完全改寫了聊天。在我看來,Apache以及PHP非常不適合這種任務。現在有一個Java服務器組件集成了一個高效的多線程HTTP服務器。我已經對壓力測試過了,它的表現非常好:連接了500個垃圾郵件客戶端,CPU使用率不會超過15%,內存使用量保持在150MB。這比我預期的要好得多。與Apache/PHP相比,它的響應速度也有了很大提高。最終結果可以在http://www.dark-chat.info/查看。儘管由於各種原因,聊天目前已經有些死架。隨着我獲得更多時間,這將有希望改變。

嗯,我知道這並不能幫助你,因爲你很受你的託管服務提供商的限制。沒有外殼訪問,實際上你只能做很多事情。如果你確定用2秒延遲(或使之1秒),你不同時預計超過20個用戶,你可以真的只是去投票。有一些方法可以優化這一點,例如,活躍用戶可以獲得1秒的民意調查,而那些很少寫點東西的人可以獲得5秒的民意調查。

也就是說,也許你也可以尋找某種託管解決方案。我確信有可以通過iframe嵌入的聊天內容。

好的,這比我想要的要長得多。但我希望它能幫助一些人。 :)

+0

感謝您的洞察力,剛剛完成了一個需要聊天室和聊天室的項目,您在這裏列出的發現已經爲我確認了一些事情。輝煌的職位! – Nick 2012-07-20 03:43:53

0

無需使用任何插件(Flash,Java,...)即可實現聊天的唯一方法是WebSocket。 (將服務器連接到一個特定的時間間隔來檢查一個新的消息是實現這一點的一種方式,但我認爲這太'骯髒'了...)。但是,我認爲網絡託管站點可能不提供WebSocket服務器。我建議你通過使用Java/Flash進行連接來創建一個IRC客戶端。如果您想使用HTML/JS製作UI,請在Flash中使用ExternalInterface或在Java中使用JSObject以在插件和JS之間進行通信。

0

我對此不能多說,但目前常用的技術是comet
在彗星你打開一個請求到服務器(例如像AJAX的東西),但你不關閉它。你只要保持它打開,但你只需要從服務器發送數據到客戶端。這項技術也需要一些特殊的服務器,但我認爲如果你有一點Google,你肯定會找到一種方法來實現Comet with PHP(但我認爲Python會更適合這樣的事情)...

希望這給你一些想法,如何解決你的問題:)

0

HTML 5有一個很酷的新功能稱爲網絡套接字,它允許真正的客戶端和服務器之間的雙向通信。但是,您不會找到任何便宜的共享託管計劃,這將允許您託管自己的Web Socket服務器。

您可以通過使用「老式」方式來僞造雙向通信:使用AJAX。基本上,客戶端JavaScript每隔幾秒向數據庫發出一個請求,以檢查是否有任何新的聊天消息要顯示。發佈新消息只需將該消息發佈到服務器。

彗星只是一個花哨的(更高效的,服務器端)的方式來做到這一點。

0

正如很多人所說,實現這一目標的流行方法是使用ajax,comet(或其他一些長輪詢機制)或WebSockets。

我的建議是使用WebSockets,但正如前面提到的,您的主機可能不允許您設置套接字服務器。

如果您遇到這種情況,我推薦使用Server Sent Events,這是另一個HTML5解決方案,它已被WebSockets所掩蓋。

它將允許您將事件發送到瀏覽器,並使其易於在PHP中實現。