Blog
Los sockets en Java o cualquier otro lenguaje de programación sirven para interconectar dos sistemas a través de la red, sólo utilizando un número ip o nombre de host y un puerto determinado. La arquitectura utilizada en los sockets es la de Cliente/Servidor.
Con el uso de sockets en Java se pueden desarrollar muchos sistemas, como por ejemplos chats, videos juegos online y multijugador o incluso una simple página web.
En este artículo vamos a entender cómo utilizar sockets en Java con un ejemplo sencillo donde un cliente se conecta a un servidor para enviarle un mensaje y recibir una respuesta.
Ejemplo Cliente/Servidor usando sockets en Java
A continuación el código fuente realizado en Java del cliente donde se conecta con el servidor y le envía un mensaje:
package com.programacionextrema; import java.io.*; import java.net.*; public class Cliente { private static String HOST = "localhost"; private static int PUERTO = 2017; public static void main(String args[]) { Socket socket; DataOutputStream mensaje; try { //Creamos nuestro socket socket = new Socket(HOST, PUERTO); mensaje = new DataOutputStream(socket.getOutputStream()); //Enviamos un mensaje mensaje.writeUTF("Hola soy un cliente!!"); //Cerramos la conexión socket.close(); } catch (UnknownHostException e) { System.out.println("El host no existe o no está activo."); } catch (IOException e) { System.out.println("Error de entrada/salida."); } } }
Ahora el código del servidor:
package com.programacionextrema; import java.io.*; import java.net.*; public class Servidor { private static int PUERTO = 2017; public static void main(String args[]) { BufferedReader entrada; DataOutputStream salida; Socket socket; ServerSocket serverSocket; try { serverSocket = new ServerSocket(PUERTO); System.out.println("Esperando una conexión..."); socket = serverSocket.accept(); System.out.println("Un cliente se ha conectado..."); // Para los canales de entrada y salida de datos entrada = new BufferedReader(new InputStreamReader( socket.getInputStream())); salida = new DataOutputStream(socket.getOutputStream()); System.out.println("Confirmando conexion al cliente...."); salida.writeUTF("Conexión exitosa..."); // Para recibir el mensaje String mensajeRecibido = entrada.readLine(); System.out.println(mensajeRecibido); salida.writeUTF("Se recibio tu mensaje."); salida.writeUTF("Gracias por conectarte."); System.out.println("Cerrando conexión..."); // Cerrando la conexón serverSocket.close(); } catch (IOException e) { System.out.println("Error de entrada/salida." + e.getMessage()); } } }
Es importante a la hora de probar estos dos códigos, empezar ejecutando el servidor y luego el cliente ya que si se ejecuta el cliente en primer lugar fallará la conexión porque no podrá conectarse al servidor.
Bueno, esto es todo lo que se tiene que saber a la hora de usar sockets en Java, les recomiendo leer también el artículo que habla de hilos o thread en java ya que con estos dos conceptos se pueden realizar muchas cosas interesantes, como por ejemplo un chat.
En la clase servidor tienes
salida = new DataOutputStream(socket.getOutputStream());
salida.writeUTF(“Conexión exitosa…”);
salida.writeUTF(“Se recibio tu mensaje.”);
salida.writeUTF(“Gracias por conectarte.”);
Eso para que lo haces? son datos que puedo acceder desde la clase cliente?
o para que es exactamente?
Saludos y gracias.
Hola Angel, gracias por tu comentario, esas líneas de código sirven para notificarle al cliente el resultado de las peticiones que hace. Básicamente son respuestas. Cualquier cosa avisame.
Hola, gracias por responder. De que manera podría recoger esa respuesta en la clase cliente?
Saludos y gracias.
Hola, Ya lo tengo. muchas gracias.
Hola Angel, me alegra que hayas encontrado la solución. Saludos.
Hola amigo, quiero hacer un juego multijugador, crees que pueda hacerlo con socket? no se mucho sobre esto :v
Hola Emiliano, si queres hacer un juego simple podes empezar a utilizar socket, incluso para entender como funciona a bajo nivel, pero para hacer un juego un poco más avanzado vas a necesitar de algún framework que te de más herramientas, caso contrario se te va a complicar bastante.
Cómo lograste recibir la respuesta del servidor?
Exactamente como lo expliqué en el post, acordarte de primero tener levantado el servidor y despues ejecutar el cliente, si tenes alguna duda en particular avisame. Saludos.
Hola, gracias por la información.
Tengo una duda, lo que pasa es que esto solo funciona para la misma red, ¿Cómo hago para que funcione desde dos lugares lejanos que no estén en la misma red ?
Hola Jorge, dentro de una misma red podes utilizar las IP privadas de la misma computadoras, para conectarte a redes externas simplemente tenes que usar las IP públicas de la red. Ahora si te queres conectar a una PC interna desde otra red seguramente vas a tener que especificar un puerto para que se haga el ruteo a esa máquina específica.
Hola, tengo duda, lo ejecuto pero no me muestra nada.
Hola Christian, acordate que primero hay que ejecutar el servidor y no pararlo, para luego levantar el cliente. Un saludo.
Hola tengo una duda, cuando ejecuto ambos códigos, primero el servidor y después el cliente como dijiste me imprime esto, y no se como solucionarlo porque creo que eso no debería pasar.
Esperando una conexión…
Un cliente se ha conectado…
Confirmando conexion al cliente….
Error de entrada/salida.Software caused connection abort: recv failed
Hola Francisco, pueden ser muchos los causantes de ese problema, pero el que tiene más posibilidades de ser es el bloqueo del puerto ¿estas seguro que el puerto que estas usando se encuentra abierto? Fijate eso ya que en muchos casos puede estar bloqueado por un firewall.
Hola,
Como lo implementarias para varios clientes ? Esto solo vale para un cliente ¿ verdad ?
Saludos