Отправка сообщений на сервер с длинным заводом Comet

StackOverflow https://stackoverflow.com/questions/1864359

  •  16-09-2019
  •  | 
  •  

Вопрос

Как лучше всего отправить данные с клиента на сервер?

Пример кода, который я использую, из Как мне внедрить основные «долгие опросы»?

Это было полезно?

Решение 3

Да, просто используйте второе соединение с сервером. Это то, что делают большинство фреймворков, включая IIRC Bayeux Protocol. Анкет Если вы узнаете, что вам действительно нужно это второе соединение, беспокойтесь об этом.

Вот какой-то длинный код, измененный по моей ссылке выше:

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);

То, о чем говорил Моиш, так это то, что JS не гарантирует, что XHRS будет получен в том порядке, в котором вы их отправили. Сообщения не будут потеряны (или, по крайней мере, они не были в моих тестах), и это не конкретная проблема с длинной загрязнением, а что-то, что нужно учитывать, когда вы используете 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 в порядке, или jsonp, что бы ни плавал на вашей лодке.

Не путайте с давним заводом; Длинное заворот существует только как способ отправки с сервера к клиенту. Отправка данных от клиента на сервер - это то, о чем была в Интернете с момента его создания, и обычный запрос XHR - это все, что вам нужно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top