Frage

In dem Projekt, an dem ich gerade arbeite, müssen wir eine Web-Chat-Anwendung entwickeln, keinen sehr komplexen Chat, sondern lediglich eine Möglichkeit, zwei Personen miteinander zu verbinden, um über ein ganz bestimmtes Thema zu sprechen. Wir benötigen keinerlei Authentifizierung Für einen der beiden Benutzer müssen wir keine Emoticons, Avatare oder ähnliches unterstützen.

Einige Projektmitglieder schlugen vor, dass wir XMPP über BOSH verwenden könnten. Ich sagte, das sei so, als würde man versuchen, einen Fisch mit einem Bootsnetz zu fangen, und schlug eine einfachere Methode vor, wie einen einfachen Ajax/MySQL-Webchat, aber wir machen uns Sorgen um die Leistung Hit im Server aufgrund der ständigen Abfrage vieler gleichzeitig geöffneter Chats.

Hat jemand so etwas schon einmal gemacht?Was würden Sie empfehlen?

War es hilfreich?

Lösung

Vielleicht möchten Sie auch einen Blick darauf werfen Komet.

Es wird von GTalk, Meebo und vielen anderen verwendet andere Chat-Anwendungen.Als ich vor ein paar Jahren damit experimentierte, gab es nicht sehr viele Bibliotheken oder Details zur Serverarchitektur, um es zu implementieren, aber es sieht so aus, als ob es jetzt viel mehr Zeug gibt.

Schauen Sie sich die an Komet Projekt für weitere technische Informationen.

Andere Tipps

Was würden Sie empfehlen?

XMPP über BOSH

Es besteht keine Notwendigkeit, Ihr eigenes Nachrichtenformat und Transportprotokoll zu erfinden, wenn jemand anderes dies getan hat.Wenn Sie es versuchen, wird es langsam genauso komplex wie BOSH, jedoch ohne die Vorteile der Bibliotheksunterstützung oder Standardisierung von Drittanbietern.

Wenn Ihnen die Idee des HTTP-Pollings nicht gefällt, könnten Sie einen Flash-Film auf der Chat-Seite haben, der eine ständige Verbindung zu einem Deamon auf dem Server hat. Der Flash-Film würde dann JavaScript-Funktionen auf dem Client zur Aktualisierung aufrufen der Chat, wenn neue Nachrichten eingehen.(Es sei denn, Sie möchten eine Flash-Oberfläche für Ihren Chat.)

Vielleicht möchten Sie auch einen Blick auf Comet werfen.

Ich dachte, dass jeder für so etwas Cometd nutzt.

BOSH ist ein Standard für den Transport von XMPP über HTTP.Es handelt sich um Comet, das Daten an den Client weiterleitet.

Es gibt einen sehr guten Server für die Nachrichtenübermittlung vom Server zum Browser (genannt Komet) - Umkreist.Es lässt sich leicht in andere Technologien (Django, Rails, PHP usw.) integrieren, genau wie Memcached.

Sie sollten es unbedingt überprüfen, wenn Sie schwere Lasten bewältigen möchten.Andernfalls ist eine einfache Ajax-Abfrage der beste Weg.

Der Trick besteht darin, zu erkennen, dass Ihre App CGI nur dann auf dem Server aufrufen muss, wenn jemand etwas sagt.Befragen Sie für die regelmäßigen Umfragen eine statische Seite, die Ihr CGI-Skript jedes Mal aktualisiert, wenn es einen neuen Chat gibt.Verwenden Sie HEAD-Anfragen, vergleichen Sie die Zeitstempel mit den zuletzt gesehenen und führen Sie nur dann einen vollständigen GET durch, wenn sich diese ändern.Ich habe eine einfache, naive Chat-Anwendung auf diese Weise implementiert, und die Auslastung und Bandbreitennutzung ist für die wenigen Dutzend gleichzeitiger Benutzer, die wir haben, vernachlässigbar.

Ich habe genau das Gleiche vor ein paar Monaten gemacht und hatte Spaß daran, einfach mit den Konzepten herumzuspielen.Ich habe tatsächlich das verwendet für immer-Rahmen Technik statt Umfragen.

Der folgende Code ist meine „Comet“-JS-Datei, die die allgemeinen Konzepte enthält, die zum Einrichten eines „Party-Chats“ erforderlich sind.

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

Ich dachte, dass jeder für so etwas Cometd nutzt.

Ich stimme John zu.Aber es gab noch eine andere Frage, die nicht beantwortet wurde.
Ich habe das gemacht, aber statt einer Datenbank haben wir eine Flatfile verwendet, was letztendlich den Server lahmgelegt hat, aber erst, als wir etwa 450 aktive Benutzer hatten, und wenn wir es mit einer Datenbank gemacht hätten, wäre es wahrscheinlich geklappt besser.
Dies erfolgte über ein einfaches Hosting-Konto von Godaddy.

Bearbeiten:Übrigens klang Godaddy alles andere als amüsiert, als ich den Anruf erhielt.

Ich halte Umfragen für den einfachsten Ansatz und würde dies zunächst empfehlen.Wenn die Belastung zu einem Problem wird, beginnen Sie mit der Suche nach komplizierteren Techniken.Eine gute Diskussion über die Vor- und Nachteile finden Sie hier -http://www.infoq.com/news/2007/07/pushvspull
http://ajaxian.com/archives/a-report-on-push-versus-pull

Kasse Speeqe.Es ist ein Open-Source-Lösung für webbasierte Chatrooms, die im Hintergrund BOSH und XMPP verwenden.

Ich habe gerade diesen Beitrag gefunden, er ist alt, aber das Umfragekonzept bereitet vielen Leuten Probleme.Deshalb werde ich hier ein Implementierungsbeispiel einfügen.Aber bevor ich es dir gebe, sollte ich dir einen Rat geben, der mich vor einiger Zeit wütend gemacht hat:

Wenn Sie Umfragen durchführen, sollten Sie auf das Sitzungsverhalten achten (Rennbedingungen).Um es einfach zu machen:Wenn Sie eine Sitzung öffnen, wird die Sitzungsdatei gesperrt, bis die Sitzung geschlossen wird, um zu verhindern, dass zwei Benutzer unterschiedliche Daten hineinschreiben.Wenn Sie also eine Sitzung benötigen, um zu überprüfen, ob ein Benutzer angemeldet ist oder so, schließen Sie die Sitzung immer vor der Abfrage.

Meine Demo zeigt Ihnen ein Beispiel einer Polling-Implementierung in PHP.Ich werde keine Datenbank, sondern eine Datei verwenden.Wenn Sie auf die Schaltfläche „Abfragen“ klicken, gelangen Sie in die Schleife und bleiben bei der Abfrage, bis die Datei geändert wird.Wenn Sie das Formular ausfüllen und auf „Freigeben“ klicken, wird Ihre Eingabe in der Datei gespeichert.Die Änderungszeit der Datei ändert sich, sodass die Abfrage beendet wird.

Tipp:Verwenden Sie ein Werkzeug wie Feuerkäfer um zu sehen, was passiert.

Lassen Sie uns jetzt in einer besseren Sprache als meinem Englisch sprechen:

<?php

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

    if (isset($_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($_GET['release']))
    {
        $data = '';
        if (isset($_GET['data'])) {
            $data = $_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 $_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 $_GET['release']
            data: $('#data').val() // sets our $_GET['data']
        }
    });
});

</script>

Du kannst es versuchen Hier

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top