2013-03-02 4 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, за исключением того, что соединение не закрывается. Он также не поддерживается в некоторых старых веб-бровях ­ sers, но он более поддерживается, чем WebSockets, и довольно легко подделать.

  3. COMET. Это, в основном, улучшение ниже. В принципе, у вас есть iframe, который скрыт за кадром. Всякий раз, когда приходит событие, вы отправляете (и скрываете!) Тег скрипта, но не закрываете соединение. После таймаута закройте соединение. Затем обновите iframe. Это также довольно легко реализовать, является простым HTTP и не требует специальной поддержки браузера. Однако время браузера ­ аутов меняется, и это несколько неэлегантно.

  4. Поддержание связи до появления события. Это, пожалуй, наименее желательно. Просто не отправляйте ответ до тех пор, пока не произойдет событие. Когда произойдет событие или произойдет тайм-аут, отправьте ответ. Когда клиент получает ответ, повторно подключитесь. Это также несколько неэлегантно, но оно работает.

0

Просто, в большинстве случаев вы не сможете .. Однако, вы можете использовать HTML5 Websockets, хотя они обычно не поддерживаются.

SockJS, использует множество методов для обработки обратных вызовов в JavaScript, одним из которых является запрос блокировки, другой WebSockets. Я бы очень рекомендовал, если вы пытаетесь это сделать.

+0

Поскольку WebSockets не делать опрос, и они являются возможным решением. И другие вещи, перечисленные в моем ответе. – icktoofay

+0

Прохладно, так что это JS-библиотека, которая пытается предоставить браузеру HTML5 для браузеров, которые в настоящее время не поддерживают его. – LF4

+0

Правильно, я предложил SockJS, потому что он использует комбинацию этих методов. –

0

Вы можете сделать это с помощью websockets. К сожалению, не все браузеры в настоящее время поддерживают их.

More info on websockets here.

+0

Интересно, что будет работать за то, что я хочу. – LF4

1

То, что вы говорите о том, толкая от сервера к клиенту, который comet вы можете использовать такой способ

Но это может быть сделано отлично с узлом.JS и WebSockets в HTML5, но это не поддерживается во всех браузерах check this out

И вы можете сделать еще одну вещь

Отправить запрос от ваших JS и сделать его живым в течение 1 минуты и сделать бесконечный цикл, который спит в течение нескольких секунд и если он нашел что-нибудь в то время как вернуть его клиенту еще сделать новый запрос этот метод называется HeartBeat

Я надеюсь, что это может помочь

Смежные вопросы