sábado, 16 de marzo de 2013

Java.net: Socket y ServerSocket

Buenas amigos, en este nuevo tema vamos a ver uno de los puntos fuertes de la programación en general, conexiones de red entre aplicaciones. Para ello vamos a ver los métodos de las clases Socket y ServerSocket y como utilizarlos para crear una aplicación chat entre Servidor y Cliente.

Un socket es un puente de unión entre 2 programas a través de la red. Un servidor y un Cliente. Es decir, es el que se encarga de enviar y recibir la información.

La construcción de un socket se realiza de la siguiente manera (veremos varios constructores):
    • Socket s=new Socket(): Crea un Socket por defecto y no conectado.
    • Socket s=new Socket(InetAdrees direccion, int puerto): Crea y conecta un Socket a la IP especificada y el puerto especificado.
    • Socket s=new Socket(String host, int puerto); Crea y conecta un Socket al host y al puerto especificados.
Bueno, estos 3 son los más utilizados, podéis mirar en la API para más info.

Los métodos más usados por esta clase son:
    • void close(): Método que cierra el Socket.
      • s.close();
    • InetAddres getInetAddress(): método que retorna la IP a la cual esta conectado el socket.
      • s.getInetAddress();
    • InputStream getInputStream(): Método que nos devuelve un flujo de datos de entrada para el socket.
      • s.getInputStream();
    • OutputStream getOutputStream(): Método que devuelve un flujo de datos de salida para el socket.
      • s.getoutputStream();
    • int getPort(): Método que devuelve el puerto remoto al que esta conectado el socket.
      • s.getPort();
    • boolean isClosed(): Método que devuelve true si el socket está cerrado y false si no lo está.
      • s.isClosed();
    • boolean isConnected(): Método que devuelve true si el socket está conectado y false si no lo está.
      • s.isConnected();
    • void shutdownInput(): Método que cierra el flujo de entrada del socket.
      • s.shutdownInput();
    • void shutdownoutput(): Método que cierra el flujo de salida del socket.
      • s.shutdownOutput();
    • boolean isInputShutdown(): Método que devuelve true si el flujo de entrada está cerrado y false si no lo está.
      • s.isinputShutdown();
    • boolean isOutputShutdown(): Método que devuelve true si el flujo de salida está cerrado y false si no lo está.
      • s.isOutputShutdown():
Bien, estos son unos pocos del total, pero son e los más utilizados. Si ninguno de estos se amolda a vuestras exigencias, podéis mirar en la API.


La clase ServerSocket es, digamos, como un complemento de la clase socket, esta se encarga de estar a la escucha para aceptar las conexiones entrantes.

Se construye de la siguiente manera:

    • ServerSocket ss=new ServerSocket(): Constructor que crea un ServerSocket sin estar unido a nada.
    • ServerSocket ss=new ServerSocket(int puerto): Constructor que crea un ServerSocket a la escucha del puerto indicado.
Los métodos que utiliza son los mismos que puede llegar a utilizar Socket a excepción de unos pocos, entre ellos el siguiente:
  • Socket accept(): Método que acepta las conexiones entrantes en el servidor montado por ServerSocket.
    • Socket s=ss.accept();
Teniendo estas 2 clases, el funcionamiento genérico sería:
  1. Tenemos un programa de escucha en un servidor y otro en un cliente.
  2. El servidor tiene un ServerSocket asociado a un socket con un puerto de escucha y está a la espera de una conexión.
  3. El cliente posee un socket con el "host" del equipo al que quiere mandar un proceso y el número de puerto al que está asociado dicho equipo.
  4. El servidor acepta la conexión entrante del cliente y realizan el intercambio de información.
  5. Una vez se termina el intercambio de información se cierran todos los canales y ServerSocket vuelve a quedar a la escucha de posibles conexiones.
Bien, como no quiero que me quede muy extenso el post, voy a realizar un chat de ejemplo explicando paso a paso todo lo explicado aquí para que pueda ser comprendido mejor. Puede ir al chat de ejemplo aquí.

Un saludo.

2 comentarios:

  1. Como haría para crear un servidor que me permita enviar instancias de objetos a los distintos clientes? Necesito hacer un juego donde la información seleccionada por un cliente debe reflejarse en la pantalla de los demás.

    ResponderEliminar