최신 정보
이에 대한지지를 계속 받으면서이 답변이 4 살이라는 것을 기억하는 것이 합리적이라고 생각합니다. 웹은 정말 빠른 속도로 성장 했으므로이 답변에 유의하십시오.
나는 최근에 같은 문제가 있었고 그 주제에 대해 연구했습니다.
제공된 솔루션을 롱 폴링이라고하며,이를 올바르게 사용하려면 AJAX 요청에 "대형"시간 초과가 있는지 확인하고 현재 종료 (시간 초과, 오류 또는 성공) 후에 항상이 요청을 작성해야합니다.
긴 폴링-클라이언트
여기서는 코드를 짧게 유지하기 위해 jQuery를 사용합니다.
function pollTask() {
$.ajax({
url: '/api/Polling',
async: true, // by default, it's async, but...
dataType: 'json', // or the dataType you are working with
timeout: 10000, // IMPORTANT! this is a 10 seconds timeout
cache: false
}).done(function (eventList) {
// Handle your data here
var data;
for (var eventName in eventList) {
data = eventList[eventName];
dispatcher.handle(eventName, data); // handle the `eventName` with `data`
}
}).always(pollTask);
}
( jQuery docs에서 ) 를 기억하는 것이 중요합니다 .
jQuery 1.4.x 이하에서 XMLHttpRequest 객체는 요청 시간이 초과되면 유효하지 않은 상태가됩니다. 객체 멤버에 액세스하면 예외가 발생할 수 있습니다. Firefox 3.0 이상에서만 시간 초과로 스크립트 및 JSONP 요청을 취소 할 수 없습니다. 시간 종료 기간이 지난 후에도 스크립트가 실행됩니다.
긴 폴링-서버
특정 언어는 아니지만 다음과 같습니다.
function handleRequest () {
while (!anythingHappened() || hasTimedOut()) { sleep(2); }
return events();
}
여기에서 hasTimedOut
코드가 영원히 기다리지 않도록 anythingHappened
하고 이벤트가 발생했는지 확인합니다. 는 sleep
아무 일도없는 동안 다른 물건을 할 스레드를 해제하는 것입니다. 은 events
JSON 형식 (또는 원하는 다른 형식)으로 이벤트 사전 (또는 원하는 다른 데이터 구조)을 반환합니다.
확실히 문제를 해결하지만 연구 할 때와 같이 확장 성과 성능이 걱정된다면 내가 찾은 또 다른 해결책을 고려할 수 있습니다.
해결책
소켓을 사용하십시오!
클라이언트 측에서 호환성 문제를 피하려면 socket.io를 사용 하십시오 . 소켓을 직접 사용하려고 시도하고 소켓을 사용할 수 없을 때 다른 솔루션으로 대체합니다.
서버 측에서 NodeJS를 사용하여 서버를 작성 하십시오 (예 :) . 클라이언트는 서버로 작성된이 채널 (관찰자)을 구독합니다. 알림을 보내야 할 때마다이 채널에 게시되고 아래 첨자 (클라이언트)에게 알립니다.
이 솔루션이 마음에 들지 않으면 APE ( Ajax Push Engine )를 사용해보십시오 .
도움이 되었기를 바랍니다.