Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Proyectos / Cliente/Servidor en java y c#

Cliente/Servidor en java y c#

Autor jc mouse miércoles, agosto 31, 2016

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

  • IDE Netbeans 8.x
  • Visual Studio 2015
  • Conocimientos de lenguaje Java y C#

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

server tcp

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:

  • AddressList[0]  ::1 Dirección IPv6 para localhost
  • AddressList[1]   127.0.0.1  Dirección IPv4 para el localhost

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.

java net

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.

servidor net c sharp

java cliente socket

En el siguiente vídeo puedes ver el sistema en acción

enjoy!!!!

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.

Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye

Enjoy! :)

También Te Podría Interesar

Procedimientos almacenados en MySQL con Megan Fox

Procedimientos almacenados en MySQL con Megan Fox

Los procedimientos almacenados en MySQL son similares a los procedimientos de otros lenguajes de programación en el sent...

Añadir Splash Screen en Java/Netbeans

Añadir Splash Screen en Java/Netbeans

¿Splash Screen? El splash screen o traducido al aspañol 😉  es una “Pantalla de bienvenida” que se muestra cu...

Encriptación simétrica en java

Encriptación simétrica en java

En este post veremos un ejemplo sencillo de encriptación/desencriptación simétrica que el API de Java nos permite realiz...

Reconocimiento Óptico de Caracteres con Tess4J

Reconocimiento Óptico de Caracteres con Tess4J

El reconocimiento óptico de caracteres o OCR (Optical Character Recognition), es un proceso dirigido a la digitalización...

Reporte Padrón electoral con imágenes y Data Matrix

Reporte Padrón electoral con imágenes y Data Matrix

En este post diseñaremos un reporte de un padrón electoral con dos columnas que contendrá los certificados de sufragio e...

Resolución de pantalla con LibGDX

Resolución de pantalla con LibGDX

En este tutorial, veremos un poco más de lo que son las texturas en libGDX y dos maneras de añadirlas a nuestros juegos,...

Comparte lo que sabes

Categorias

Últimas entradas

MyBatis es un framework de persistencia Java que se encarga de mapear sentencias SQL y procedimientos almacenados a part...

Webcam Capture es un API  que permite usar una cámara web incorporada o externa directamente desde código Java utilizand...

im4java es una interfaz pura de Java para la línea de comandos de ImageMagick. La interfaz de la línea de comandos de IM...

En un post anterior conocimos una herramienta Open Source con un conjunto de herramientas para el trabajo con imágenes e...

Herramientas

Generador de Enlaces a Whatsapp