martes, 6 de septiembre de 2011

Conexión Cliente - Servidor con Sockets en JAVA

Ya sabiamos que JAVA es un lenguaje poderoso y sobre todo muy fácil a la hora de implementar ciertas librerias como es el caso, pasare a explicar como es que yo realizo conexiones de tipo cliente-servidor por ejemplo para un chat, transferencias, etc. Lo primero es hacer dos clases separadas, la que jugará el rol de Cliente y la que lo hará como Servidor. Definamos primero
la clase servidor en conjunto con unos streams para comunicar datos (texto) entre las clases.


//Importar librerias, lo cual debe hacerse independientemente no como esta aqui
import java.net.*;
import java.io.*;

//se define la clase
public class Servidor {
     //objeto fundamental que abrira el puerto
     private ServerSocket servsock;

     //socket el cual aceptara conexiones
     private Socket sock;

     //stream para enviar datos, ojo solo enviar!
     private ObjectOutputStream oos;

     //instanciar componentes en el constructor
     public Servidor() {
          //le pasamos como aprametro el numero de puerto que usaremos, verificar que este libre
          servsock = new ServerSocket(8033);

          //le decimos que acepte conexiones, por el puerto definido
          sock = servsock.accept();

          //configuramos el stream listo para enviar
          oos = new ObjectOutputStream(sock.getOutputStream());
     }
}

Básicamente esos son los componentes del Servidor, el stream no es necesario es solo por si deseamos una comunicacion entre el cliente y nuestro servidor, y en este caso soolo basta un oos.writeObject(Object) para mandar datos por el stream. Cabe destacar que el metodo accept() de alguna manera detiene la ejecución del programa y se reanuda hasta que un cliente se conecte al servidor, por esto si vamos a hacer otras cosas en el server (que lo mas seguro es que si) es mejor implementar ese código en un hilo y que corra aparte de nuestro programa. Por otro lado la clase cliente es más sencilla, veamos:


//importamos las librerias
import java.net.Socket;
import java.io.ObjectInputStream;

public class Cliente {
     //socket por el cual comunicarse
     private Socket sock;

     //Stream para recibir datos, en este caso solo recibe el cliente
     private ObjectInputStream ois;

     //En el constructor instanciamos los componentes
     public Cliente() {

          //este socket no acepta conexion sino que se conectará a la IP que se le pase como primer parámetro
          //y el puerto va como segundo parametro, la IP es la del servidor bien puede ser "localhost"
          sock = new Socket("154.43.34.123", 8033)
          //enlazamos el stream por el que vienen datos
          ois = new ObjectInputStream(socket.getInputStream());
     }
}

De esta manera en un hilo puede estarse verificando cuando llegue algo por el stream con un "ois.readObject()" y sobre el socket pues en este caso no acepta conexión si no que se va a conectar, se le pasa la IP en una string o si es local será "localhost" y despues el numero de puerto en el que el servidor esta a la escucha. Asi de fácil, así de sencillo, obviamente esos codigos no hacen nada por si solos pero esa es la idea, y de alli podemos implementarlo en un chat por ejemplo.

PD: Siempre que trabajemos con streams es necesario escribir el código en un try/catch por que en caso de error llegan a lanzar excepciones.

No hay comentarios:

Publicar un comentario

Deja un comentario! =)