Calculadora simple a través de UDP en Java

La creación de redes es una comunicación bidireccional entre un host y un servidor, en lugar de un intercambio de información. Cualquier servidor está configurado para responder a consultas específicas solicitadas por un cliente. Hay muchos tipos diferentes de servidores en función de la utilidad que proporcionan a los usuarios. Algunos ejemplos incluyen servidor de archivos, servidor de aplicaciones, servidor de dominio, etc.
Tomemos un ejemplo para demostrar cómo se maneja una solicitud de cualquier cliente en el modelo de comunicación cliente-servidor. Supongamos que hay una empresa X que tiene cientos de empleados, cada uno trabajando en su propio sistema y la mayoría de ellos usa la impresora para imprimir algún informe o factura, etc. Instalar impresoras en todos los sistemas no es una solución muy económica al problema de proporcionar servicios de impresión. instalaciones a los usuarios. Una alternativa a esto es configurar un servidor de impresión e instalar una impresora en ese sistema. Cuando un empleado quiere imprimir algo, puede enviar una solicitud al servidor para reservarle la impresora. Al recibir la solicitud, el servidor hace que la Programación del lado del cliente tome una decisión en función de muchos factores, como la disponibilidad de la impresora, la tasa de requests entrantes, etc. y, por último, responder a la solicitud informando al cliente sobre el estado de la impresora. Un aspecto fundamental de cualquier servidor es que debe ser específico, no genérico. No debe generar una respuesta similar a cada solicitud, sino responder en función de la naturaleza de la solicitud, el cliente al que responde, etc.

Este artículo es la implementación de una calculadora-servidor simple vía UDP donde el cliente enviará la ecuación matemática al servidor y el servidor responderá con la respuesta a la ecuación.

Analicemos primero la programación del lado del cliente seguida de la programación del lado del servidor. Comenzando con la programación del lado del cliente de la siguiente manera: 

A. Programación del lado del cliente

Para enviar o recibir a través de Internet, es necesario conocer la dirección del socket de la entidad que escucha, es decir, la dirección IP y el número de puerto del oyente. En general, el cliente conoce o el servidor transmite la dirección del socket que está escuchando. Entonces, en el lado del cliente, hay muy pocos cambios en la parte del código. 
En lugar de invocar solo una llamada de envío(), el cliente también invoca una llamada de recepción(). Resto todos los pasos siguen siendo los mismos. 

Los pasos involucrados son los siguientes:

  1. Creación de DatagramSocket: Primero, se crea un objeto datagramSocket para llevar el paquete al destino y recibirlo cada vez que el servidor envía datos.
  2. Creación de DatagramPacket: En este paso se crea el paquete para enviar/recibir datos a través de un datagramSocket. 
    Nota: hay una diferencia en los constructores para crear un paquete de datagramas para enviar y recibir los datos.
  3. Invoque una llamada de envío() en el objeto de socket: Esto enviaría nuestra solicitud con la ecuación al servidor para su procesamiento.
  4. Invoke a receive() call on socket object: Esto se usa para recibir los datos enviados por el servidor después de procesar nuestra solicitud. Esto congelaría nuestro programa hasta que el servidor responda o arroje un error si lleva demasiado tiempo.

Ejemplo 1 

Java

// Java Program to illustrate Client Side implementation
// of Simple Calculator using UDP
  
// Importing required classes
import java.io.IOException;
// Importing classes fromjava.nio package as
// this package is responsible for networking
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
  
// Main class
// Calc_Client_UDP
public class GFG {
  
    // Main driver method
    public static void main(String args[])
        throws IOException
    {
  
        // Creating an object of Scanner class to read user
        // input
        Scanner sc = new Scanner(System.in);
  
        // Step 1
        // Create the socket object for carrying data
        DatagramSocket ds = new DatagramSocket();
  
        InetAddress ip = InetAddress.getLocalHost();
        byte buf[] = null;
  
        // loop while user not enters "bye"
        while (true) {
  
            System.out.print(
                "Enter the equation in the format:");
            System.out.println(
                "'operand1 operator operand2'");
  
            // Awaiting from entered input
            String inp = sc.nextLine();
            buf = new byte[65535];
  
            // Converting the String input into the byte
            // array
            buf = inp.getBytes();
  
            // Step 2
            // Creating the datagramPacket for sending the
            // data.
            DatagramPacket DpSend = new DatagramPacket(
                buf, buf.length, ip, 1234);
  
            // Invoking the send call to actually send the
            // data.
            ds.send(DpSend);
  
            // Break the loop if user enters "bye"
            // using the break keyword
            if (inp.equals("bye"))
                break;
  
            buf = new byte[65535];
  
            // Creating an object of DatagramPacket class
            DatagramPacket DpReceive
                = new DatagramPacket(buf, buf.length);
  
            ds.receive(DpReceive);
  
            // Print and display command
            System.out.println(
                "Answer = "
                + new String(buf, 0, buf.length));
        }
    }
}

Producción: 

Enter the equation in the form: 'operand operator operand'
5 * 6
Answer=30
Enter the equation in the form: 'operand operator operand'
5 + 6
Answer=11
Enter the equation in the form: 'operand operator operand'
9 / 3
Answer=3

B. Programación del lado del servidor

Como se requiere la dirección del socket para comunicarse a través de Internet, el servidor debe conocer la dirección a través de la cual el cliente envía la solicitud. Veamos paso a paso cómo el servidor maneja el problema del número de puerto y responde a las consultas del cliente. 

Los pasos involucrados en el lado del cliente son los siguientes: 

  1. Establezca una conexión de enchufe .
  2. Procese las ecuaciones que provienen del cliente: en el lado del servidor también abrimos el flujo de entrada y el flujo de salida. Después de recibir la ecuación, la procesamos y guardamos el resultado para enviarlo de vuelta al cliente.
  3. Crear un paquete para enviar el resultado: este paso crea un problema para el servidor ya que no conoce el número de puerto del cliente. Para obtener el puerto, usamos el siguiente método de la clase DatagramPacket. 
    puerto int público()

Sintaxis: 

public int getPort()
Returns the port number to which the specified datagram packet is being sent to or
from which the packet is received.

Nota: Por último, recuerde cerrar la conexión para evitar cualquier problema de fuga de memoria.

Ejemplo

Java

// Java Program Illustrating Server Side Implementation
// of Simple Calculator using UDP
  
// Importing required classes
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.StringTokenizer;
  
// Main class
// Calc_Server_UDP
class GFG {
  
    // MAin driver method
    public static void main(String[] args)
        throws IOException
    {
  
        // Creating a socket to listen at port 1234
        DatagramSocket ds = new DatagramSocket(1234);
  
        byte[] buf = null;
  
        // Initializing them initially with null
        DatagramPacket DpReceive = null;
        DatagramPacket DpSend = null;
  
        while (true) {
            buf = new byte[65535];
  
            // Creating a DatagramPacket to receive the data.
            DpReceive = new DatagramPacket(buf, buf.length);
  
            // Receiving the data in byte buffer.
            ds.receive(DpReceive);
  
            String inp = new String(buf, 0, buf.length);
  
            // Using trim() method to
            // remove extra spaces.
            inp = inp.trim();
  
            System.out.println("Equation Received:- "
                               + inp);
  
            // Exit the server if the client sends "bye"
            if (inp.equals("bye")) {
                System.out.println(
                    "Client sent bye.....EXITING");
  
                // Exit from program here itself without
                // checking further
                break;
            }
  
            int result;
  
            // Use StringTokenizer to break the
            // equation into operand and operation
            StringTokenizer st = new StringTokenizer(inp);
  
            int oprnd1 = Integer.parseInt(st.nextToken());
            String operation = st.nextToken();
            int oprnd2 = Integer.parseInt(st.nextToken());
  
            // Perform the required operation
            if (operation.equals("+"))
                result = oprnd1 + oprnd2;
  
            else if (operation.equals("-"))
                result = oprnd1 - oprnd2;
  
            else if (operation.equals("*"))
                result = oprnd1 * oprnd2;
  
            else
                result = oprnd1 / oprnd2;
  
            System.out.println("Sending the result...");
            String res = Integer.toString(result);
  
            // Clearing the buffer after every message
            buf = res.getBytes();
  
            // Getting the port of client
            int port = DpReceive.getPort();
  
            DpSend = new DatagramPacket(
                buf, buf.length, InetAddress.getLocalHost(),
                port);
            ds.send(DpSend);
        }
    }
}

Producción: 

Equation received:-5 * 6
Sending the result...
Equation received:-5 + 6
Sending the result...
Equation received:-9 / 3
Sending the result...

Nota: Para probar los programas anteriores en el sistema, asegúrese de ejecutar primero el programa del servidor y luego el del cliente. Asegúrese de estar en la consola del cliente y desde allí ingrese la ecuación en el formato «operando1 operador operando2» y presione Entrar. La respuesta a la ecuación solicitada se mostrará solo en la consola del cliente. Finalmente, para finalizar la comunicación, escriba «adiós» (sin comillas) y presione enter.
 

Este artículo es una contribución de Rishabh Mahrsee . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *