2011-03-12 71 views
0

我正在嘗試爲某個網站創建聊天室之類的應用程序。對於這個我有兩個選擇:創建聊天室應用程序的問題

  1. 要使用socket編程,並在服務器上打開一個套接字和這個連接到所有誰是在聊天室的客戶端。爲此客戶首先下載聊天室的小程序。

  2. 只需以1秒的間隔連續向Ajax服務器發送請求並刷新頁面的聊天內容區域即可。

我不能決定哪個stretagy會更好。所以如果有人告訴我哪個資源密集程度較低,如果還有其他更好的選擇,那麼請告訴我。

其次我想使用存儲在服務器上的會話文件,它維護所有登錄用戶的會話。那麼我應該如何訪問存儲在服務器上的文件,以便我可以擁有一些會話對象的成員變量,如

sessionobject.chatroom="1"。//請不要去語法,但它的意義。

那麼有可能在服務器上訪問由服務器創建的文件來維護會話嗎?如果是,那麼如何?

回答

1

對於客戶端,我會看看Comet,這是執行服務器端推送到瀏覽器的技術術語。您可以查看許多方法來執行此功能,其中您提到的兩個方法(長插座和輪詢)。這兩種技術都可以使用CometD執行,這是由Dojo Foundation使用Bayeux規範構建的JavaScript庫。

至於確定哪種方法更好,您需要查看您的基礎設施。許多服務器受處理線程數限制,並且一次只能處理一定數量的傳入套接字。一旦你達到了限制,任何進一步的套接字將排隊(或取決於服務器),直到套接字被釋放。 Tomcat6以及其他較新的服務器確實支持使用允許非阻塞客戶端套接字處理的NIO API,這消除了對傳入套接字連接的限制。如果您的客戶端和您自己之間有任何具有套接字限制的Web服務器,防火牆,代理,負載平衡器等,則需要在最終解決方案中考慮這一點。如果您的基礎架構可以支持此方法,則此方法非常有用,因爲它可爲您的客戶提供最快的響應時間並降低套接字設置和刪除的成本。提到的缺點是您的基礎架構需要支持您預期的最大用戶數(支持包括文件描述符等)。

使用輪詢的另一種方法:在增加更多開銷並由於並不總是連接而導致響應時間較慢的情況下,允許您的後端使用較少的資源來支持相同數量的用戶(文件描述符較少等等......)。

至於你的第二個問題,我不確定你在問什麼。如果您嘗試訪問用戶會話中由用戶生成的請求之外的信息,那麼這不是規範允許的內容,並且會被視爲違反安全規定。如果您正在討論在該用戶的請求期間存儲和訪問用戶會話中的信息,那麼可以使用標準的HttpSession API。我建議你不要使用或嘗試使用第一種方法,因爲它不是一個好的設計。如果您需要維護所有用戶線程都需要訪問的用戶數據,那麼您將需要在單個用戶會話(數據庫,文件等)外部維護該數據。

希望這會有所幫助。

+0

非常感謝克里斯。這真的非常有用,因爲它讓我對這兩種方法有了深入的瞭解。 – codeomnitrix 2011-03-17 09:44:05