Domanda

Nel progetto a cui sto lavorando attualmente abbiamo la necessità di sviluppare un'applicazione di web chat, non una chat molto complessa, solo un modo per connettere due persone per parlare di un argomento ben specifico, non abbiamo bisogno di alcun tipo di autenticazione per uno dei due utenti non è necessario supportare emoticon, avatar o cose del genere.

Alcuni membri del progetto hanno suggerito che potremmo usare XMPP tramite BOSH, ho detto che è come provare a catturare un pesce con la rete di una barca e ho proposto un metodo più semplice, come una semplice chat web Ajax/MySQL, ma siamo preoccupati per le prestazioni colpito nel server a causa del polling costante di molte chat aperte contemporaneamente.

Qualcuno ha già fatto qualcosa del genere?Cosa raccomanderesti?

È stato utile?

Soluzione

Potresti anche voler esaminare Cometa.

È utilizzato da GTalk, Meebo e molti altri altre applicazioni di chat.Qualche anno fa, quando lo stavo sperimentando, non c'erano molte librerie o dettagli sull'architettura del server per implementarlo, ma sembra che ora ci sia molto più materiale disponibile.

Dai un'occhiata a cometa progetto per ulteriori informazioni tecniche.

Altri suggerimenti

Cosa raccomanderesti?

XMPP tramite BOSH

Non è necessario inventare il proprio formato di messaggio e protocollo di trasporto quando qualcun altro lo ha fatto.Se ci provi, diventerà lentamente altrettanto complesso di BOSH ma senza il vantaggio del supporto o della standardizzazione di librerie di terze parti.

Se non ti piace l'idea del polling HTTP, potresti avere un filmato Flash sulla pagina della chat che ha una connessione costante a qualche demone sul server, il filmato Flash invocherà quindi le funzioni JavaScript sul client per aggiornare la chat man mano che arrivano nuovi messaggi.(A meno che tu non voglia un'interfaccia Flash per la tua chat..)

Potresti anche voler esaminare Comet.

Pensavo che tutti usassero Cometd per questo genere di cose.

BOSH è uno standard per il trasporto XMPP su HTTP.Coinvolge Comet per inviare i dati al client.

Esiste un ottimo server per gestire il push dei messaggi dal server al browser (soprannominato Cometa) - In orbita.È facilmente integrabile con altre tecnologie (Django, Rails, PHP ecc.) proprio come memcached.

Dovresti davvero controllarlo se vuoi gestire un carico serio.Altrimenti, il semplice polling Ajax è il modo migliore.

Il trucco sta nel rendersi conto che l'unica volta in cui la tua app deve invocare CGI sul server è quando qualcuno dice qualcosa.Per i sondaggi regolari, esegui il poll su una pagina statica che il tuo script CGI aggiorna ogni volta che c'è una nuova chat.Utilizza le richieste HEAD, confronta i timestamp con quelli visti l'ultima volta ed esegui un GET completo solo quando cambiano.Ho una semplice e ingenua applicazione di chat implementata in questo modo e il carico e l'utilizzo della larghezza di banda sono trascurabili per le poche decine di utenti simultanei che abbiamo.

Ho fatto la stessa cosa qualche mese fa e mi sono divertito a giocare con i concetti.In realtà ho usato il cornice per sempre tecnica invece del sondaggio.

Il codice seguente è il mio file js "cometa" che contiene i concetti generali necessari per ottenere una configurazione di "chat di gruppo".

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

Pensavo che tutti usassero Cometd per questo genere di cose.

Sono d'accordo con Giovanni.Ma c’era un’altra domanda a cui non è stata data risposta.
L'ho fatto ma invece di usare un database abbiamo usato un file flat, alla fine ha paralizzato il server, ma non è stato fino a quando non abbiamo avuto ~ 450 utenti attivi, e se lo avessimo fatto con un database probabilmente sarebbe andato tutto bene Meglio.
Questo è stato fatto su un account di hosting di base di Godaddy.

Modificare:A proposito, Godaddy sembrava meno divertito quando ho ricevuto la telefonata.

Penso che il sondaggio sia l'approccio più semplice e lo consiglierei per primo.Se il carico diventa un problema, inizia a esaminare tecniche più complicate.Una buona discussione sui pro e contro è qui -http://www.infoq.com/news/2007/07/pushvspull
http://ajaxian.com/archives/a-report-on-push-versus-pull

Guardare Discorso.È un soluzione open source per chat room basate sul Web che utilizzano BOSH e XMPP dietro le quinte.

Ho appena trovato questo post, è vecchio, ma il concetto di sondaggio dà problemi a molte persone.Quindi inserirò qui un esempio di implementazione.Ma prima di dartelo, dovrei darti un consiglio che mi fece impazzire qualche tempo fa:

Quando esegui il sondaggio, dovresti occuparti del comportamento delle sessioni (condizioni di gara).Per renderlo semplice:se apri una sessione, il file della sessione viene bloccato finché la sessione non viene chiusa per evitare che 2 thead vi scrivano dati diversi.Pertanto, se hai bisogno di una sessione per verificare se un utente è registrato o meno, chiudi sempre la sessione prima del polling.

La mia demo fornisce un esempio di implementazione del polling in PHP.Non utilizzerò un database, ma un file.Quando fai clic sul pulsante di polling, entrerai nel ciclo e finché il file non verrà modificato, continuerai a eseguire il polling.Quando compili il modulo e fai clic su Rilascia, ciò che hai digitato verrà salvato nel file.L'orario di modifica del file cambierà quindi il polling verrà interrotto.

Mancia:usa uno strumento come Firebug per vedere cosa succede

Ora parliamo in una lingua migliore del mio inglese:

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

Puoi provarlo Qui

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top