Question

Dans le projet sur lequel je travaille actuellement, nous avons besoin de développer une application de chat web, pas un chat très complexe, juste un moyen de connecter deux personnes pour parler d'un sujet très spécifique, nous n'avons besoin d'aucune sorte d'authentification. pour l'un des deux utilisateurs, nous n'avons pas besoin de prendre en charge les émoticônes, les avatars ou des trucs comme ça.

Certains membres du projet ont suggéré que nous pourrions utiliser XMPP via BOSH. J'ai dit que c'était comme essayer d'attraper un poisson avec le filet d'un bateau et j'ai proposé une méthode plus simple, comme un simple chat Web Ajax/MySQL, mais nous sommes préoccupés par les performances. a été détecté sur le serveur en raison de l'interrogation constante de nombreux chats ouverts en même temps.

Quelqu'un a-t-il déjà fait quelque chose comme ça ?Que recommanderais-tu?

Était-ce utile?

La solution

Vous voudrez peut-être aussi examiner Comète.

Il est utilisé par GTalk, Meebo et bien d'autres autres applications de chat.Il y a quelques années, lorsque je l'expérimentais, il n'y avait pas beaucoup de bibliothèques ou de détails sur l'architecture du serveur pour l'implémenter, mais il semble qu'il y ait beaucoup plus de choses maintenant.

Jetez un oeil à comète projet pour plus d’informations techniques.

Autres conseils

Que recommanderais-tu?

XMPP via BOSH

Il n'est pas nécessaire d'inventer votre propre format de message ni votre propre protocole de transport lorsque quelqu'un d'autre l'a fait.Si vous essayez, il deviendra lentement aussi complexe que BOSH, mais sans bénéficier du support ou de la standardisation de bibliothèques tierces.

Si vous n'aimez pas l'idée du sondage HTTP, vous pouvez avoir une vidéo Flash sur la page de discussion qui a une connexion constante avec un démon sur le serveur, la vidéo Flash invoquerait alors les fonctions JavaScript sur le client pour mettre à jour. le chat au fur et à mesure que de nouveaux messages arrivent.(Sauf si vous souhaitez une interface Flash pour votre chat..)

Vous voudrez peut-être également vous pencher sur Comet.

Je pensais que tout le monde utilisait Cometd pour ce genre de chose.

BOSH est une norme pour le transport de XMPP sur HTTP.Cela implique Comet pour transmettre les données au client.

Il existe un très bon serveur pour gérer les messages transmis du serveur au navigateur (appelé Comète) - En orbite.Il s'intègre facilement à d'autres technologies (Django, Rails, PHP etc.) tout comme Memcached.

Vous devriez vraiment le vérifier si vous souhaitez gérer une charge importante.Sinon, un simple sondage Ajax est le meilleur moyen.

L'astuce consiste à réaliser que le seul moment où votre application a besoin d'invoquer CGI sur le serveur, c'est lorsque quelqu'un dit quelque chose.Pour les sondages réguliers, interrogez une page statique que votre script CGI met à jour chaque fois qu'il y a une nouvelle discussion.Utilisez les requêtes HEAD, comparez les horodatages avec ceux vus pour la dernière fois et effectuez un GET complet uniquement lorsque ceux-ci changent.J'ai une simple application de chat naïve implémentée de cette façon, et la charge et l'utilisation de la bande passante sont négligeables pour les quelques dizaines d'utilisateurs simultanés que nous avons.

J'ai fait exactement la même chose il y a quelques mois et je me suis amusé à jouer avec les concepts.En fait, j'ai utilisé le cadre éternel technique au lieu d’un sondage.

Le code ci-dessous est mon fichier js "comète" qui contient les concepts généraux requis pour obtenir une configuration de "chat de groupe".

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

Je pensais que tout le monde utilisait Cometd pour ce genre de chose.

Je suis d'accord avec Jean.Mais il y avait une autre question à laquelle on ne répondait pas.
Je l'ai fait, mais au lieu d'utiliser une base de données, nous avons utilisé un fichier plat, cela a finalement paralysé le serveur, mais ce n'est que lorsque nous avons environ 450 utilisateurs actifs, et si nous l'avions fait avec une base de données, cela aurait probablement fonctionné. mieux.
Cela a été fait sur un compte d'hébergement de base de Godaddy.

Modifier:BTW, Godaddy avait l'air moins qu'amusé lorsque j'ai reçu l'appel téléphonique.

Je pense que les sondages sont l’approche la plus simple et je la recommanderais en premier.Si la charge devient un problème, commencez par examiner des techniques plus compliquées.Une bonne discussion sur les avantages et les inconvénients est ici -http://www.infoq.com/news/2007/07/pushvspull
http://ajaxian.com/archives/a-report-on-push-versus-pull

Vérifier Discours.C'est un solution open source pour les salons de discussion Web qui utilisent BOSH et XMPP en coulisses.

Je viens de découvrir ce post, il est ancien, mais le concept de sondage pose problème à beaucoup de gens.Je vais donc mettre un exemple de mise en œuvre ici.Mais avant de vous le donner, je devrais vous donner un conseil qui m'a rendu fou il y a quelques temps :

Lorsque vous effectuez un sondage, vous devez faire attention au comportement des sessions (conditions de course).Pour faire simple :si vous ouvrez une session, le fichier de session est verrouillé jusqu'à la fermeture de la session pour éviter que 2 personnes n'y écrivent des données différentes.Donc, si vous avez besoin d'une session pour vérifier si un utilisateur est connecté, fermez toujours la session avant d'interroger.

Ma démo vous donne un exemple d'implémentation de sondage en PHP.Je n'utiliserai pas de base de données, mais plutôt un fichier.Lorsque vous cliquez sur le bouton d'interrogation, vous entrerez dans la boucle et jusqu'à ce que le fichier soit modifié, vous continuerez à interroger.Lorsque vous remplissez le formulaire et cliquez sur Libérer, ce que vous avez saisi sera enregistré dans le fichier.L’heure de modification du fichier changera donc l’interrogation s’arrêtera.

Conseil:utiliser un outil comme Pyromane pour voir ce qui se passe.

Parlons maintenant dans une meilleure langue que mon anglais :

<?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>

Tu peux l'essayer ici

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top