Hola lectores el dia de hoy veremos como utilizar sockets en Android, como crearlos, enviar y recibir datos. Antes de empezar es necesario saber lo que es un socket pueden leer el sig. articulo. Básicamente lo que haremos hoy es una aplicacion ‘cliente’ para android que se conectara mediante un socket usando el protocolo TCP a una aplicaciòn ‘servidor’ escrita en JAVA J2SE, esta app nos permitira enviar datos al servidor y desde este le podremos dar un uso a estos. A continuación podrán ver como es el diagrama en una Comunicacion entre un cliente y un servidor.
Como veran primero se establece la coneccion, luego el servidor espera a que los clientes se conecten, una vez ya conectados uno hace una peticion y obtiene una respuesta hasta hacen esto hasta que la coneccion se corta. Nosotros trataremos de hacer lo mismo. En nuestro caso la app cliente estara en un dispositivo con android que se conectara mediante Wi-Fi a un router en el cual tambien esta conectada la computadora que correra la aplicacion servidor al estar hecho en java podra correr en cualquier sistema operativo.
En android el manejo de sockets por lo menos con TCP es igual que en java, aclaro que no soy un experto en este tema me he basado en vario tutoriales que encontraran al final. Cuando trabajamos con sockets podemos usar el tipo Socket en el cliente y en el servidor uno o más objetos Socket asociados a un ServerSocket. La E/S se realiza a través de objetos InputStream y OutputStream asociados a los Sockets. Lado Servidor:En el servidor debemos hacer lo sig.
- Crear el socket servidor
- Aceptar un cliente
- Obtener los InputStream y/o OutputStream del cliente.
- Crear unos InputStream y/o OutputStream más adecuados a nuestras necesidades.
- Leer y escribir datos del y al cliente.
- Cerrar el socket.
En el servidor se crea un serversocket que tiene como parametro el numero de puerto este puede ser del 1 a 65535 del 1 a 1023 están reservados para servicios del sistema (SSH,SMTP, ftp, mail, www, telnet, etc…) Del 1024 en adelante podemos usarlos a nuestro gusto. Crear el socket servidor: El servidor crea un socket servidor que tiene como parámetro el puerto en el que a va estar escuchando las peticiones entrantes en mi caso he usado el 5555: ServerSocket skServidor = new ServerSocket(5555); Cada servidor debe usar un puerto diferente. Aceptar un cliente: Una vez creado el servidor, este espera conexiones de los cliente para eso llamamos al método accept(). Este método se queda bloqueado hasta que algún cliente se conecta. Nos devuelve un Socket, que es la conexión con dicho cliente. Socket skCliente = skServidor.accept();Un servidor puede manejar multiples conexion con cliente pero en este caso solamente manejara una.
Obtener el InputStream y/o OutputStream
Una vez que el cliente ya esta conectado, debemos obtener de él el OuputStream o InputStream con los métodosgetOutputStream() o getInputStream(). La clase OutpuStream nos sirve para enviar datos. InputStream nos sirve para leer los datos recibidos. InputStream input = skCliente.getIntputStream(); OutputStream output = skCliente.getOutputStream(); Estos metodos únicamente envían bytes. Si vamos a utilizar tipos de datos normales (enteros, String) podemos utilizar las clases DataInputStream y DataOutputStream. Estas clases tienen un constructor que admite unInputStream y un OutputStream respectivamente. DataInputStream inputdata = new DataInputStream (input); DataOuputStream outputdata = new DataOutputStream (output); Estas clases tienen sus propios metodos para escribir o leer. como writeInt(),writeFloat(), readInt(), etc. Para strings usaremos los métodos writeUTF() y readUTF(), que envían/leen las cadenas en formato UTF.
Lado Cliente: Para poder crear el socket usamos la clase ‘Socket’ ademas deberemos usar la Direccion IP del server y el puerto que empleara para la comunicacion Socket skCliente = new Socket (IP,PUERTO); IP debe ser u String y PUERTO un entero. Podemos ver todo esto en el sig. diagrama. 
Tendrá unos campos al comienzo en donde deberemos ingresar la direccion ip del server y el puerto,unos leds que cambiaran de color segun el estado de la conexion y un texto en el medio que informara cuando halla un error, luego mas abajo hay un campo en el que le podemos enviar un texto al servidor y luego de bajo cuatro botones de acción a los cuales desde el servidor podremos asignarle que cada vez que se los pulse realizar en el server una accion diferente como ejecutar un script, abrir una aplicacion etc, con esto podriamos usar nuestro movil como un control remoto para la pc. Veremos primero el codigo de la aplicacion servidor. He utilizado Eclipse para escribir el codigo en el repositorio encontraran el codigo. El proyecto del servidor se llama SimpleServer-Socket He creado una clase que se llama Mensaje_data por lo que los ‘mensajes’ que se enviaran seran de este tipo, esta clase estara presente en las 2 aplicaciones
Este tiene los siguiente atributos.
- Action :
llamare mensaje de accion al mensaje que debe tener en este atributo un valor difernte al -1 y estar comprendido entre 1 y 4. Cada valor tendra una accion especifica diferente, estos se definira mas abajo. last_msg debe ser false
- Texto:
Llamare mensaje de texto al mensaje que tenga de valor action -1 y en texto debera tener lo que se desea enviar al server. last_msg debe ser false.
- Ultimo mensaje:
Sera el mensaje que se envira para avisarle al servidor que debe cortar la conexion, se enviara al presionar desconectar. action=-1 texto=” ” last_msg=true Server.java
Algunas aclaraciones, En el metodo Exec podremos hacer varias cosas ejucar un script abrir un pdf, un HTML, recomiendo visitar los siguientes link1 , link2 para mayor comprension. En este caso al presionar el boton de accion 1 abrira VLC, en el numero 2 Chrome y en el 3 una terminal esto lo he hecho usando linux, en este punto dependera del sistema operativo que esten utilizando, si no ponemos el path del ejecutable, el directorio en el que se encuentra debe estar en la variable de entorno PATH, si no, no sabrá dónde econtrar el ejecutable. Ahora es el turno de la aplicacion para android, recomiendo leer el comentario en cada caso: Proyecto:
Al AndroidManifest.xml y al layout en layout/main no los voy a mostrar pueden verlos directamente desde el repositorio. Sockettest.java Explicare el funcionamiento paso a paso comentando en cada lineas. 
Como habran visto el funcionamiento es muy simple y no hay nada de mayor complejidad. para poder ejecutar el codigo java sin utilizar el eclipse deberan ejecutar desde su interprete de comandos segun el os que usen javac server.java y luego java server despues deberian ejecutar la app de android. Pueden ver un video sobre el funcionamiento de la aplicacion: Pueden descargar el codigo de este tutorial desde nuestro repositorio haciendo click en la imagen debajo. El proyecto de la aplicacion servidor se llama “SimpleServer-Socket” La aplicacion cliente “Socket-Client”
Con estos nuevos conocimiento se pueden hacer todo tipo de aplicaciones de diversos uso, hasta incluso si tienen conocimientos en electronica podria llegar a servirles para manipular circuitos desde su telefono o hasta quien sabe incluso manejar un robot. En proximos tutoriales incluiremos una comunicacion bidireccional por lo que implementaremos en la app de android threads para manejar estos. Respecto de sockets en Java hay mucha informacion en internet, para armar este tutorial he utilizado los siguiente recursos, recomiendo que les hechen un vistazo que son muy utiles: http://codigoprogramacion.com/java/103-sockets-en-java-con-cliente-y-servidor.html http://docs.oracle.com/javase/tutorial/networking/sockets/index.html http://casidiablo.net/java-socket-chat-basico/ http://www.chuidiang.com/java/sockets/socket.php http://mundogeek.net/archivos/2006/03/20/sockets-en-java/ http://www.helloandroid.com/tutorials/simple-connection-example-part-ii-tcp-communication http://docs.oracle.com/javase/tutorial/networking/sockets/readingWriting.html http://android-er.blogspot.com.ar/2011/01/simple-communication-using.html http://android-er.blogspot.com.ar/2011/01/implement-simple-socket-server-in.html http://adblogcat.com/ssl-sockets-android-and-server-using-a-certificate/Si alguno tiene experiencia en este tema y considera que en el tutorila hay algo incorrecto o no se entiende bien sientanse libre de usar el cuadro de comentarios de bajo al igual si tienen alguna consulta o sugerencia. Hasta el proximo tutorial! Sebastian.
¿Te gustó este tutorial? ¡Compártelo!






Pingback: Multiplayer online games for Android : Android Community - For Application Development