Empleando sockets, elabore una aplicación que permita enviar un mensaje desde un cliente a un servidor.
Antes de ver la solución, recordemos algunos conceptos.
¿Qué es un socket?
Un Socket es una conexión entre dos host. Bajo esta conexión, se pueden
ejecutar las siguientes operaciones básicas:
• Conectarse a una máquina remota.
• Enviar datos.
• Recibir datos.
• Cerrar una conexión.
• Escuchar datos entrantes.
• Aceptar conexiones de máquinas remotas.
La clase java Socket, la cual es usada tanto por aplicaciones cliente como
aplicaciones servidor, tiene métodos que permiten implementar las cuatros
primeras operaciones; las restantes, son exclusivas de aplicaciones
servidor. Las aplicaciones servidor siempre esperan por aplicaciones
cliente que se conecten a ellas y son implementadas por la clase
ServerSocket.
Los programas java utilizan normalmente sockets cliente de la
siguiente manera:
1. El programa crea un nuevo socket utilizando el constructor Socket().
2. El socket intenta conectarse a un host remoto.
3. Una vez establecida la conexión, las máquinas local y remota obtienen
flujos de entrada y salida desde el socket y usan estos flujos para
intercambiar información.
4. Cuando la transmisión de datos ha sido completada, una de las dos
partes, o ambas, cierran la conexión.
La clase ServerSocket contiene todo lo necesario para poder escribir
un servidor en Java. Por ejemplo:
- Tiene constructores que crean objetos ServerSocket.
- Métodos que escuchan por conexiones en un puerto específico.
- Métodos que retornan un objeto Socket (cliente) cuando una conexión
es realizada, de modo que se puedan enviar y recibir datos.
El ciclo de vida de un servidor básico es el siguiente:
1. Un nuevo ServerSocket es creado utilizando un puerto específico.
2. El ServerSocket escucha por intentos de conexión entrantes usando
su método accept( ).
3 .accept( ) bloquea hasta que un cliente intenta hacer una conexión,
en ese caso se retorna un objeto Socket conectándose el cliente y el
servidor.
4. Dependiendo del tipo de servidor se invocan los métodos
getInputStream y getOutputStream.
5. El servidor y el cliente interactúan de acuerdo a un protocolo
preestablecido hasta que se debe cerrar la conexión.
6. El servidor, el cliente, o ambos cierran la conexión.
7. El servidor retorna al paso 2 y espera por la siguiente conexión.
Solución:
Servidor
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | package problema01; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class ServidorMensaje { // Constructor que recibe como parámetros: el puerto y el estado del servidor. public ServidorMensaje(int puerto, boolean estaEncendido) { try { // 1. Crea un ServerSocket utilizando un puerto específico. ServerSocket ss = new ServerSocket(puerto); System.out.println("Servidor encendido..."); // 2. Mientras está encendido, se invoca al método accept() el cual // espera recibir una conexión por parte de un cliente. while (estaEncendido) { // 3. accept( ) se bloquea hasta que un cliente intenta hacer una // conexión, en ese caso se retorna un objeto Socket // conectándose el cliente y el servidor. Socket cliente = ss.accept(); System.out.println("Puerto remoto : " + cliente.getPort()); System.out.println("Dirección Inet : " + cliente.getInetAddress()); // 4. Dependiendo del tipo de servidor se invocan a los métodos // getInputStream y getOutputStream BufferedReader entrada = new BufferedReader(new InputStreamReader (cliente.getInputStream())); // Lee lo que viene del cliente. // 5. El servidor y el cliente interactúan de acuerdo a un protocolo // preestablecido hasta que se debe cerrar la conexión. PrintWriter salida = new PrintWriter(cliente.getOutputStream(), true); salida.println(entrada.readLine()); // Le responde al cliente. // 6 El servidor, el cliente, o ambos cierran la conexión. entrada.close(); salida.close(); cliente.close(); } // 7. El servidor retorna al paso 2 y espera por la siguiente conexión. } catch (Exception e) { // Si se produce una excepción de de algún tipo. // Imprime la clase y un mensaje. System.err.println(e.getClass() + " - " + e.getMessage()); // Se apaga el servidor. estaEncendido = false; } } // Método principal que ejecuta la aplicación ServidorMensaje. public static void main(String[] args) { new ServidorMensaje(1098, true); } } |
Cliente
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | package problema01; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class ClienteMensaje { // Constructor que recibe como parámetro el puerto, el // nombre del servidor y un mensaje. public ClienteMensaje(int puerto, String host, String mensaje) { Socket cliente = null; System.out.println("Se está enviando un mensaje..."); try { // 1. Crear un socket de cliente especificando el nombre del // servidor y el puerto de comunicación. cliente = new Socket(host, puerto); // 2. Envia un mensaje al servidor. PrintWriter pw = new PrintWriter(cliente.getOutputStream(), true); pw.println(mensaje); // 3. Lee lo que el servidor le responde. BufferedReader br = new BufferedReader(new InputStreamReader(cliente.getInputStream())); System.out.println("El servidor me respondió: " + br.readLine()); System.out.println("¡El mensaje fue enviado!"); // 4. Cierra la conexión. br.close(); pw.close(); cliente.close(); } catch (Exception e) { // No existe un servidor en este puerto. System.err.println(e.getMessage()); } } // Método principal que ejecuta la aplicación ClienteMensaje. public static void main(String[] args) { new ClienteMensaje(1098, "localhost", "hola"); } } |
DESARROLLO TUS ALGORITMOS 🔥🔥
✅ 1. Envía tu algoritmo.
✅ 2. Indica en qué lenguaje de Programación lo deseas.
✅ 3. Para qué fecha lo quieres.
✅ 4. De que país eres (para tu forma de pago)
✅ 5. También se desarrollan al momento.
✅ 6. Los 3 primeros ejercicios son gratis.
🔸 Explico cada ejercicio que desarrollo en el código.
Cuenta Dcoder para más ejercicios de programación
Blog para novedades de programación
Tienda online para más recursos de programación
No hay comentarios, ¡cuéntame algo!
Me gustaría saber tu opinión. ¡Saludos!