Pregunta

En el proyecto en el que estoy trabajando actualmente, tenemos la necesidad de desarrollar un chat en la web de la aplicación, no es muy complejo de chat, sólo una manera de conectar a dos personas hablar acerca de un tema específico, no necesitamos ningún tipo de autenticación para uno de los dos usuarios, no tenemos que apoyar a los emoticonos, avatares, o cosas por el estilo.

Algunos miembros sugirieron que se puede usar XMPP a través de BOSH, me dijo que es como tratar de atrapar un pez con un barco de la red, y la propuesta de un método más simple, como un simple Ajax/MySQL chat en la web, pero estamos preocupados por el impacto en el rendimiento en el servidor debido a la constante sondeo de muchas charlas abiertas al mismo tiempo.

Nadie ha hecho algo como esto antes?¿Qué recomendaría usted?

¿Fue útil?

Solución

También puede que desee ver en el Cometa.

Es utilizado por GTalk, Meebo, y muchos otras aplicaciones de chat.Hace un par de años cuando estuve experimentando con ella, no había muchas bibliotecas o los detalles acerca de la arquitectura del servidor a la práctica, pero parece que hay un montón más de cosas ahora.

Eche un vistazo a la cometd proyecto para obtener más información técnica.

Otros consejos

¿Qué recomendaría usted?

XMPP a través de BOSH

No hay necesidad de inventar su propio formato de mensaje de protocolo de transporte y cuando alguien más tiene.Si lo intenta, va a crecer lentamente a ser tan complejo como BOSH, pero sin el beneficio de terceros soporte de la biblioteca o de normalización.

Si no te gusta la idea de HTTP de votación, usted podría tener un Flash-película en el chat de la página que tiene una conexión constante a algún demonio en el servidor, el Flash de la película debería invocar funciones de JavaScript en el cliente para actualizar el chat de mensajes nuevos que viene.(A menos que quieras una interfaz Flash para tu chat..)

También puede que desee ver en el Cometa.

Pensé que todo el mundo utiliza cometd para este tipo de cosas.

BOSH es un estándar para el transporte de XMPP a través de HTTP.Implica Cometa para enviar datos al cliente.

Hay un muy buen servidor para la manipulación de mensaje empujando desde el servidor al navegador (apodado Cometa) - Orbitaba.Es fácil de integrar con otras tecnologías (Django, Rails, PHP, etc.) como memcached.

Usted realmente debe comprobar si se desea controlar de gravedad de la carga.De lo contrario, Ajax simple sondeo es la mejor manera.

El truco es darse cuenta de que la única vez que la aplicación necesita invocar CGI en el servidor es cuando alguien dice algo.Para regular las encuestas, la encuesta de una página estática que tu script CGI actualizaciones cada vez que hay un nuevo chat.El uso de la CABEZA de solicitudes, comparar las marcas de tiempo con aquellos visto por última vez, y sólo una completa OBTIENE cuando los cambios.Tengo una simple ingenuo aplicación de chat implementado de esta manera, y la carga y uso de ancho de banda es despreciable para las pocas decenas de usuarios simultáneos que tenemos.

Yo lo hice y lo mismo hace un par de meses y se ha divertido jugando con los conceptos.Yo en realidad se utiliza el para siempre-marco técnica, en lugar de la votación.

El código a continuación es mi "cometa" archivo js que contiene los conceptos generales necesarios para obtener un "chat" el programa de instalación.

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

Pensé que todo el mundo utiliza cometd para este tipo de cosas.

Estoy de acuerdo con Juan.Pero hay otra pregunta que no fue contestada.
He hecho esto, pero en lugar de utilizar una base de datos hemos utilizado un archivo plano, se hizo finalmente paralizar el servidor, pero no fue hasta que ha ~450 usuarios activos, y si lo había hecho con una base de datos probablemente habría ido mejor.
Esto fue hecho en un básico de la cuenta de hosting de Godaddy.

Editar:BTW Godaddy sonaba menos gracia cuando recibí la llamada telefónica.

Creo que la votación es el método más sencillo y recomendaría que primero.Si la carga se convierte en un problema de inicio, buscando en la más complicada de las técnicas.Una buena discusión sobre los pros y los contras están aquí - http://www.infoq.com/news/2007/07/pushvspull
http://ajaxian.com/archives/a-report-on-push-versus-pull

Checkout Speeqe.Su un solución de código abierto para la Web basado en las salas de chat que utiliza BOSH y XMPP detrás de las escenas.

Acabo de encontrar este post, es viejo, pero de votación concepto da problemas para un montón de encanto.Así que voy a poner un ejemplo de aplicación aquí.Pero antes de darle a usted, debería darte un consejo que me hizo enojar hace algún tiempo :

Cuando encuesta, usted debe tomar el cuidado de sesiones de la conducta (las condiciones de carrera).Para hacerlo simple :si se abre una sesión, la sesión archivo está bloqueado hasta que se cierre la sesión para evitar 2 theads de escritura de datos diferentes en ella.Así que, si necesitas una sesión para comprobar si un usuario se registra o así, siempre cerrar la sesión antes de la votación.

Mi demo le da un ejemplo de un sondeo de aplicación en PHP.No voy a utilizar una base de datos, pero un archivo en su lugar.Cuando usted haga clic en botón de votación, se entra en el bucle y hasta que el archivo es modificado, se quedará de votación.Cuando usted llene el formulario y haga clic en Liberación, lo que se ha escrito serán guardados en el archivo.Fecha de modificación del archivo que va a cambiar por lo que la votación se detendrá.

Sugerencia:el uso de una herramienta como Firebug a ver lo que sucede.

Ahora vamos a hablar de una mejor langage que mi inglés :

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

Puedes probarlo aquí

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top