01 julio, 2021

Enviar un mensaje desde un cliente a un servidor en java

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.

No hay comentarios, ¡cuéntame algo!

Me gustaría saber tu opinión. ¡Saludos!