문제

클라이언트에서 서버로 데이터를 보내는 가장 좋은 방법은 무엇입니까?

내가 사용하는 예제 코드는 기본 "긴 폴링"을 어떻게 구현합니까?

도움이 되었습니까?

해결책 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 요청 만 있으면됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top