Отправка сообщений на сервер с длинным заводом Comet
-
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 - это все, что вам нужно.