Foros del Web » Programando para Internet » PHP »

CHAT, ¿como empezar?

Estas en el tema de CHAT, ¿como empezar? en el foro de PHP en Foros del Web. Hola a todos, para poder pasar al siguimiente semestre de estudio me han dejado el siguiente trabajo. 1. Realizar un chat el cual tendra un ...
  #1 (permalink)  
Antiguo 13/04/2014, 10:07
Avatar de sandrapatricia2468  
Fecha de Ingreso: abril-2014
Mensajes: 7
Antigüedad: 10 años
Puntos: 0
CHAT, ¿como empezar?

Hola a todos, para poder pasar al siguimiente semestre de estudio me han dejado el siguiente trabajo.

1. Realizar un chat el cual tendra un cliente java, un cliente web, un cliente en android (APP) y un cliente en .NET.

2. Debo utilizar como servidor web Nginx, como base de datos mongoDB y como lenguaje de lado de servidor PHP. (ya pude configurar el servidor con php y mongodb, estan conectados). Queria pedirles concejo de como debo empezar o que lecturas debo seguir. esto me tiene en estos momentos. Gracias....!
  #2 (permalink)  
Antiguo 13/04/2014, 10:23
 
Fecha de Ingreso: abril-2014
Ubicación: Canarias!
Mensajes: 150
Antigüedad: 10 años
Puntos: 10
Respuesta: CHAT, ¿como empezar?

Como lo estas estudiando y lo tienes como actividad, me imagino que con explicarte el procedimiento "como lo haria yo" seria suficiente. Ya si necesitas especificaciones técnicas me las pides. Vamos a hablar únicamente del cliente web.

Otra cosa, hay 2 tipos diferentes de chat, estan los chats tipo IRC (todos juntos) o chats por canales (en un mismo cliente, diferentes chat 1a1) es una diferencia de concepto bastante amplia.

La Teoria:
-Creas un html con la interfaz del chat, las etiquetas html las debes definir adecuadamente con clases e id's, AUNQUE NO VAYAS USAR CSS. Documenta con id's las principales etiquetas, tenga una referencia única en el DOM
-Creas un controlador php que hace una consulta a la base de datos, y devuelva el resultado en formato JSON
-Ahora la pieza que lo completa, Jquery. Inserta en el html de antes el link para la libreria Jquery, create un archivo js aparte e incluye la referencia en el html.

En ese archivo JS haces una petición AJAX short-polling a la ruta del controlador php creado. Short polling significa que cada 2-3 segundos pregunta al servidor si hay datos nuevos. El servidor va responder con false o un json con los datos nuevos. Javascript trata un json que recibe como un objeto, entonces con la habilidad de jquery manipulas todo el DOM del html actualizandolo con los resultados del servidor.

Esa seria la lógica, cualquier cosa pregunta.
Un saludo

EDIT: Para enviar mensajes necesitarias una funcion jquery y un controlador aparte. Arriba solo defini la recepción de datos nuevos
__________________
Pautas php:
No usar libreria mysql, usa mysqli; Separar siempre los controladores de la vista; Procedual es feo, ama los objetos
  #3 (permalink)  
Antiguo 13/04/2014, 10:37
Avatar de sandrapatricia2468  
Fecha de Ingreso: abril-2014
Mensajes: 7
Antigüedad: 10 años
Puntos: 0
Respuesta: CHAT, ¿como empezar?

Qazser gracias por tu pronta respuesta. Mi objetivo es que cuando un usuairo va ingresar al chat éste se loguee e ingresa a la sala. Una ves que ingrese en la sala se muestra un sección donde están los usuarios que están conectados y una conversación general de todos los usuarios. El usuario decide si quedarse en el chat general o dar doble click sobre el usuario con el que decida generar conversación privada.

Te entendi perfectamente como iniciar el cliente Web (gracias ), ¿podrias orientarme acerca de como debe trabajar PHP del lado del servidor? Te agradezco.
  #4 (permalink)  
Antiguo 13/04/2014, 10:52
Avatar de sandrapatricia2468  
Fecha de Ingreso: abril-2014
Mensajes: 7
Antigüedad: 10 años
Puntos: 0
Respuesta: CHAT, ¿como empezar?

Cita:
Iniciado por Qazser Ver Mensaje
Como lo estas estudiando y lo tienes como actividad, me imagino que con explicarte el procedimiento "como lo haria yo" seria suficiente. Ya si necesitas especificaciones técnicas me las pides. Vamos a hablar únicamente del cliente web.

Otra cosa, hay 2 tipos diferentes de chat, estan los chats tipo IRC (todos juntos) o chats por canales (en un mismo cliente, diferentes chat 1a1) es una diferencia de concepto bastante amplia.

La Teoria:
-Creas un html con la interfaz del chat, las etiquetas html las debes definir adecuadamente con clases e id's, AUNQUE NO VAYAS USAR CSS. Documenta con id's las principales etiquetas, tenga una referencia única en el DOM
-Creas un controlador php que hace una consulta a la base de datos, y devuelva el resultado en formato JSON
-Ahora la pieza que lo completa, Jquery. Inserta en el html de antes el link para la libreria Jquery, create un archivo js aparte e incluye la referencia en el html.

En ese archivo JS haces una petición AJAX short-polling a la ruta del controlador php creado. Short polling significa que cada 2-3 segundos pregunta al servidor si hay datos nuevos. El servidor va responder con false o un json con los datos nuevos. Javascript trata un json que recibe como un objeto, entonces con la habilidad de jquery manipulas todo el DOM del html actualizandolo con los resultados del servidor.

Esa seria la lógica, cualquier cosa pregunta.
Un saludo

EDIT: Para enviar mensajes necesitarias una funcion jquery y un controlador aparte. Arriba solo defini la recepción de datos nuevos

Qazser gracias por tu pronta respuesta. Mi objetivo es que cuando un usuairo va ingresar al chat éste se loguee e ingresa a la sala. Una ves que ingrese en la sala se muestra un sección donde están los usuarios que están conectados y una conversación general de todos los usuarios. El usuario decide si quedarse en el chat general o dar doble click sobre el usuario con el que decida generar conversación privada.

Te entendi perfectamente como iniciar el cliente Web (gracias ), ¿podrias orientarme acerca de como debe trabajar PHP del lado del servidor? Te agradezco.
  #5 (permalink)  
Antiguo 13/04/2014, 11:04
 
Fecha de Ingreso: abril-2014
Ubicación: Canarias!
Mensajes: 150
Antigüedad: 10 años
Puntos: 10
Respuesta: CHAT, ¿como empezar?

Debes tener en siempre en cuenta que chat NO es igual a chat.

Te hablo de experiencia, soy desarrollador de una página de contactos e hicimos que la forma de contactar a la otra persona fuera mediante un chat...Si la otra persona no se encuentra pues cuando se conectaba lo recibia, así nos evitamos crear un módulo de mensajes privados.

Quieres tanto un chat todos con todos, como un chat 1 con 1. Mi consejo es que los trates como 2 cosas diferentes, además complica muchísimo las cosas.

El tema es como plantearselo, una vez que tienes un plan con pautas programarlo es facil.

Usemos un sistema por transmisiones.
0 es a todos
>0 es a refiriendose a la id del usuario conectado al chat

En la base de datos mongo, cuando guardas los mensajes del chat, debes indicar a que canal estaba destinado el mensaje.

En php creas estas funciones (me imagino que el login y eso no necesito explicarlo)

-Solicitar todos los mensajes nuevos (de sala 0 y donde sala == id del usaurio), esta funcion tiene que devolver un array en formato json con el mensaje en si, y la sala a la que estaba destinado...Así en el cliente web podemos separarlo entre: mensaje global y mensaje privado)

-Enviar mensaje a sala, esta funcion la llama el cliente cuando efectivamente envia un mensaje, recibe el mensaje y la sala en la que se encuentra (lo averiguamos mediante el dom del html), devuelve true o false

Ambas funciones recibirán una ruta directa..O sea si pones en el navegador /chatmensaje debe ejecutar directamente esa función..Te dejó la teoria solo ya que no sé como es la base php que elegistes, pero no le veo un gran problema.

En todoas las funciones tienes que comprobar:
-Si el usuario que accede a la función se encuentra
-Que se ha accedido a la ruta mediante AJAX...Si alguien pone manualmente el enlace en el navegador está intentando vulenerar el sistema, no podemos tolerarlo

Hay una funcion genial en php para comprobar si la petición fue recibida mediante ajax o no, te dejo un trozo de mi código

Código PHP:
        //Ser ajax
        
if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')
            
$this->is_ajax TRUE;
        else
            
$this->is_ajax FALSE
No sé si me he enrollado demasiado, o me falto por explicar algo, avisame si necesitas mas informacion.


Con estas funciones, el cliente deberia saber siempre cuando un mensaje que recibe es de global y cuando es de otro usuario.


EDIT: se me olvidó que no solo se usa para la web sino que tambien para android, etc..Olvida lo de AJAX.
__________________
Pautas php:
No usar libreria mysql, usa mysqli; Separar siempre los controladores de la vista; Procedual es feo, ama los objetos

Última edición por Qazser; 13/04/2014 a las 11:12
  #6 (permalink)  
Antiguo 13/04/2014, 11:31
 
Fecha de Ingreso: abril-2014
Ubicación: Canarias!
Mensajes: 150
Antigüedad: 10 años
Puntos: 10
Respuesta: CHAT, ¿como empezar?

Déjame comenzar nuevamente que me lo habia planteado demasiado simple...Es que soy desarrollador web principalmente, aun no me acosumbrado a pensar de manera multiplataforma donde un servidor debe sastisfacer diferentes clientes a la vez.

Sigo diciendo que plantearselo lo es todo, en el trabajo nos pasamos dias, semanas antes de comenzar un proyecto apuntando en papel un plan de como hacerlo.

Voy a describir casos del chat..

Estas en la sala pública, alguien ha abierto una ventana de chat contigo y te escribió, a ti te debe salir en un lateral el nombre de usuario que te escribió.

Estas en una sala con otro contacto...¿Debe avisarte si escriben en la sala pública? supongo que no.

Tu Pinchas en un nombre de usuario, en ese momento el ¿servidor debe saber que ya no estas en la sala principal? o simplemente cambiamos la petición que hará el cliente al servidor..dejará de pedir todas las conversación, empezará a pedir las conversaciones a su id.

Vamos a listar las funciones que debe realizar el servidor

-Login
-Devolver lista de amigos
-Devolver mensajes de sala global y nombres de usaurio si te escribieron privado
-Devolver mensajes únicamente destinadas a tu id de usuario

Veo el php en posicion de un servidor API.

Problemas que yo veo: Autentificacion...Solo he usado php con navegadores como clientes hasta ahora. La sessión PHP tiene que ir por cookies, todas las plataformas soportan cookies?
__________________
Pautas php:
No usar libreria mysql, usa mysqli; Separar siempre los controladores de la vista; Procedual es feo, ama los objetos
  #7 (permalink)  
Antiguo 13/04/2014, 12:09
Avatar de sandrapatricia2468  
Fecha de Ingreso: abril-2014
Mensajes: 7
Antigüedad: 10 años
Puntos: 0
Respuesta: CHAT, ¿como empezar?

Cita:
Iniciado por Qazser Ver Mensaje
Déjame comenzar nuevamente que me lo habia planteado demasiado simple...Es que soy desarrollador web principalmente, aun no me acosumbrado a pensar de manera multiplataforma donde un servidor debe sastisfacer diferentes clientes a la vez.

Sigo diciendo que plantearselo lo es todo, en el trabajo nos pasamos dias, semanas antes de comenzar un proyecto apuntando en papel un plan de como hacerlo.

Voy a describir casos del chat..

Estas en la sala pública, alguien ha abierto una ventana de chat contigo y te escribió, a ti te debe salir en un lateral el nombre de usuario que te escribió.

Estas en una sala con otro contacto...¿Debe avisarte si escriben en la sala pública? supongo que no.

Tu Pinchas en un nombre de usuario, en ese momento el ¿servidor debe saber que ya no estas en la sala principal? o simplemente cambiamos la petición que hará el cliente al servidor..dejará de pedir todas las conversación, empezará a pedir las conversaciones a su id.

Vamos a listar las funciones que debe realizar el servidor

-Login
-Devolver lista de amigos
-Devolver mensajes de sala global y nombres de usaurio si te escribieron privado
-Devolver mensajes únicamente destinadas a tu id de usuario

Veo el php en posicion de un servidor API.

Problemas que yo veo: Autentificacion...Solo he usado php con navegadores como clientes hasta ahora. La sessión PHP tiene que ir por cookies, todas las plataformas soportan cookies?

Hola Qazer, he pensado las funciones del servidor asi:
1. Cuando el cliente web se loguea las funciones del servidor serian:
- Login
- Listar usuarios conectados (se actualizaria constantemente)
- Listar mensajes de la sala global (se actualizaria constantemente)
- Recibir mensajes del usuario logeado y mostrarlos en la sala global

2. Cuando el cliente web pinche sobre un usuario de la sala general se abriria una nueva pestaña 'privada', una nueva ventana privada, 'o lo que sea'. En este caso las funciones del servidor serian:
- Mantener las funciones del item 1 (excepto login)
- Recibir mensajes del usuario logueado y mostrarlos en la pestaña o ventana privada (y viceversa con el otro usuario con el que inicio conversacion privada)

¿que opinas?

Y también me gustaria preguntarte que opinas sobre - Long Polling -. Me dicen que es mejor.

Gracias.
  #8 (permalink)  
Antiguo 13/04/2014, 12:29
 
Fecha de Ingreso: abril-2014
Ubicación: Canarias!
Mensajes: 150
Antigüedad: 10 años
Puntos: 10
Respuesta: CHAT, ¿como empezar?

Nosotros habiamos usado el long polling y nos causó muchísimos problemas.
..La teoria es la siguiente

Ajax envia una petición al servidor php...Ajax envia la siguiente petición desde que reciba respuesta del servidor.

El sevidor crea un bucle de..digamos 30-40-60 segundos, en el que cada par de segundos hace una consulta a la base de datos. Ese bucle en el php es lo que diferencia el short del long polling..El short es enviar consulta, php te dice si o no, ajax hace la siguiente.

El gran problema es que, a diferencia de las consultas cortas que debe responder el php con el short polling...Con el long polling el servidor Bloquea...Lo bloquea todo.

En una página web es normal tener varias pestañas abiertas a la vez..por ejemplo yo tengo 2 pestañas abiertas sobre fdw ahora mismo, estoy esperando una respuesta de un mp y lo actualizo cada par de segundos...si una de las pestañas tendria el chat NO podria hacerlo, porque PHP NO hace varios procesos para el mismo usuario...Y no encontramos configuración para quitarlo por completo. La carga del php aumenta considerablemente por el bucle, y nos reventó el servidor. A los 5 usuarios simultaneos podiamos ir reiniciando el servidor...y teniamos un vps potente, no estabamos en shared hosting.. (si, al principio estabamos en hosting compartido, pensabamos que no era para tanto, pero al minuto petó).

Puede que exista alguna configuración con la que php no bloquea...Pero bloquea de varios modos simultaneamente. Una razón es porque con un proceso bloquea la sessión del usuario, pero habia una función para liberar la sesión y aun así, iba fatal.

Al final pasamos de todo, borramos todo el código, pasamos a nodeJS e hicimos el chat de nuevo, ahora va perfecto en tiempo real, pero esto es otra historia que no viene a cuento jaja.

Y....En otra página web tengo un chat con short polling y nunca he recibido queja de un usuario, por eso, si tengo que elgir, personalmente me inclino al short, porque bloquea menos.

--------------------------------------------------------------------------

Ahora con respecto al planteamiento:

Todo bien pero te faltó un punto a mi parecer.
-Notificar al usuario si recibe un mensaje por una pestaña privada

Y cuando envie mensajes, que NO lo haga a la sala global, sino la actual, por si está en la pestaña privada
__________________
Pautas php:
No usar libreria mysql, usa mysqli; Separar siempre los controladores de la vista; Procedual es feo, ama los objetos
  #9 (permalink)  
Antiguo 14/04/2014, 02:03
 
Fecha de Ingreso: abril-2014
Ubicación: Canarias!
Mensajes: 150
Antigüedad: 10 años
Puntos: 10
Respuesta: CHAT, ¿como empezar?

Una cosa que se me ocurrió ahora, en mongodb hay un "optlog"..No lo he usado en práctica pero investigando sobre el framework meteor he leido que es como una memoria intermedia que guarda los ultimos cambios en la base de datos a la que puedes acceder con el lenguaje sin tener que ir al mongo. Con el optlog encuentras antes las cosas y deja con menos carga al servidor. No sé como unirlo a php, solo he leido sobre ello, pero quizas tu encuentres más.

Otro detalle, para convertir php en tiempo real existe una libreria que hace uso de sockets, se llama Ratchet. He intentado usarla un par de veces pero pasamos a node, sin embargo te podria servir. aunque no sé si un cliente .NET por ejemplo soporta sockets.
__________________
Pautas php:
No usar libreria mysql, usa mysqli; Separar siempre los controladores de la vista; Procedual es feo, ama los objetos

Última edición por Qazser; 14/04/2014 a las 03:40
  #10 (permalink)  
Antiguo 14/04/2014, 07:56
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: CHAT, ¿como empezar?

Long polling? Porque una plataforma, o varias de las posibles, tengan una restricción (que no siempre la tienen), *todas* las plataformas la van a tener?
Un cliente java, .net, y hasta una app android no deberían hacer polling.Deberían mantener una conexión permanente.Incluso con php debería mantener una conexión permanente siempre que el cliente lo permita, vía Websockets o comet.
  #11 (permalink)  
Antiguo 14/04/2014, 08:04
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: CHAT, ¿como empezar?

Cita:
Iniciado por Qazser Ver Mensaje
En una página web es normal tener varias pestañas abiertas a la vez..por ejemplo yo tengo 2 pestañas abiertas sobre fdw ahora mismo, estoy esperando una respuesta de un mp y lo actualizo cada par de segundos...si una de las pestañas tendria el chat NO podria hacerlo, porque PHP NO hace varios procesos para el mismo usuario...
Y no encontramos configuración para quitarlo por completo. La carga del php aumenta considerablemente por el bucle, y nos reventó el servidor.
Pues no buscásteis suficiente.Es perfectamente posible hacerlo.Eso de que PHP "NO" abre varios "procesos" para el mismo "usuario"...Qué es "usuario" según PHP? PHP no tiene "usuarios", y, mucho menos, "procesos asociados a un usuario".
Lo que sí que hace PHP es bloquear el fichero de sesión, si se usan las sesiones por defecto.Y mientras alguien tenga abierto el fichero de sesión (por ejemplo, un long_polling que abra la sesion ***y no la cierre*** cuando no la necesita), el resto de las requests estarán esperando a que se desbloquee el fichero.
Yo he hecho chats con comet y php.Abriendo la sesión,copiando los datos, y ***cerrando la sesion*** (ojo, no "destruyendola"), funciona perfectamente y no se bloquea nada.
  #12 (permalink)  
Antiguo 14/04/2014, 09:06
 
Fecha de Ingreso: abril-2014
Ubicación: Canarias!
Mensajes: 150
Antigüedad: 10 años
Puntos: 10
Respuesta: CHAT, ¿como empezar?

Nosotros hemos cerrado sessión "sin destruirla", tranquilo, la aplicación seguia tirando el servidor.

He contado una experiencia personal, basada en el lanzamiento de una aplicación web, que ha llevado consigo un estudio para su implementación. No le digo a nadie lo que debe hacer.

Tu dices que funciona, no te contradigo.
Yo ya dije, tengo en uns web un chat con short polling, funcionando perfectamente, sin bloqueos tampoco.
__________________
Pautas php:
No usar libreria mysql, usa mysqli; Separar siempre los controladores de la vista; Procedual es feo, ama los objetos
  #13 (permalink)  
Antiguo 14/04/2014, 09:06
Avatar de sandrapatricia2468  
Fecha de Ingreso: abril-2014
Mensajes: 7
Antigüedad: 10 años
Puntos: 0
Respuesta: CHAT, ¿como empezar?

Cita:
Iniciado por dashtrash Ver Mensaje
Pues no buscásteis suficiente.Es perfectamente posible hacerlo.Eso de que PHP "NO" abre varios "procesos" para el mismo "usuario"...Qué es "usuario" según PHP? PHP no tiene "usuarios", y, mucho menos, "procesos asociados a un usuario".
Lo que sí que hace PHP es bloquear el fichero de sesión, si se usan las sesiones por defecto.Y mientras alguien tenga abierto el fichero de sesión (por ejemplo, un long_polling que abra la sesion ***y no la cierre*** cuando no la necesita), el resto de las requests estarán esperando a que se desbloquee el fichero.
Yo he hecho chats con comet y php.Abriendo la sesión,copiando los datos, y ***cerrando la sesion*** (ojo, no "destruyendola"), funciona perfectamente y no se bloquea nada.
Gracias dashtrash, parece que tienes mucha experiencia. Te agredeceria si pudieras regalarme el link de algún ejemplo de Chat usando PHP, un cliente WEB y una base de datos. Sigo leyendo fuertemente para realizar preguntas mas específicas. Chau
  #14 (permalink)  
Antiguo 14/04/2014, 09:24
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: CHAT, ¿como empezar?

Cita:
Iniciado por Qazser
He contado una experiencia personal, basada en el lanzamiento de una aplicación web, que ha llevado consigo un estudio para su implementación. No le digo a nadie lo que debe hacer.
Cita:
Te agredeceria si pudieras regalarme el link de algún ejemplo de Chat usando PHP, un cliente WEB y una base de datos. Sigo leyendo fuertemente para realizar preguntas mas específicas. Chau
Los dos que he hecho los hice desde cero, y no eran chats, sino aplicaciones en "tiempo real", dentro de lo que da el protocolo HTTP.No eran algo fácil de convertir en algo independiente que se descargue.De todas formas, una busqueda en google de PHP comet chat te da miles de resultados.
En http://jsjoy.com/blog/197/simple-php-comet-example hay un ejemplo, aunque lo que ha hecho es mover el polling de sitio (ahora está en el servidor).

El problema que puedes tener con comet es, sobre todo, los antivirus.Algunos intentan capturar la página para escanearla en busca de virus, antes de pasar el resultado al navegador.Como una petición comet nunca termina, el antivirus se queda indefinidamente con los datos.
Aun así, esto es fácil de controlar (si el cliente no recibe información del servidor durante X segundos, pasa a hacer short o long polling).

Teniendo varios clientes, y varios modos de comunicarse con el servidor, gran parte del problema de tu aplicación es separar bien esas capas.Que el sistema de chat (crear sala/añadir usuario a sala/abandonar sala/enviar mensaje publico/enviar mensaje a usuario), sea independiente de cómo se reciben las peticiones, y cómo se envían las respuestas.

Etiquetas: chat
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:59.