Вопрос

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

Некоторые участники проекта предложили использовать XMPP через BOSH, я сказал, что это похоже на попытку поймать рыбу с помощью лодки, и предложил более простой метод, например, простой веб-чат Ajax / MySQL, но мы обеспокоены о производительности на сервере из-за постоянного опроса многих чатов, открытых одновременно.

Кто-нибудь делал что-то подобное раньше? Чтобы вы посоветовали?

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

Решение

Возможно, вы захотите взглянуть на Comet .

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

Посмотрите проект cometd для получения дополнительной технической информации.

Другие советы

  

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

XMPP через BOSH

Нет необходимости придумывать свой собственный формат сообщений и транспортный протокол, когда кто-то другой. Если вы попробуете, он постепенно станет таким же сложным, как BOSH, но без поддержки сторонней библиотеки или стандартизации.

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

  

Вы также можете заглянуть в Comet.

     

Я думал, что все использовали Cometd для такого рода вещей.

BOSH - это стандарт для передачи XMPP через HTTP. Он использует Comet для передачи данных клиенту.

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

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

Хитрость заключается в том, чтобы понять, что единственное время, когда ваше приложение должно вызывать CGI на сервере, - это когда кто-то что-то говорит. Для регулярных опросов опрашивайте статическую страницу, которую ваш CGI-скрипт обновляет всякий раз, когда появляется новый чат. Используйте запросы HEAD, сравнивайте временные метки с последними, и выполняйте полный GET только при их изменении. У меня есть простое наивное приложение для чата, реализованное таким образом, и загрузка и использование полосы пропускания незначительны для нескольких десятков одновременных пользователей.

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

Приведенный ниже код - моя "комета" 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);
  }
}

Я думал, что все использовали Cometd для такого рода вещей.

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

Редактировать. Кстати, когда мне позвонили, Годадди звучал не так весело, как раньше.

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

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

Я только что нашел этот пост, он старый, но концепция опроса создает проблемы для многих людей. Так что я приведу пример реализации здесь. Но прежде чем дать его вам, я должен дать вам совет, который когда-то разозлил меня:

Когда вы проводите опрос, вы должны позаботиться о поведении сеансов = "nofollow"> условия гонки ). Для простоты: если вы открываете сеанс, файл сеанса блокируется до тех пор, пока сеанс не будет закрыт, чтобы избежать двух записей, записывающих в него разные данные. Поэтому, если вам нужен сеанс, чтобы проверить, вошел ли пользователь в систему или около того, всегда закрывайте сеанс перед опросом.

В моей демонстрации приведен пример реализации опроса в PHP. Я не буду использовать базу данных, но файл вместо этого. Когда вы нажмете кнопку опроса, вы войдете в цикл, и пока файл не будет изменен, вы будете продолжать опрос. Когда вы заполните форму и нажмете «Отпустить», то, что вы набрали, будет сохранено в файл. Время изменения файла изменится, поэтому опрос будет остановлен.

Совет. Используйте инструмент, например Firebug , чтобы узнать, что происходит.

Теперь давайте поговорим лучше, чем мой английский:

<?php

    // For this demo
    if (file_exists('poll.txt') == false) {
        file_put_contents('poll.txt', '');
    }

    if (isset(

Я только что нашел этот пост, он старый, но концепция опроса создает проблемы для многих людей. Так что я приведу пример реализации здесь. Но прежде чем дать его вам, я должен дать вам совет, который когда-то разозлил меня:

Когда вы проводите опрос, вы должны позаботиться о поведении сеансов = "nofollow"> условия гонки ). Для простоты: если вы открываете сеанс, файл сеанса блокируется до тех пор, пока сеанс не будет закрыт, чтобы избежать двух записей, записывающих в него разные данные. Поэтому, если вам нужен сеанс, чтобы проверить, вошел ли пользователь в систему или около того, всегда закрывайте сеанс перед опросом.

В моей демонстрации приведен пример реализации опроса в PHP. Я не буду использовать базу данных, но файл вместо этого. Когда вы нажмете кнопку опроса, вы войдете в цикл, и пока файл не будет изменен, вы будете продолжать опрос. Когда вы заполните форму и нажмете «Отпустить», то, что вы набрали, будет сохранено в файл. Время изменения файла изменится, поэтому опрос будет остановлен.

Совет. Используйте инструмент, например Firebug , чтобы узнать, что происходит.

Теперь давайте поговорим лучше, чем мой английский:

<*>

Вы можете попробовать это здесь

GET['poll'])) { // Don't forget to change the default time limit set_time_limit(120); date_default_timezone_set('Europe/Paris'); $time = time(); // We loop until you click on the "release" button... $poll = true; $number_of_tries = 1; while ($poll) { // Here we simulate a request (last mtime of file could be a creation/update_date field on a base) clearstatcache(); $mtime = filemtime('poll.txt'); if ($mtime > $time) { $result = htmlentities(file_get_contents('poll.txt')); $poll = false; } // Of course, else your polling will kill your resources! $number_of_tries++; sleep(1); } // Outputs result echo "Number of tries : {$number_of_tries}<br/>{$result}"; die(); } // Here we catch the release form if (isset(

Я только что нашел этот пост, он старый, но концепция опроса создает проблемы для многих людей. Так что я приведу пример реализации здесь. Но прежде чем дать его вам, я должен дать вам совет, который когда-то разозлил меня:

Когда вы проводите опрос, вы должны позаботиться о поведении сеансов = "nofollow"> условия гонки ). Для простоты: если вы открываете сеанс, файл сеанса блокируется до тех пор, пока сеанс не будет закрыт, чтобы избежать двух записей, записывающих в него разные данные. Поэтому, если вам нужен сеанс, чтобы проверить, вошел ли пользователь в систему или около того, всегда закрывайте сеанс перед опросом.

В моей демонстрации приведен пример реализации опроса в PHP. Я не буду использовать базу данных, но файл вместо этого. Когда вы нажмете кнопку опроса, вы войдете в цикл, и пока файл не будет изменен, вы будете продолжать опрос. Когда вы заполните форму и нажмете «Отпустить», то, что вы набрали, будет сохранено в файл. Время изменения файла изменится, поэтому опрос будет остановлен.

Совет. Используйте инструмент, например Firebug , чтобы узнать, что происходит.

Теперь давайте поговорим лучше, чем мой английский:

<*>

Вы можете попробовать это здесь

GET['release'])) { $data = ''; if (isset(

Я только что нашел этот пост, он старый, но концепция опроса создает проблемы для многих людей. Так что я приведу пример реализации здесь. Но прежде чем дать его вам, я должен дать вам совет, который когда-то разозлил меня:

Когда вы проводите опрос, вы должны позаботиться о поведении сеансов = "nofollow"> условия гонки ). Для простоты: если вы открываете сеанс, файл сеанса блокируется до тех пор, пока сеанс не будет закрыт, чтобы избежать двух записей, записывающих в него разные данные. Поэтому, если вам нужен сеанс, чтобы проверить, вошел ли пользователь в систему или около того, всегда закрывайте сеанс перед опросом.

В моей демонстрации приведен пример реализации опроса в PHP. Я не буду использовать базу данных, но файл вместо этого. Когда вы нажмете кнопку опроса, вы войдете в цикл, и пока файл не будет изменен, вы будете продолжать опрос. Когда вы заполните форму и нажмете «Отпустить», то, что вы набрали, будет сохранено в файл. Время изменения файла изменится, поэтому опрос будет остановлен.

Совет. Используйте инструмент, например Firebug , чтобы узнать, что происходит.

Теперь давайте поговорим лучше, чем мой английский:

<*>

Вы можете попробовать это здесь

GET['data'])) { $data =

Я только что нашел этот пост, он старый, но концепция опроса создает проблемы для многих людей. Так что я приведу пример реализации здесь. Но прежде чем дать его вам, я должен дать вам совет, который когда-то разозлил меня:

Когда вы проводите опрос, вы должны позаботиться о поведении сеансов = "nofollow"> условия гонки ). Для простоты: если вы открываете сеанс, файл сеанса блокируется до тех пор, пока сеанс не будет закрыт, чтобы избежать двух записей, записывающих в него разные данные. Поэтому, если вам нужен сеанс, чтобы проверить, вошел ли пользователь в систему или около того, всегда закрывайте сеанс перед опросом.

В моей демонстрации приведен пример реализации опроса в PHP. Я не буду использовать базу данных, но файл вместо этого. Когда вы нажмете кнопку опроса, вы войдете в цикл, и пока файл не будет изменен, вы будете продолжать опрос. Когда вы заполните форму и нажмете «Отпустить», то, что вы набрали, будет сохранено в файл. Время изменения файла изменится, поэтому опрос будет остановлен.

Совет. Используйте инструмент, например Firebug , чтобы узнать, что происходит.

Теперь давайте поговорим лучше, чем мой английский:

<*>

Вы можете попробовать это здесь

GET['data']; } file_put_contents('poll.txt', $data); die(); } ?> <!-- click this button to begin long-polling --> <input id="poll" type="button" value="Click me to start polling" /> <br/><br/> Give me some text here : <br/> <input id="data" type="text" /> <br/> <!-- click this button to release long-polling --> <input id="release" type="button" value="Click me to release polling" disabled="disabled" /> <br/><br/> Result after releasing polling : <div id="result"></div> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script> <script type="text/javascript"> // Script to launch polling $('#poll').click(function() { $('#poll').attr('disabled', 'disabled'); $('#release').removeAttr('disabled'); $.ajax({ url: 'poll.php', data: { poll: 'yes' // sets our

Я только что нашел этот пост, он старый, но концепция опроса создает проблемы для многих людей. Так что я приведу пример реализации здесь. Но прежде чем дать его вам, я должен дать вам совет, который когда-то разозлил меня:

Когда вы проводите опрос, вы должны позаботиться о поведении сеансов = "nofollow"> условия гонки ). Для простоты: если вы открываете сеанс, файл сеанса блокируется до тех пор, пока сеанс не будет закрыт, чтобы избежать двух записей, записывающих в него разные данные. Поэтому, если вам нужен сеанс, чтобы проверить, вошел ли пользователь в систему или около того, всегда закрывайте сеанс перед опросом.

В моей демонстрации приведен пример реализации опроса в PHP. Я не буду использовать базу данных, но файл вместо этого. Когда вы нажмете кнопку опроса, вы войдете в цикл, и пока файл не будет изменен, вы будете продолжать опрос. Когда вы заполните форму и нажмете «Отпустить», то, что вы набрали, будет сохранено в файл. Время изменения файла изменится, поэтому опрос будет остановлен.

Совет. Используйте инструмент, например Firebug , чтобы узнать, что происходит.

Теперь давайте поговорим лучше, чем мой английский:

<*>

Вы можете попробовать это здесь

GET['poll'] }, success: function(data) { $('#result').html(data); $('#poll').removeAttr('disabled'); $('#release').attr('disabled', 'disabled'); } }); }); // Script to release polling $('#release').click(function() { $.ajax({ url: 'poll.php', data: { release: 'yes', // sets our

Я только что нашел этот пост, он старый, но концепция опроса создает проблемы для многих людей. Так что я приведу пример реализации здесь. Но прежде чем дать его вам, я должен дать вам совет, который когда-то разозлил меня:

Когда вы проводите опрос, вы должны позаботиться о поведении сеансов = "nofollow"> условия гонки ). Для простоты: если вы открываете сеанс, файл сеанса блокируется до тех пор, пока сеанс не будет закрыт, чтобы избежать двух записей, записывающих в него разные данные. Поэтому, если вам нужен сеанс, чтобы проверить, вошел ли пользователь в систему или около того, всегда закрывайте сеанс перед опросом.

В моей демонстрации приведен пример реализации опроса в PHP. Я не буду использовать базу данных, но файл вместо этого. Когда вы нажмете кнопку опроса, вы войдете в цикл, и пока файл не будет изменен, вы будете продолжать опрос. Когда вы заполните форму и нажмете «Отпустить», то, что вы набрали, будет сохранено в файл. Время изменения файла изменится, поэтому опрос будет остановлен.

Совет. Используйте инструмент, например Firebug , чтобы узнать, что происходит.

Теперь давайте поговорим лучше, чем мой английский:

<*>

Вы можете попробовать это здесь

GET['release'] data: $('#data').val() // sets our

Я только что нашел этот пост, он старый, но концепция опроса создает проблемы для многих людей. Так что я приведу пример реализации здесь. Но прежде чем дать его вам, я должен дать вам совет, который когда-то разозлил меня:

Когда вы проводите опрос, вы должны позаботиться о поведении сеансов = "nofollow"> условия гонки ). Для простоты: если вы открываете сеанс, файл сеанса блокируется до тех пор, пока сеанс не будет закрыт, чтобы избежать двух записей, записывающих в него разные данные. Поэтому, если вам нужен сеанс, чтобы проверить, вошел ли пользователь в систему или около того, всегда закрывайте сеанс перед опросом.

В моей демонстрации приведен пример реализации опроса в PHP. Я не буду использовать базу данных, но файл вместо этого. Когда вы нажмете кнопку опроса, вы войдете в цикл, и пока файл не будет изменен, вы будете продолжать опрос. Когда вы заполните форму и нажмете «Отпустить», то, что вы набрали, будет сохранено в файл. Время изменения файла изменится, поэтому опрос будет остановлен.

Совет. Используйте инструмент, например Firebug , чтобы узнать, что происходит.

Теперь давайте поговорим лучше, чем мой английский:

<*>

Вы можете попробовать это здесь

GET['data'] } }); }); </script>

Вы можете попробовать это здесь

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