2012-07-27 46 views

回答

18

你有兩個選擇(其他人已經在上面詳細說明)。如果你不熟悉每個選項背後的一些概念性想法,我想我會給他們一兩行。請注意,我正在以非常非常高的級別呈現這些概念。

你三個選項:

  1. 短輪詢
  2. web套接字
  3. 彗星/長輪詢

短輪詢

短輪詢克服了一個通過強制執行Client-Server之間的通信客戶端連續發送請求到窗體的服務器:

Client: Do you have a message for me? 
Server: No. 
Client: (wait x seconds) 
Client: Do you have a message for me? 
Server: No. 
Client: (wait x seconds) 
Client: Do you have a message for me? 
Server: Yes. Here it is! 
Client: Yay! 
Client: (update message) 

代表客戶的不斷嘮叨稱爲輪詢。爲了實現這個結構,您需要設置您的服務器以「偵聽」來自客戶端的這些輪詢請求。服務器還必須在某處存儲這些消息,以便在消息準備就緒時,服務器可以提供它們。在一個非常高的一個簡單的層面,你的服務器需要:

  • 接受一般的網頁請求
  • 接受查詢請求
  • 是獲取信息
  • 存儲這些信息運行後臺作業的地方,這樣,當輪詢請求進來,服務器可以檢查它們。

你還需要這些輪詢請求配合某種會話ID的用戶,讓正確的信息到達合適的人。總體而言,這種範式很複雜,在我看來,效率低下。

Web套接字

Web套接字是HTML5的新功能。他們背後的基本想法是,客戶可以維持到服務器的直接連接,他們可以信息來回對方。因此,而不是通常的:客戶端發送GET請求>>服務器與內容進行響應,網絡套接字讓你保持一個持續的對話。

爲了對此進行設置,但是,您需要:

  • 瀏覽器是兼容的WebSocket(不是全部都是)。
  • ,可以處理網絡套接字的服務器(不知道如何表達這一點,但不是所有的服務器都設置了這樣的安排)。

的設置有些複雜,雖然比長輪詢簡單:

  • 客戶端保持連接到基於Web的插座連接到服務器
  • 服務器推動通過web套接字
  • 結果給客戶
  • 客戶端根據結果更新頁面

您好拭目以待簡稱爲推送通知這種模式(當然,如果你擁有一部iPhone,你已經經歷了這一點)作爲服務器已授權「東西」到客戶端(如何不禮貌!)。由於有大量的客戶端和服務器的細微差別,我會建議測試出像Pusher,這基本上是一個Web服務來處理網絡套接字的所有困難的部分。在開始自己設置模式之前,這將是一個簡單的方式讓您測試和使用模式。它有客戶端和服務器端的庫。

希望這些信息給你一個基準來解決問題。其他答案有關如何解決每種情況的更直接信息。

彗星/長輪詢

一種替代,看似跨瀏覽器的方法來網絡套接字是長輪詢(見Comet)。在這種情況下,客戶端建立到服務器的連接並掛起,等待數據被推回。此安裝程序是有些複雜,但它確實代表短輪詢網絡套接字之間的中間地帶。

0

您可以使用民意調查,長時間民意調查或如果您想推送系統。最容易的是投票。但是,所有解決方案都需要客戶端編碼。

性能影響取決於您的解決方案。最容易實施將是一次民意調查。頻率很低的一次調查確實有效地提出了一個請求,比如100ms模擬實時。長期民意調查的影響較小,但在一段或多或少的時間內會持續開放很多請求。

5

我建議使用SockJS或Socket.io作爲客戶端JavaScript庫,然後在服務器端使用Tornado將任何狀態更改發佈到客戶端來實現類似連接的套接字。代碼非常簡單。

客戶端代碼取決於您選擇的庫。 SockJS或SocketIO。或者,如果你只是想使用WebSockets直接這很簡單:

update_socket = new WebSocket("ws://my_server.com/listening_url"); 
update_socket.onmessage = function (evt) { 
    $("#my_div").html(evt); 
}; 

服務器端代碼也很簡單:

import tornado 

class UpdateHandler(tornado.websocket.WebSocketHandler): 

    def open(self): 
     self.write_message('Hi client') 
     # listen for some events that are occurring 
     for message in function_that_generates_events(): 
      self.write(message) 

    def on_message(self, message): 
     # Do something with incoming messages 

    def on_close(self): 
     # tidy up 

app = tornado.web.Application(('r/listening_url',UpdateHandler)) 
app.listen(9000)