2011-12-12 4 views
3

사용자가 도착하자 마자 알림을 받길 원하기 때문에 longpolling을 구현하는 응용 프로그램에서 작업하고 있습니다. 나는이 부분을 사용하고 있지만, 20 초마다 서버에 '하트 비트'를 보내는 자바 스크립트 함수로 이것을 확장해야한다.자바 스크립트 : 클라이언트 당 2 개의 연결이 필요합니까?

내 질문 : 20 초 동안 코드를 완전히 중단하지 않고 어떻게해야합니까? (다른 자바 스크립트가 계속 계산되는 동안 계속 실행 됨) 두 번째 연결을 사용할 수있는 방법이 있습니까? 왜냐하면 하트 비트가 사용자에게 전송 될 때 내 긴 폴링이 중단되기를 원하지 않기 때문입니다.

아이디어가 있으십니까?

+0

시간 초과가 20000 ms 인 타이머와 서버 비동기 요청을 완료 한 후 다른 20000 ms의 시간 동안 대기하는 타이머는 어떨까요? – ComputerSaysNo

+0

클라이언트가 http 연결을 끊으면 서버가이를 확실히 등록합니다. 이 이벤트를 잡을 수 있어야합니다. – bennedich

+0

@bennedich : 연결이 닫힐 때 이벤트가 생성된다고 생각하지 않습니다. 서버가 어떻게 알 수 있는지는 알 수 없습니다. – networkprofile

답변

2

당신은 여러 연결을 유지 할 필요가 없습니다 : 브라우저, 당신은 확인해야 할 모든 의해 부과 유한 제한 당신이 XHR의 건설 비동기 플래그를 포함한다는 것입니다 달성하기. Javascript의 비동기 성질은 연결이 살아있는 동안 다른 것들이 처리되는 것을 허용합니다. 자바 스크립트의 XHR은 단일 스레드이기 때문에 차단하고 있다고 생각할 수도 있습니다.

자바 스크립트의 XHR은 이벤트 루프 모델 때문에 비 블로킹입니다. 자바 스크립트 엔진은 끊임없이 루프를 돌며 등록 된 호출이 완료되었는지 여부와 콜백을 처리해야하는지 여부를 확인합니다. 이를 통해 조작이 비 블로킹 (non-blocking)되어 단일 자바 스크립트 응용 프로그램이 다중 XHR 긴 폴링 요청을 처리 할 수 ​​있습니다.

요청에 jQuery를 사용할 수 있다면 XHR을이 함수로 매우 멋지게 꾸밀 수 있습니다 : http://api.jquery.com/jQuery.ajax/. 이를 통해 20 초의 시간 초과를 정의하고 즉시 처리 할 수 ​​있습니다 (서버와의 연결을 다시 시작).

짝수 - 긴 폴링을 최적화하기 위해 서버 스택을 고려할 수도 있습니다. 웹 서버가 Apache 2.2와 같이 요청 당 스레드를 생성하지 않는지 확인하십시오. 그렇지 않으면 시스템 자원이 빨리 소모됩니다! node.js (많은 동시 요청을 처리하는 데 유용함)를 사용할 수 있으면 socket.io 라이브러리를 서버 측 및 클라이언트 측 솔루션 (http://socket.io/#home)으로 조사하십시오.

5

setInterval(yourHearbeatFunction, 20000)을 사용하면 Javascript 실행 스레드가 잠기지 않습니다. 따라서 긴 요청은 즉시 처리됩니다.

+0

단일 하트 비트가 완료되는 데 20 초 이상 걸리면 열린 요청을 스택하여 브라우저 속도를 늦출 수 있습니다. 이것은 타임 아웃이 20 초이므로 문제가되지 않을 가능성이 높지만 짧으면 짧을 것입니다. – Ariel

7

아래의 스레드가 꽤 오래되었지만 브라우저에서 XMLHttpRequest를 통해 여러 번 연결할 수 있음을 보여줍니다.

How many concurrent AJAX (XmlHttpRequest) requests are allowed in popular browsers?

당신이 긴 폴링 세션 중 하나 XMLHttpRequest를 또는 혜성을 구현하는 다른 수단을 사용하여이 있다면 당신이 도달 할 때까지, 당신은 여전히 ​​setInterval을 또는에서는 setTimeout 기능의 일부로서 동일한 서버에 다른 요청을 만들 수 있습니다 당신이 무슨 말을 하려는지

var heartbeatXhr = new XMLHttpRequest(); 
heartbeatXhr.open('GET', '/polling-url', true); // true for asynchronous