29 mayo, 2021

Octava Evaluación Java Avanzado

Buen día, coders! El día de hoy vamos a resolver un caso propuesto que nos envió un seguidor de la página. Nos pide implementar un programa cliente-servidor usando Datagram Sockets. Para ello, vamos a ayudarnos del protocolo UDP


CASO PRÁCTICO


Implemente un programa cliente servidor usando sockets en java.

Observación:

Emplee el protocolo UDP

El Servidor UDP debe estar escuchando en un puerto determinado

Cree un cliente UDP para enviar los mensajes.

Recuerda que la conexión UDP no es orientada a conexión, es decir, el servidor en principio no sabe de dónde viene el mensaje, aunque lo puede saber mirando el datagrama que le llega. En otras palabras y comparando con la conexión TCP, UDP no necesita saber quién se conecta a él.




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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package socket;

import java.awt.BorderLayout;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

public class Servidor extends JFrame {

	private JTextArea areaPantalla;
	private DatagramSocket socket;

	// Configurar GUI y DatagramSocket
	public Servidor() {
		super("Servidor");
		areaPantalla = new JTextArea();
		getContentPane().add(new JScrollPane(areaPantalla), BorderLayout.CENTER);
		setSize(400, 300);
		setVisible(true);
		// Crear objeto DatagramSocket para enviar y recibir paquetes
		try {
			socket = new DatagramSocket(5000); // Le pasamos el puerto
		} catch (SocketException excepcionSocket) {
			// Procesar los problemas que pueden ocurrir al crear el objeto DatagramSocket
			excepcionSocket.printStackTrace();
			System.exit(1);
		}
	} // Fin del constructor

	private void esperarPaquetes() { // Esperar a que lleguen los paquetes, mostrar los datos
		while (true) { // Iterar infinitamente
			try {
				// Establecer el paquete
				byte datos[] = new byte[100];
				DatagramPacket recibirPaquete = new DatagramPacket(datos, datos.length);
				socket.receive(recibirPaquete); // esperar el paquete
				// Mostrar la información del paquete recibido
				mostrarMensaje("\nRecibido de " + recibirPaquete.getAddress() + " >> "
						+ new String(recibirPaquete.getData(), 0, recibirPaquete.getLength()));
			} catch (IOException excepcionES) {
				excepcionES.printStackTrace();
			}
		}
	}

	private void mostrarMensaje(final String mensajeAMostrar) {
		// mostrar el mensaje del subproceso de ejecución despachador de eventos
		SwingUtilities.invokeLater(new Runnable() { // Clase interna para asegurar que la GUI
													// se actualice apropiadamente
			public void run() {
				// Actualiza areaPantalla
				areaPantalla.append(mensajeAMostrar);
			}
		} // Fin de la clase interna
		); // Fin de la llamada a SwingUtilities.invokeLater
	}

	public static void main(String args[]) {
		Servidor aplicacion = new Servidor();
		aplicacion.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		aplicacion.esperarPaquetes();
	}

} // Fin de la clase Servidor

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package socket;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.swing.*;

public class Cliente extends JFrame {
	
	private JTextField campoIntroducir;
	private JTextArea areaPantalla;
	private DatagramSocket socket;

	// Configurar GUI y DatagramSocket
	public Cliente() {
		super("Cliente");
		Container contenedor = getContentPane();
		campoIntroducir = new JTextField("Escriba aquí el mensaje");
		campoIntroducir.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evento) {
				// Crear y enviar el paquete
				try {
					areaPantalla.append("\nEnviando >> " + evento.getActionCommand() + "\n");

					// Obtener mensaje del campo de texto y convertirlo en arreglo byte
					String mensaje = evento.getActionCommand();
					byte datos[] = mensaje.getBytes();

					// Crear enviarPaquete
					DatagramPacket enviarPaquete = new DatagramPacket(datos, datos.length, 
							InetAddress.getLocalHost(),
							5000);

					socket.send(enviarPaquete); // enviar paquete
					areaPantalla.append("Paquete enviado\n");
					areaPantalla.setCaretPosition(areaPantalla.getText().length());
				} catch (IOException excepcionES) {
					// Procesar los problemas que pueden ocurrir al crear o enviar el paquete
					excepcionES.printStackTrace();
				}
			} // Fin de actionPerformed
		} // Fin de la clase interna
		); // Fin de la llamada a addActionListener

		contenedor.add(campoIntroducir, BorderLayout.NORTH);
		areaPantalla = new JTextArea();
		contenedor.add(new JScrollPane(areaPantalla), BorderLayout.CENTER);
		setSize(400, 300);
		setVisible(true);
		
		// Crear objeto DatagramSocket para enviar y recibir paquetes
		try {
			socket = new DatagramSocket();
		} catch (SocketException excepcionSocket) {
			// Atrapar los problemas que pueden ocurrir al crear objeto DatagramSocket
			excepcionSocket.printStackTrace();
			System.exit(1);
		}
	} // Fin del constructor de Cliente

	public static void main(String args[]) {
		Cliente aplicacion = new Cliente();
		aplicacion.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}

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!