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:
- 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.
- 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. - 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.
- 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:
- Establezca una conexión de enchufe .
- 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.
- 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