2013-03-02 88 views
1

我在python中創建了我自己的聊天網絡服務器,並且想知道AJAX每秒鐘都會調用服務器(下面的JS)。我可以修改我的服務器,以便在更新chat.html文件時將其推送給所有客戶端。有沒有一種方法使用JavaScript來讓它監聽接收的數據而不是輪詢?AJAX監聽器而不是輪詢?

<script> 
// Request the AJAX update the chat window every second 
setInterval(function(){loadChat()},1000); 

function loadChat() 
{ 
    var xmlhttp; 
    if (window.XMLHttpRequest) 
    { 
     xmlhttp = new XMLHttpRequest(); 

     xmlhttp.onreadystatechange=function() 
     { 
      if (xmlhttp.readyState==4 && xmlhttp.status==200) 
      { 
       document.getElementById("chatWindow").innerHTML=xmlhttp.responseText; 
      } 
     } 

     xmlhttp.open("GET","chat.html",true); 
     xmlhttp.send(null); 
    } 
} 
</script> 

回答

4

是的,確實存在。有(至少)四種技術可以使用:

  1. WebSockets。這是最明顯的解決方案。它允許您無需輪詢即可按需發送和接收消息。但是,它可能在服務器端更難實現,因爲它不是普通的HTTP。另外,舊的瀏覽器不支持WebSockets。

  2. 服務器發送的事件。這不太理想,但仍然適合你。有了它,您可以從服務器接收mes ­賢者,而無需輪詢。在服務器上實現也很容易,因爲它只是普通的HTTP,除非連接不關閉。它也不支持在一些舊的Web brow ­ sers中,但它比WebSockets更受支持,並且非常容易進行填充。

  3. COMET。這基本上是對以下事物的改進。基本上,你有一個iframe隱藏在屏幕外。每當有事件發生時,您都會發送(並刷新!)腳本標記,但不要關閉連接。超時後關閉連接。然後刷新iframe。這也很容易實現,是簡單的HTTP,並且不需要特殊的瀏覽器支持。然而,瀏覽器時間­超出不同,這有點不雅。

  4. 保持連接打開,直到事件發生。這可能是最不可取的。只有在事件進入時才發送響應。當事件進入或發生超時時,發送響應。當客戶端收到響應時,重新連接。這也有點不雅,但它有效。

0

簡單地說,在大多數情況下,你將不能夠。不過,你可以使用HTML5 Websockets,雖然他們通常是不支持的。

SockJS,使用各種方法在JavaScript中執行回調,其中一個是阻止查詢,另一個是WebSockets。如果你正在嘗試做這樣的事情,我會強烈推薦它。

+0

因爲WebSockets的不做輪詢和他們是一個可能的解決方案。還有其他的東西列在我的答案。 – icktoofay 2013-03-02 03:58:49

+0

酷,所以它是一個JS庫,試圖給當前不支持它的瀏覽器提供HTML5 websocket功能。 – LF4 2013-03-02 04:00:22

+0

對,我建議使用SockJS,因爲它使用了這些技術的組合。 – 2013-03-02 04:00:32

0

你可以使用websockets來做到這一點。不幸的是,並不是所有的瀏覽器都支持它

More info on websockets here.

+0

有趣,這將工作,我想要的感謝。 – LF4 2013-03-02 03:58:32

1

你所講的是推動從服務器到客戶端是comet你可以用這樣的方式

但是,這可以完美地與節點來完成。JS和HTML5 WebSockets的,但它不是在所有的瀏覽器check this out

而且你可以讓另一件事

從您的JS發送請求並使其存活1分鐘,使一個無限循環,休眠幾秒鐘支持如果它發現任何東西,同時它返回給客戶端別的作出新的請求,這個技術被稱爲心跳

我希望這可以幫助