Aprende Java Aprende Php Aprende C++ Aprende HTML 5 Aprende JavaScript Aprende JSON Aprende MySQL Aprende SQLServer Aprende Visual Basic 6 Aprende PostgreSQL Aprende SQLite Aprende Redis Aprende Kotlin Aprende XML Aprende Linux VSC Aprende Wordpress Aprende Laravel Aprende VueJS Aprende JQuery Aprende Bootstrap Aprende Netbeans Aprende Android
Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube Sigueme en TikTok Sigueme en Whatsapp
Home / Proyectos / Cliente/Servidor en java y c#

Cliente/Servidor en java y c#

Por 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

Artículos similares

Tutorial HeidiSQL: Sesion, Base de datos y Tablas

HeidiSQL es un software libre y de código abierto que permite conectarse a servidores MySQL, MariaDB, Percona Server, Mi[...]

Pruebas funcionales con AssertJ Swing

AssertJ Swing es una biblioteca para Java que proporciona una interfaz fluida para la realización automatizada de prueba[...]

Editar archivos PDF en linea

Editar un documento PDF no es tan sencillo como editar un archivo de texto por ejemplo, para editar archivos PDFs necesi[...]

Animación de personaje 3D

Animación basica de personaje en 3d utilizando el BIPED de 3d Studio Max[...]

Sonidos y Eventos en Swing

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 «~»

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[...]