Pregunta

Varios visitantes se conectan a http://site.com/chat.php

Cada uno de ellos puede escribir y enviar un mensaje de texto a chat.php y se muestra al instante en el navegador de todo el mundo ( http: //site.com/chat.php )

¿Tengo que usar una base de datos? Es decir, es AJAX o PHP capacidades de amortiguación suficiente para una sala de chat en tales sesiones?

¿Cómo pueden las sesiones de datos diferentes usuarios comparten el uno del otro?

Cualquier idea o ideas serán apreciados, gracias!

Edit: Gracias por los enlaces. Pero lo que quiero es la manera de enviar datos a un navegador del cliente. Está en constante refrescante navegador del cliente (AJAX o no) la única manera? Asimismo, el desafío es cómo los diferentes usuarios, por ejemplo, 2, 1 a 1, los textos cuota de chat? ¿Cómo almacena ellos? Y cómo se puede sincronizar los textos entre los 2 clientes? No usar una base de datos de preferencia.

Editar 2: En realidad YShout mencionado por Peter D hace este trabajo bastante bien. No parece mantener actualizar el navegador. Pero no entiendo cómo se empuja nuevos mensajes a la ventana de usuario existente.

¿Fue útil?

Solución

existen (más o menos) 3 opciones para crear una aplicación de chat:

sockets

  

Usar flash / java y tomas de corriente para el frontend y un lenguaje de programación de sockets con capacidad para el backend. para el backend, te recomiendo Java o Python, porque están multihilo y NIO-capaz. es posible hacerlo con PHP (PHP, pero en realidad no puede hacer multihilo eficiente y generalmente no es muy adecuado para esto). esta es una opción si necesita un alto rendimiento, y probablemente no lo que estás buscando.

Uso de Ajax y tire

  

En este caso todos los clientes están constantemente (por ejemplo, siempre 2 segundos) de votación si ha sucedido algo nuevo. se siente extraña, ya que sólo obtener respuestas a esos intervalos. además, se pone bastante presión en su servidor y ancho de banda. sabes una aplicación utiliza esta técnica ya que el navegador se actualiza constantemente. esta es una solución subóptima.

uso ajax y empuje

  

esto funciona con varias copias de las respuestas y desde hace mucho tiempo la ejecución de scripts (PHP) en el backend. no es la mejor solución, pero la mayoría de las veces es mejor que tirar y funciona y se utiliza en varias aplicaciones de chat conocidos. esta técnica se denomina a veces COMET .

Mi consejo: si usted necesita una aplicación de chat para uso en producción, instalar uno ya existente. aplicaciones de chat de programación no es que fácil.

Si lo que desea es aprender, comenzar con una aplicación sencilla ajax / tirón, y luego tratar de programar uno usando ajax y empuje.

y sí, muy probablemente necesitará una base de datos, dura i implementado con éxito una solución ajax / tirón muy simple que funciona con archivos de texto para la diversión (pero sin duda no lo uso en la producción!).

es (que yo sepa, pero estoy bastante seguro), no es posible crear una aplicación de chat sin final del lado del servidor (con sólo frontend Javascript solo)!

ACTUALIZACIÓN

Si usted quiere saber cómo se hace de los datos empujar, mirar a la fuente aquí: http: //wehrlos.strain.at/httpreq/client.html . multiparte asíncrono es lo que quiere:)

function asSendSyncMulti() {
    var httpReq = new XMLHttpRequest();

    showMessage( 'Sending Sync Multipart ' + (++this.reqCount)  );

    // Sync - wait until data arrives
    httpReq.multipart   = true;     
    httpReq.open( 'GET', 'server.php?multipart=true&c=' + (this.reqCount), false );
    httpReq.onload = showReq;
    httpReq.send( null );
}

function showReq( event ) {
    if ( event.target.readyState == 4 ) {
        showMessage( 'Data arrives: ' + event.target.responseText );
    }
    else {
        alert( 'an error occured: ' + event.target.readyState );
    }

}

showReq se llama cada vez los datos llegan, no sólo una vez, como en Ajax-solicitudes regulares (no estoy usando jQuery o prototipo aquí, así que el código es un poco obeso - esto es muy antigua: )).

aquí está la parte del lado del servidor:

<?php

    $c = $_GET[ 'c' ];

    header('Content-type: multipart/x-mixed-replace;boundary="rn9012"');

    sleep( 1 );

    print "--rn9012\n";
    print "Content-type: application/xml\n\n";
    print "\n";
    print "Multipart: First Part of Request " . $c . "\n";
    print "--rn9012\n";
    flush();

    sleep( 3 );

    print "Content-type: application/xml\n\n";
    print "\n";
    print "Multipart: Second Part of Request " . $c . "\n";
    print "--rn9012--\n";

?>

update2

con respecto a la base de datos: si usted tiene una arquitectura de nada-compartido, como mod_php / cgi en el backend, que Definitivamente necesidad algunos tipo de almacenamiento externo, como bases de datos o archivos de texto. pero: se podía confiar en la memoria escribiendo su propio servidor HTTP (posible con php, pero yo no lo recomiendo para un trabajo serio). Eso no es realmente complicado, pero probablemente un poco fuera del alcance de su pregunta ^^

Update3

he cometido un error! ¿Tiene todo mezclado, porque ha pasado mucho tiempo que en realidad hice algo por el estilo. aquí están las correcciones:

  1. respuestas de varias partes sólo funcionan con los navegadores Mozilla y por lo tanto son de uso limitado. COMET no significa multiparte-respuesta.

  2. significa COMET: respuesta singlepart tradicional, pero celebrada (con un bucle infinito y dormir) hasta que hay datos disponibles. por lo que el navegador tiene 1 petición / respuesta para cada acción (en el peor de los casos), no una solicitud cada x segundos, incluso si nada sucede respuesta digna.

Otros consejos

Usted menciona querer que esto funcione sin una base de datos, y sin que el cliente (s) de votación el servidor de actualizaciones.

En teoría se puede hacer esto mediante el almacenamiento del "registro" de los chats en un archivo de texto en el servidor, y cambiar su página para que el usuario hace una petición GET en la página chat.php, pero la página PHP en realidad nunca termina de enviar de vuelta al usuario. (Por ejemplo, la respuesta nunca completa)

Usted tendría que enviar a algunos " sin op " datos para mantener la conexión en marcha cuando no hay mensajes, pero en teoría esto iba a funcionar.

El problema es que para lograr lo anterior es todavía mucho trabajo. Usted tendría que hacer AJAX mensajes de vuelta al servidor para enviar nuevos comentarios ... el explorador del usuario podría estar girando el todo el tiempo (a menos que el nido del registro de chat en un iframe - por ejemplo, más trabajo) ... y este tipo de configuración sólo sería muy difícil de manejar.

Yo sugeriría agarrando un script de chat libre de otros lugares (por ejemplo, http://tinychat.com/ ) o si quieres rodar su propia (por diversión / experiencia) y luego seguir adelante, pero comenzar con una base de datos y construir una página que va a empujar y tirar de los mensajes del servidor.

Por último, si usted está preocupado por "martilleo" el servidor con peticiones AJAX ... no lo hacen. Sólo construir el chat, a continuación, si se encuentra que hay problemas de rendimiento, volver a stackoverflow con una pregunta sobre la forma de optimizarlo para que cientos de peticiones no están inundando el chat cuando no hay actividad.

Mientras que HTTP no está hecho para una fácil empujar, es posible emular una conexión empuje haciendo que el script PHP nunca se terminará y no el resultado de JavaScript ser vigilados cuidadosamente.

En esencia estás simulando un lector corriente.

Si desea cargar nuevos usuarios a una historia de la charla que tuvo lugar antes de entrar en la habitación, una base de datos u otro almacenamiento que se requiere. A menos que usted está tratando de crear una charla para el aprendizaje, hay muchos por ahí para utilizar de forma gratuita a molestar.

http://tinychat.com es otro sitio de chat sencilla.

AJAX funciona bien. He creado una página simple para uno de mis sitios. Pero me parece que el chat no se acostumbra tan a menudo como se podría pensar.

Compartir datos se vuelve un poco más complicado y sería más fácil de lograr organizando un servidor IRC y permitir a los usuarios utilizar los clientes de IRC que tienen la capacidad de intercambio de datos. Aunque nada le impide tener carga un usuario al sitio, entonces los demás descarga. Persona a persona sería difícil con el uso de una interfaz web, ya que los usuarios no están conectados de alguna manera con los demás.

  

y muestra al instante en el navegador de todo el mundo

Con php / JS no puede enviar datos desde el servidor a los clientes. Por lo que sus clientes necesitan para solicitar datos desde el servidor. Y eso es lo scunliffe ha descrito en su puesto.

Usted puede hacer esto en su totalidad con HTML y Javascript usando un servicio como PubNub . Usted no necesita una base de datos que usted podría utilizar algo así como el API historia para poblar los mensajes de chat últimos x.

Aquí hay un tutorial rápido en la construcción de una aplicación de chat con PubNub.

en tiempo real Aplicaciones de Chat en 10 líneas de código

introducir descripción de la imagen aquí

Enter Chat and press enter
<div><input id=input placeholder=you-chat-here /></div>

Chat Output
<div id=box></div>

<script src=http://cdn.pubnub.com/pubnub.min.js></script>
<script>(function(){
var box = PUBNUB.$('box'), input = PUBNUB.$('input'), channel = 'chat';
PUBNUB.subscribe({
    channel  : channel,
    callback : function(text) { box.innerHTML = (''+text).replace( /[<>]/g, '' ) + '<br>' + box.innerHTML }
});
PUBNUB.bind( 'keyup', input, function(e) {
    (e.keyCode || e.charCode) === 13 && PUBNUB.publish({
        channel : channel, message : input.value, x : (input.value='')
    })
} )
})()</script>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top