Como habíamos mencionado en un anterior post Ejemplo socket java Cliente/Servidor , el lenguaje de programación entre el Cliente y el Servidor no tienen porque ser el mismo. Y para dejar ejemplificado este punto, en esta ocasión, trabajaremos con dos de las tecnologías más usadas en la actualidad como son Java y C# de .NET
Nuestro sistema Cliente/Servidor consistirá en la resolución de expresiones matemáticas, es decir; el cliente enviara una petición de la forma:
Cliente> 1+1
y el servidor resolverá esa expresión, si es que puede resolverla y retornara el resultado al cliente
Servidor> 1+1 = 2
Sin más vamos al proyecto.
Necesitamos
Nivel: Intermedio
Tiempo: 30 minutos
EL SERVIDOR
El servidor estará programado en C#
Paso 1. El Proyecto
Crea un proyecto de consola con nombre «ServidorNET» como se ve en la imagen siguiente
Paso 2. Codigo
Reemplaza el contenido del archivo Program.cs por el siguiente:
using System; using System.Data; using System.Net; using System.Net.Sockets; namespace ServidorNET { class Program { static void Main(string[] args) { //puerto int PORT = 5000; //IP Localhost IPAddress ipAddress = Dns.GetHostEntry("localhost").AddressList[1];//127.0.0.1 Console.WriteLine("Server> " + ipAddress); Console.WriteLine("Server> running"); while (true) { //para la comunicacion de red //Inicializa una nueva instancia con la familia de direcciones, tipo de socket y protocolo de la clase. Socket socket = new Socket(AddressFamily.InterNetwork,//Dirección para IP versión 4 SocketType.Stream, //Admite secuencias de bytes bidireccionales, usa el protocolo TCP ProtocolType.Tcp);//Protocolo de Control de Transmisión. //Contiene información de puerto local o remoto y host que necesita una aplicación //para conectarse a un servicio en un host. La clase IPEndPoint forma un punto de conexión a un servicio IPEndPoint myAdress = new IPEndPoint(ipAddress, PORT); try { socket.Bind(myAdress);//Asocia un Socket con un extremo local socket.Listen(1);//colocal el socket en estado de escucha. 1: numero de conexiones entrantes Console.WriteLine("Server> listening..."); //Crea un nuevo Socket para una conexión recién creada. Socket socketClient = socket.Accept(); //tamaño del búfer byte[] bytes = new byte[256]; //recibe datos y devuelve el número de bytes leídos correctamente int count = socketClient.Receive(bytes); //decodifica bytes a nueva cadena string string data = System.Text.Encoding.ASCII.GetString(bytes, 0, count); //muestra en pantalla Console.WriteLine("Server> received: {0}", data); //se evalua expresion matematica String result = Evaluate(data); Console.WriteLine("Server> {0} = {1} ", data, result); //retorna resultado al cliente byte[] toClient = System.Text.Encoding.ASCII.GetBytes(result); socketClient.Send(toClient);//Envía datos al cliente socketClient.Shutdown(SocketShutdown.Both); //Deshabilita los envíos y recepciones en un Socket socket.Close();//Cierra el Socket conexión y libera todos los asociados los recursos. } catch (Exception ex) { Console.WriteLine("Server> {0}", ex.ToString()); Console.WriteLine("Press any ket to finish"); Console.ReadLine(); Environment.Exit(0); } }//end while } /// <summary> /// Metodo para evaluar una expresion matematica /// <param name="expression">expresion matematica de la forma Ej.: (2+3)-4</param> /// <returns>String : Resultado de la expresión matematica</returns> /// </summary> public static String Evaluate(string expression) { try { DataTable table = new DataTable(); table.Columns.Add("expression", typeof(string), expression); DataRow row = table.NewRow(); table.Rows.Add(row); return (string)row["expression"]; } catch (EvaluateException ex) { Console.WriteLine("Server> {0}", ex.ToString()); } return "No se puede evaluar expresion"; } } }
El código se encuentra comentado linea a linea, pero es necesario aclarar algunos puntos:
Tenemos la siguiente linea de código para obtener la IP del servidor local «localhost» la cual es «127.0.0.1»
IPAddress ipAddress = Dns.GetHostEntry("localhost").AddressList[1];//127.0.0.1
El contenido del array es:
Esta variable «ipAddress» lo usamos para la conexión en:
IPEndPoint myAdress = new IPEndPoint(ipAddress, PORT);
pero también podríamos usar:
IPEndPoint myAdress = new IPEndPoint(IPAddress.Any, PORT);
Lo que hace IPAddress.Any es proporcionar una dirección IP que indica el servidor que debe escuchar la actividad del cliente en todas las interfaces de red.
EL CLIENTE
El Cliente estara programado en Java
Paso 1. El Proyecto
Crea un nuevo proyecto en Netbeans que se llamara «ClienteJava» el cual contara con una sola clase llamada MainCliente.
Paso 2. El Código
El cliente con código más corto que el servidor, es el siguiente:
package cliente; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket; /** * @see https://www.jc-mouse.net/ * @author mouse */ public class MainCliente { private final static int PORT = 5000; private final static String SERVER = "localhost"; /** * @param args the command line arguments */ public static void main(String[] args) { // Socket clientSocket;//Socket para la comunicacion cliente servidor try{ System.out.println("Client> started"); while( true ){//ciclo repetitivo //abre socket clientSocket = new Socket(SERVER,PORT); //Para leer lo que escriba el usuario BufferedReader brRequest = new BufferedReader(new InputStreamReader(System.in)); //para imprimir datos del servidor PrintStream toServer = new PrintStream(clientSocket.getOutputStream()); //Para leer lo que envie el servidor InputStream stream = clientSocket.getInputStream(); //mensaje para el cliente System.out.println("Client> Introduzca expresión matematica "); //captura comando escrito por el usuario String request = brRequest.readLine(); //manda al servidor toServer.println(request); //lee respuesta del servidor byte[] bytes = new byte[256]; stream.read(bytes,0,256); //convierte a string String received = new String(bytes,"UTF-8"); //imprime en pantalla System.out.println("Server> " + request + " = " + received.trim()); } }catch(IOException | NumberFormatException ex){ System.out.println(ex.getMessage()); } } }
Si no tenemos ningún error, ejecutamos el servidor primero y después el cliente, y ya podremos probar el sistema.
En el siguiente vídeo puedes ver el sistema en acción
enjoy!!!!
HeidiSQL es un software libre y de código abierto que permite conectarse a servidores MySQL, MariaDB, Percona Server, Mi[...]
AssertJ Swing es una biblioteca para Java que proporciona una interfaz fluida para la realización automatizada de prueba[...]
Editar un documento PDF no es tan sencillo como editar un archivo de texto por ejemplo, para editar archivos PDFs necesi[...]
Animación basica de personaje en 3d utilizando el BIPED de 3d Studio Max[...]
La siguiente clase reproduce sonidos WAV en controles Swing de Java Netbeans, los controles son pasados en el constructo[...]
Operador de Complemento bit a bit unario Entre los operadores a nivel de bits de uso más común en java tenemos al operad[...]