Ver la Versión Completa : ¿Mejor tecnologia para una app de chat sencilla?
javi9375
02/05/13, 19:38:56
Buenas, tengo que realizar una aplicación de chat sencilla para una práctica de clase. El objetivo de la práctica es que realicemos una aplicación Android en la que intervenga una comunicación con un servidor hecho por nosotros. Llevo dos o tres días investigando la técnologia con la que lo haremos y no me queda muy claro. He encontrado dos opciones:
- Usar XMPP: Según lo que leo es el protocolo que usan la mayoria de aplicaciones de chat, pero le encuentro dos problemas. El primero es que al usar un API tanto para el cliente como para el servidor, el API nos quita casi todo el trabajo de la conexión por lo que el objetivo de la practica no acaba de cumplirse. Y lo segundo es que la API que he encontrado para el cliente (aSMACK) parece un poco "no oficial" por lo que no se tampoco si será adecuado para una práctica de la Universidad.
- Usar POSTs de HttpServlet, con XMLs definidos por nosotros: esta solución es más cutre y complicada pero creo que cumplimos mejor con los objetivos de la práctica. El problema que tenemos con esto es que a la hora de mandar un mensaje de un usuario a otro, dado que el HttpServlet solo envia respuestas (o eso creemos por que no hemos trabajado mucho con ellos), habría que hacer Polling en el cliente y nos consumiria bastante. ¿Hay alguna otra forma de hacer esto con httpservlets, un servidor de presencia o callback o algo?
¿Se os ocurre alguna otra forma de realizar la comunicación? :gracias:
mocelet
02/05/13, 19:47:11
Si es sencilla y para una práctica de clase lo suyo es que uses lo que te han enseñado. Si habéis dado servlets, servlets, si habéis dado sockets TCP pues sockets, no creo que hayáis dado XMPP o SIP...
Con servlets y haciendo polling parece adecuado y sencillo para una versión básica. La bidireccionalidad en HTTP se puede conseguir con técnicas como COMET, long polling, web sockets, etc...
kriogeN
03/05/13, 09:21:31
Yo por jugar un poco con Web Sockets hice una especie de IRC, y funcionaba bastante bien y es bastante sencillo de realizar usando esa tecnología.
javi9375
04/05/13, 20:16:09
Vale, pues me informare un poco de como van los Web Sockets y si no me convence lo haré como me comenta mocelet. Gracias a los dos!
Este tema a mi me interesa (comentar que no tengo ningun conocimiento sobre estos temas). Por mas que he investigado en internete sobre estos temas, no me queda muy clara la cosa.
Necesito conectar 2 dispositivos a traves de internet, ya sea por wifi o 3g. Y que esa comunicacion sea bidireccional, que se manden stream del uno al otro, mientras estan jugando.
He investigado un poco los web sockets y he visualizado algun ejemplo, pero a la hora de conectarlos no me aclaro mucho y no se realmente si sera una buena practica.
Os agradeceria un poco de ayuda o algo de info para ir tirando
kriogeN
05/05/13, 16:29:09
Se puede hacer usando simplemente sockets entre los móviles, pero lo ideal es hacerlo con un servidor intermedio, más que nada porque con 3G la IP es muy cambiante.
En cuanto a la parte móvil usando WebSockets es bastante sencilla, yo uso AutobahnAndroid, y lo único que tienes que hacer es iniciar la clase poniendo la dirección del servidor y programar un listener para cuando recibes paquetes (si miras la documentación verás que es muy sencilla). Luego para enviar paquetes se hace también con una función. Y ya está. En muy pocas líneas de código tienes funcionando los WebSockets en el móvil.
En cuanto a la parte web es más complicado, yo lo hice con PHP usando una librerías de WebSockets y me quedó muy chapucero y muy mal. Lo ideal es usar NodeJS.
Estoy haciendo unas pruebas esta tarde y hasta que no consiga comunicacion entre ellos no paro, jejej.
En principio estoy creando un socket que escucha y un socket que envia un texto. Pero el socket cliente me da nullpointerexception al mandar el texto.
Socket Servidor:
class CommsThread implements Runnable {
public void run() {
ss = null;
try {
ss = new ServerSocket(SERVERPORT);
ss.setSoTimeout(10000);
//accept connections
Socket s = ss.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
//receive a message
String incomingMsg = in.readLine() + System.getProperty("line.separator");
tv.setText("received: " + incomingMsg);
s.close();
} catch (InterruptedIOException e) {
Log.d("ERROR1", e.toString());
} catch (IOException e) {
Log.d("ERROR2", e.toString());
}
}
}
Socket Cliente:
class CommsThread implements Runnable {
public void run() {
try {
socket = new Socket("www.luisalbes.com", SERVERPORT);
out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
} catch (UnknownHostException e) {
Log.d("ERROR1", e.toString());
} catch (IOException e) {
Log.d("ERROR2", e.toString());
}
}
}
Para enviar uso un Boton que recoge un EditText:
enviar.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
try {
EditText et = (EditText) findViewById(R.id.edit);Log.d("PRUEBA", "PRIMERO");
String str = et.getText().toString();Log.d("PRUEBA", "SEGUNDO");
out.write(str);Log.d("PRUEBA", "TERCERO");
out.flush();Log.d("PRUEBA", "CUARTO");
socket.close();
} catch (UnknownHostException e) {
tv.setText("Error1");
} catch (IOException e) {
tv.setText("Error2");
} catch (Exception e) {
tv.setText("Error3");
Log.d("error", e.toString());
}
}
});
En principio la conexion no se si la hago bien, uso mi dominio "www.luisalbes.com". De esta manera no me da ninguna execpcion de conexion.
El error lo tengo en "Log.d("PRUEBA", "TERCERO");" ahi me lanza la excepcion " Log.d("error", e.toString());"
EDITADO: el problema lo tengo en el dominio, creo que no conecta por ser dominio con hosting incluido y no se se habra opcion de convertirlo en servidor o hacer algo con este dominio.
javi9375
05/05/13, 19:16:36
rinxe siento no poder ayudarte mucho en tu tema, solo he usado sockets un par de veces y no me acuerdo muy bien, aunque como tecnologia a usar posiblemente sea lo mejor para lo que quieres hacer.
Volviendo a mi tema, creo que usare POST de hhtpservlets pa alos Web Sockets no estan soportados o tienen soporte experimental. La parte del servidor la tengo bastante clara, pero en el cliente no tengo muy claro el diseño que deberia realizar, esto es lo que tengo pensado:
- Para peticiones que respondan a botones tipo hacer login, enviar un mensaje a otro usuario etc, crear hilos dentro de la función que se llame al pusar el boton indicado (ya sea el de login o el de enviar mensaje) para que haga una peticion POST al servidor.
- Para hacer polling para recibir mensajes de otros usuarios o del servidor, tengo algo más de duda. ¿Sería mejor crear un hilo dentro del activity que sea que haga las peticiones al servidor cada cierto tiempo o sería más recomendable crear el hilo dentro de un Service ?. No he trabajado con Services pero supongo que esto me servira para que siga funcionando independientemente de la activity en la que me encuentro ¿o me equivoco?
rinxe siento no poder ayudarte mucho en tu tema, solo he usado sockets un par de veces y no me acuerdo muy bien, aunque como tecnologia a usar posiblemente sea lo mejor para lo que quieres hacer.
Nada no te preocupes, ya te digo que he mirado muchos ejemplos y la teoria me la se, pero esque las comunicaciones en Android las veo complicadas al no saber absolutamente nada. Si me pueden hechar media mano los cracks que tenemos por aqui me sobra y perdona por irrumpir asi en el tema pero mas o menos lo veia relacionado
PD: creo que mi solucion es encontrar la manera de hacer de mi dominio un servidor o directamente un servidor. Haber si hablo mañana con el amiguete que lleva los temas web y me puede hacer algo el.
Aun no he podido hablar con el amiguete, no lo he pillado en la tienda estos dias. Tengo dudas respecto a como tiene que ser el servidor, en todos sitios pintan muy bien los sockets pero nadie habla del servidor por ningun lado. Por lo que he leido tiene que ser un servidor dedicado o virtual. Apache en este caso no se si servira, esque no me merece la pena pagar un servidor con lo que cuestan pal poco uso que le voy a dar, si pudiera montarme algo aqui en el ubuntu estaria bien. Con los sockets para lo que quiero creo que me sobra.
Por lo demas creo que ya se todo el funcionamiento de los sockets y websockets estoy en las mismas, me he empapado de mucha lectura pero me falla la parte del servidor.
Y para javi9375, respecto al segundo punto a mi me parece buena la idea, no he tocado servicios aun pero lo suyo es que reciba los mensajes aunque no estes en la activity.
Ayer consegui contactar con el servidor casero que he instalado a traves de Websockets y la libreria AutobahnAndroid. Con los sockets no hubo manera y ayer saque la conclusion de que necesitaba un programa en el servidor. Tambien he visto el funcionamiento de los servlets y sus posibilidades.
Ahora no tengo claro si quiero sockets o websockets, la parte web igual no se como la hare, jejejej. Haber si hablo con este amigo mio que no a habido manera esta semana y haber como lo montamos.
PD: Gracias por la info KriogenN, me a costado comprender esto pero por finnn ;-)
vBulletin® v3.8.1, Copyright ©2000-2026, Jelsoft Enterprises Ltd.