Comet Long-Polling으로 서버로 메시지를 보냅니다
-
16-09-2019 - |
문제
클라이언트에서 서버로 데이터를 보내는 가장 좋은 방법은 무엇입니까?
내가 사용하는 예제 코드는 기본 "긴 폴링"을 어떻게 구현합니까?
해결책 3
예, 서버에 대한 두 번째 연결을 사용하십시오. 이것이 IIRC를 포함하여 대부분의 프레임 워크가하는 일입니다. Bayeux 프로토콜. 실제로 두 번째 연결이 필요하다는 것을 알게되면 걱정하십시오.
다음은 위의 링크에서 수정 된 약간의 장난 꾸러기 코드입니다.
var userid = Math.ceil(1000000*Math.random()).toString(16).toUpperCase();
var startLongpoll = function() {
$.ajax({
type:"POST", async:true, cache:false, timeout:0,
data: {userid: userid},
success: function(data){
_outCallback(data);
setTimeout( startLongpoll, 10 );
},
error: function(xhr, textStatus, errorThrown){
_errCallback(textStatus+" ("+errorThrown+")");
setTimeout( startLongpoll, 5000 );
},
});
};
setTimeout(startLongpoll,10);
Moishe가 대기열과 이야기했던 것은 JS가 XHR이 파견 된 순서대로받을 것이라고 보장하지 않는다는 것입니다. 메시지는 손실되지 않습니다 (또는 적어도 내 테스트에 참여하지 않았습니다).이 문제는 특정 오랜 문제가 아니라 XHR을 사용할 때마다 고려해야 할 사항이 아닙니다.
큐 코드는 다음과 같습니다.
var queue = [];
var busy = false;
this.send = function(msg) {
queue[queue.length] = msg;
if (busy) return;
busy=true;
var s = function() {
var m = queue.shift();
$.ajax({
type:"POST", async:true, cache:false, timeout: 5000,
data: {userid:userid, msg:m},
error: function(xhr, textStatus, errorThrown){
_errCallback(textStatus + " (" + errorThrown + ")");
if (queue.length>0) s(); else busy = false;
},
success: function(){
if (queue.length>0) s(); else busy = false;
}
});
}
s();
};
주목해야 할 두 가지. 첫째, 많은 메시지를 보내고 대기열이 채워지면 상당한 지연이 있습니다. 한 조각이 아닌 한 큐를 매번 보낼 수있는 방법을 찾는 것이 좋습니다. 이를 수행하는 한 가지 방법은 메시지를 JSON 배열로 변환하고 서버에서 디코딩하는 것입니다.
둘째, 메시지를 보내는 오류가 있으면 메시지를 잃어 버렸습니다. 실패한 메시지를 큐에 다시 밀어 넣거나 성공할 때까지 제거하지 않는 약간의 코드가 필요합니다.
다른 팁
XHR을 사용하여 게시물을 작성하십시오.
한 가지 문제는 일부 브라우저에서 서버 당 2 개 (또는 일부 숫자 N) 동시 XHR 연결을 가질 수 있습니다. 현재 XHR이 완료 될 때 모든 대기 메시지를 게시 할 수있는 대기열을 만들어서이 문제를 해결 한 다음 해당 게시물이 완료 될 때까지 새 대기열을 채우고 앞뒤로 작성할 수 있습니다.
서버로 데이터를 보내는 것은 표준 요청 일뿐입니다. XHR은 괜찮습니다.
긴 폴링에 의해 혼란스러워하지 마십시오. 긴 폴링은 서버에서 클라이언트로 전송하는 방법으로 만 존재합니다. 클라이언트에서 서버로 데이터를 보내는 것은 웹이 시작된 이래로 웹이 수행 한 내용이며 일반적인 XHR 요청 만 있으면됩니다.