Приложение чата опрос Ajax

Выход 1 1 1 1 1 1, потому что первый оператор for выполняет цикл по массиву, названный list, значений (т. е. {1, 2, 3, 4, 5, 6}) и заменяя каждый на предыдущий, начиная со второго ( index 1 или, как некоторые говорят, 1-й, где «реальный» первый является 0-м ... я отвлекаюсь). Таким образом, текущее значение пункта 2 (индекс 1) второго элемента (2) заменяется на значение 1-го (индекс 0), которое равно 1: (list[i] = list[i - 1];, где i = 1). Это продолжается по массиву целых чисел, пока мы не достигнем конца list. По мере того как мы заменяем каждое значение на предыдущий, все они в конечном итоге становятся одним и тем же значением - значением первого элемента в массиве, который является 1. В конце мы имеем это значение для нашего list: {1, 1, 1, 1, 1, 1}.

Следующий оператор for просто распечатывает каждое значение обновленного list по очереди, за которым следует пустое пространство: System.out.print(list[i] + " ");. Итак, как вы можете видеть, результатом запуска этого кода является то, что он выводит 1 1 1 1 1 1.

Просто для того, чтобы вести точку дома более визуально, давайте просто нарисуем значения параметра list с течением времени:

int i = 1;              // i = 1
list[i] = list[i - 1];  // list[1] = list[1 - 1]; list[0] == 1
                        // list is now {1, 1, 3, 4, 5, 6}

i++;                    // i = i + 1 # i is now 2
list[i] = list[i - 1];  // list[2] = list[2 - 1]; list[1] == 1
                        // list is now {1, 1, 1, 4, 5, 6}

i++;                    // i = i + 1; i = 3
list[i] = list[i - 1];  // list[3] = list[3 - 1]; list[2] == 1
                        // list is now {1, 1, 1, 1, 5, 6}

i++;                    // i = i + 1; i = 4
list[i] = list[i - 1];  // list[4] = list[4 - 1]; list[3] == 1
                        // list is now {1, 1, 1, 1, 1, 6}

i++;                    // i = i + 1; i = 5
list[i] = list[i - 1];  // list[5] = list[5 - 1]; list[4] == 1
                        // list is now {1, 1, 1, 1, 1, 1}

i++;                    // i = i + 1; i = 6
i < list.length;        // i == 6; list.length == 6; 6 < 6 == false
                        // exit the for loop

Я надеюсь, что это поможет вам понять, что игры здесь играют немного лучше. Удачи вам в оставшейся части вашего теста!

14
задан Ijas Ameenudeen 18 January 2019 в 11:03
поделиться

11 ответов

Вы могли бы также хотеть изучить Комета .

Это используется GTalk, Meebo и многими другие приложения чата . Несколько лет назад, когда я экспериментировал с ним, не было очень многих библиотек или деталей о серверной архитектуре для реализации его, но похоже, что теперь существует намного больше материала.

Взглянули на проект cometd для большей технической информации.

7
ответ дан 1 December 2019 в 12:54
поделиться

, Что Вы рекомендовали бы?

XMPP через ЕРУНДУ

нет никакой потребности изобрести Ваш собственный формат сообщения и транспортный протокол, когда кто-то еще имеет. Если Вы попробуете, то это будет медленно расти, чтобы быть столь же сложным как ЕРУНДА, но без преимущества сторонней поддержки библиотеки или стандартизации.

5
ответ дан 1 December 2019 в 12:54
поделиться

Если Вам не нравится идея опроса HTTP, у Вас мог бы быть фильм Flash на странице чата, которая имеет постоянное соединение с некоторым deamon на сервере, фильм Flash затем вызвал бы функции JavaScript на клиент для обновления чата, поскольку новые сообщения приходят. (Если Вы не хотите интерфейс Flash для своего чата..)

3
ответ дан 1 December 2019 в 12:54
поделиться

Вы могли бы также хотеть изучить Комету.

я думал, что все использовали cometd для этого вида вещи.

ЕРУНДА является стандартом для переноса XMPP по HTTP. Это включает Комету для продвижения данных клиенту.

2
ответ дан 1 December 2019 в 12:54
поделиться

Существует очень хороший сервер для обработки продвижения сообщения от сервера до браузера (назвал Комета ) - Вращаемый . Это легко интегрируется с другими технологиями (Django, направляющие, PHP и т.д.) точно так же, как memcached.

действительно необходимо проверить его, если Вы хотите обработать серьезную загрузку. Иначе простой опрос Ajax является лучшим способом.

2
ответ дан 1 December 2019 в 12:54
поделиться

Прием должен понять, что единственное время, Ваше приложение должно вызвать CGI на сервер, - когда кто-то говорит что-то. Для регулярных опросов опросите статическую страницу, которую обновляет Ваш сценарий CGI каждый раз, когда существует новый чат. Используйте ГЛАВНЫЕ запросы, сравните, метки времени с теми длятся замеченный и только делают полное ДОБИРАЕТСЯ, когда они изменяются. У меня есть простое наивное приложение чата, реализовал этот путь и использование загрузки и пропускной способности незначительно для нескольких десятков одновременных пользователей, которых мы имеем.

1
ответ дан 1 December 2019 в 12:54
поделиться

Я сделал эту точно ту же вещь несколько месяцев назад и весело провел время, просто играя вокруг с понятиями. Я на самом деле использовал навсегда-кадр техника вместо опроса.

ниже кода моя "комета" js файл, который содержит общие понятия, требуемые получать "партийный чат" настройки.

function Comet(key) {

  var random = key;
  var title = 'Comet';
  var connection = false;
  var iframediv = false;
  var browserIsIE = /*@cc_on!@*/false;
  var blurStatus = false;
  var tmpframe = document.createElement('iframe');
  var nl = '\r\n';

  this.initialize = function() {
    if (browserIsIE) {
      connection = new ActiveXObject("htmlfile");
      connection.open();
      connection.write("<html>");
      connection.write("<script>document.domain = '"+document.domain+"'");
      connection.write("</html>");
      connection.close();
      iframediv = connection.createElement("div");
      connection.appendChild(iframediv);
      connection.parentWindow.comet = comet;
      iframediv.innerHTML = "<iframe id='comet_iframe' src='./comet.aspx?key="+random+"'></iframe>";
    } else {
      connection = document.createElement('iframe');
      connection.setAttribute('id', 'comet_iframe');
      iframediv = document.createElement('iframe');
      iframediv.setAttribute('src', './comet.aspx?key='+random);
      connection.appendChild(iframediv);
      document.body.appendChild(connection);
    }
  }

  // this function is called from the server to keep the connection alive
  this.keepAlive = function () {
    if (!browserIsIE) {
        mozillaHack();
    }
  }

  // this function is called from the server to update the client
  this.updateClient = function (value) {
    var outputDiv = document.getElementById('output');
    outputDiv.value = value + nl + outputDiv.value;
    if (blurStatus == true) {
        document.title = value;
    }
    if (!browserIsIE) {
        mozillaHack();
    }
  }

  this.onUnload = function() {
    if (connection) {
      // this will release the iframe to prevent problems with IE when reloading the page
      connection = false;
    }
  }

  this.toggleBlurStatus = function(bool) {
    blurStatus = bool;
  }

  this.resetTitle = function() {
    document.title = title;
  }

  function mozillaHack() {
    // this hack will fix the hour glass and loading status for Mozilla browsers
    document.body.appendChild(tmpframe);
    document.body.removeChild(tmpframe);
  }
}
1
ответ дан 1 December 2019 в 12:54
поделиться

Я думал, что все использовали cometd для этого вида вещи.

0
ответ дан 1 December 2019 в 12:54
поделиться

Я соглашаюсь с John. Но был другой вопрос, на который не ответили.
я сделал это, но вместо того, чтобы использовать базу данных мы использовали плоский файл, это действительно в конечном счете наносило вред серверу, но только когда у нас есть ~450 активных пользователей, и если бы мы сделали это с базой данных, то это, вероятно, тарифицировало бы лучше.
Это было сделано на основном хостинг-аккаунте от Godaddy.

Редактирование: BTW Godaddy звучал меньше затем удивленным, когда я получил телефонный вызов.

0
ответ дан 1 December 2019 в 12:54
поделиться

Я думаю, опрашивая, самый простой подход и рекомендовал бы это сначала. Если загрузка становится проблемой, запускаются, изучая более сложные методы. Хорошее обсуждение за и против здесь - http://www.infoq.com/news/2007/07/pushvspull
http://ajaxian.com/archives/a-report-on-push-versus-pull

0
ответ дан 1 December 2019 в 12:54
поделиться

Касса Speeqe . Это решение с открытым исходным кодом для веб-чатов, которое негласно использует BOSH и XMPP.

0
ответ дан 1 December 2019 в 12:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: