Sockets en Java

En Java las comunicaciones se basan en sockets con los que trabajamos a través de flujos de datos como si de E/S de archivos se tratara. Los sockets se clasifican en sockets de flujo o sockets de datagramas dependiendo de si el servicio utiliza TCP (orientado a conexión y fiable) o UDP.

En el modelo de sockets de flujo contamos con un objeto de 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.

El servidor crea un socket servidor que tiene como parámetro el puerto en el que a va estar escuchando las peticiones entrantes:
ServerSocket servicio = new ServerSocket(9999);

accept se mantiene a la espera de conexiones entrantes, bloqueando la ejecución. Cuando se establece una conexión se devuelve una instancia de Socket con la que llevar a cabo la comunicación.
Socket socketServicio = servicio.accept();

Los clientes crean objetos Socket para comunicarse con el servidor, por ejemplo localhost en el puerto 9999:
Socket cliente = new Socket("localhost", 9999);

Una vez iniciada la conexión, podemos usar getOutputStream y getInputStream para obtener los flujos de salida y entrada de datos de los sockets.
PrintWriter salida = new PrintWriter(socketServicio.getOutputStream(), true);
BufferedReader entrada = new BufferedReader(new InputStreamReader(cliente.getInputStream()));

Y utilizar los métodos de los flujos de datos para enviar o recibir información del otro lado de la conexión:
salida.println("Soy el servidor");
System.out.println("Recibido " + entrada.readLine());

Por último, una vez terminada la ejecución, tenemos que cerrar los flujos de datos y el socket (en ese orden):
salida.close();
socketServicio.close();

entrada.close();
cliente.close();

Un ejemplo típico para enseñar estos conceptos en la práctica es un servidor eco, cuyo código podéis descargar a continuación. Para probarlo podeis utilizar telnet para conectaros al puerto 9999 en localhost (telnet localhost 9999) y por cada cadena de texto enviada al servidor, este nos responderá con el mismo texto. Utiliza el comando ‘bye’ para terminar la conexión.

Descarga ServidorEco.java

Comentarios
  1. Jorge

    Muy util (para mi)

    Responder

  2. para empezar a saber de ke se trata está bien…

    Responder

  3. Muy bueno amigo, espero que pongas otro ejemplo en el futuro pero si no, no importa, la verdad es que este esta perfecto para entender la base de los sockets. Thanks!!

    Responder

  4. abel

    Lo revisare con calma espero me sirva, tnk´s

    Responder

  5. […] información sobre sockets en Java, Google me redirigió a una web llamada MundoGeek donde hablaban de los citados sockets y, además, tenía publicidad AdSense de […]

    Responder

  6. NarakuSM

    Chevre pero me gustaria ver ejemplos de protocolos UDP

    Responder

  7. Javier Simbrón

    Fundamentos básicos de sockets

    Responder

  8. Lesly

    Bien (y) a mi me sirvio bastante

    Responder

  9. FMAT

    Muy bueno me sirve demasiado felicidades a los que suben cosas interesantes

    Responder

  10. Enrique

    Muy bueno para entender sockets, buen trabajo (Y), me ayudo mucho para una aplicacion.

    Responder

  11. lola

    no entiendo nada

    Responder

  12. Excelente

    Responder

  13. helder

    espero que me sirva porque ya no quiero seguir buscando

    Responder

  14. Joselo Obernal

    Excelente informacion (y), me gustaría que subieras mas ejemplos.
    Felicitaciones!!!!

    Responder

  15. alx

    excelente informacion

    Responder

  16. Alye

    WAAAAOOOOO es una informacion superHiper guuaauuu …espapirifacticamente fabulosa hay osea me super encanto!!!valen mil graxias….
    PD:me siento mega realizada el dia de hoy es un super honor entrar a tu pagina bye…
    ! ! ! ! ! B Y E ! ! ! ! !
    osea 🙂

    Responder

  17. Anónimo

    Con este código:

    ServerSocket servicio = new ServerSocket(9999);
    Socket socketServicio = servicio.accept();
    Socket cliente = new Socket(“xx.xx.xx.xx”, 9999);
    PrintWriter salida = new PrintWriter(socketServicio.getOutputStream(), true);
    BufferedReader entrada = new BufferedReader(new InputStreamReader(cliente.getInputStream()));
    salida.println(“Soy el servidor”);
    System.out.println(“Recibido ” + entrada.readLine());
    salida.close();
    socketServicio.close();
    entrada.close();
    cliente.close();

    Como puedo hacer un telnet y ejecutar el siguiente comando: df -h > diskfree.txt

    Muchas Gracias.

    Saludos.

    Responder

  18. Jose Guerra

    En la empresa que trabajo se usan sockets para la comunicación con el AS/400, pero esto es algo lento, ¿existe algo que se pueda hacer para mejorar el performance?

    Responder

  19. lalo

    Quisiera saber como seria posible lo siguiente:

    Cuando quiero conectarme a una maquina a otra en la misma red desde una ejecuto: inicio-ejecutar-\\nombre_maquina despues me sale la ventanita para identificarme con mi usuario y password.

    quiero saber si sabe alguna forma de un socket en Java que me pida el usuario y password y que se conecte

    de antemano muchas gracias

    Responder

  20. Santino

    Kien sabe como se implementa con sockets una pagina web

    Responder

  21. anonimo

    muy importante este tema

    Responder

  22. Perfecto!!!!!!!! Me encantó!

    Responder

  23. aa

    buena explicacion

    Responder

  24. Juan

    Hola, Genial la info.!

    Responder

  25. Francisco

    Hola, me está corriendo la clase, pero solamente me dice:

    Escuchando en el puerto 9999: ServerSocket[addr=0.0.0.0,localport=9999]

    pero de ahí en adelante no hace nada…

    falta algo mas?

    Responder

  26. hola, disculpa realice pruebas ejecutando la aplicacion en maquinas diferente y no realiza ninguna conexion entre ambas, m podes dar una mano, nose si es un problema de activar algun servicio en window 7? Saludos

    Responder

    • esteban

      deves poner la direccion ip de cada una de las maquinas que vas a conectar.

      Responder

Deja un comentario