sábado, 14 de septiembre de 2013

Elección del tipo de conexión para nuestra aplicación. ¿TCP ó UDP?

Un gran problema que tuvimos que enfrentarlo fue lo de la conexión de nuestra aplicación si usábamos conexión TCP ó UDP.

Con UDP tuvimos un gran inconveniente que al momento de enviar los datos la aplicación no recibía de la mejor manera los datos y no los procesaba como queríamos.

Por este motivo decidimos hacer la conexión mediante TCP mediante el TCPClient y con la utilización de hilos para la escucha de clientes que pueden acceder a nuestra aplicación.

Para esto estamos leyendo de un archivo de configuración el puerto y a la vez estamos escuchando que IP se pude conectar con la aplicación. Con la elección de la conexión TCP obtuvimos que nuestros datos se envíen como deseábamos.

A continuación la parte importante de nuestras comunicaciones y lo explicado anteriormente mediante código.

public void Comunicaciones()
        {
            //string Ip = ConfigurationManager.AppSettings["ip"].ToString();
            //Obtenemos el numero de puerto del archivo de configuracion
            string puerto = ConfigurationManager.AppSettings["puerto"].ToString();
            //Inicializamos el TcpListener
            escuchar = new TcpListener(IPAddress.Any, Convert.ToInt32(puerto));
            //Comenzamos a escuchar por conexiones
            escuchar.Start();
            //Aceptamos una una conexion
            cliente = escuchar.AcceptTcpClient();
            //Comprobamos que este conectado
            if (cliente.Connected)
            {
                MessageBox.Show("Cliente conectado", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                //Invocamos una funcion para desbloquear el boton generar
                Invoke(new Desbloquea(DesbloquearControles));
            }
            //creamos un string para recibir el tipo de informacion
            string mensaje1 = "";
            //Hacemos un lazo do while, el cual se ejecutara hasta que no llegue terminar y el cliente este conectado
            do
            {
                //Creamos un network stream
                datos = cliente.GetStream();
                //Leemos los datos enviados de acuerdo al orden con lo que enviamos los datos
                BinaryReader datosRx = new BinaryReader(datos);
                mensaje1 = datosRx.ReadString();
                int x = datosRx.ReadInt32();
                int y = datosRx.ReadInt32();
                //Observams que tipo de mensaje recibimos
                switch (mensaje1)
                {
                    case "True":
                        //pintamos en radar de acuerdo a la respuesta del cliente
                        Invoke(new Pinto(Pintar), new object[] { x, y, true });
                        break;
                    case "False":
                        //pintamos en radar de acuerdo a la respuesta del cliente
                        Invoke(new Pinto(Pintar), new object[] { x, y, false });
                        break;
                    case "punto":
                        //Enviamos si nos llego un golpe o no
                        Enviar(Disparo(x, y).ToString(), x, y);
                        //verificamos la vida
                        Invoke(new Vida(VerificarVida));
                        //Cambiamos el estado de la variable turno
                        Invoke(new Desbloquea(Desbloquear));
                        break;
                    case "Jugar":
                        //Recibimo el mensaje para el comienzo de la batalla
                        MessageBox.Show("Listo Para Comenzar La Batalla", "Pregunta", MessageBoxButtons.OK, MessageBoxIcon.Question);
                        //Invocamos a la funcion bloquear
                        Invoke(new Bloqueo(Bloquear));
                        break;
                    case "Ganar":
                        //Recibimos el mensaje de que ganamos desde el cliente
                        MessageBox.Show("Ganaste", "Informe", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                        break;
                    case "Nuevo":
                        //Recibimos el mensaje de juego nuevo
                        MessageBox.Show("Juego Nuevo", "Informe", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                        //Invocamos a la funcionde juego nuevo
                        Invoke(new Nuevo(NuevoJuego));
                        break;
                    default:
                        break;
                }
            } while (mensaje1 != "Terminar" && cliente.Connected);
            //Enviamos el mensaje terminar al cliente  
            Enviar("Terminar", 0, 0);
            //Cerramos el flujo
            datos.Close();
            //Cerramo el cliente
            cliente.Close();
            //Dejamos de escuchar
            escuchar.Stop();
            MessageBox.Show("Ya no se jugara: La aplicacion se cerrara", "Informe", MessageBoxButtons.OK, MessageBoxIcon.Information);
            //Invocamos a la funcion cerrar
            Invoke(new Terminar(Cerrar));
        }





No hay comentarios:

Publicar un comentario