sábado, 21 de septiembre de 2013

¿Cómo realizamos el envío de datos de Cliente-Servidor?

El envío y la recepción de datos se la realizó mediante la lectura y escritura de flujos binarios. Ya que de esta manera no nos preocupamos de como se empaqueten los datos.

Lo único que debemos preocuparnos es de que tal como se envían los datos se deben recibir en este mismo orden, ya que es un flujo binario de datos.

Para ello se ocupó las funciones Comunicaciones y Enviar.

En el servidor:

 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));
        }
        //Esta funcion permite comprobar si el disparo golpeo un barco
        public bool Disparo(int x, int y)
        {
            //creamos un tipo punto
            Point p = new Point(picPosicion.Location.X + (x * 30), picPosicion.Location.Y + (y * 30));
            //hacemos un foreach para buscar entre los barcos
            foreach (Barco barco in barcos)
            {
                //Cargamos la propiedad Puntos, para hacer la comprobacion
                Point[] valor = barco.Puntos;
                //hacemos un foreach dentro del arreglo anteriormente obtenido
                foreach (Point p2 in valor)
                {
                    //Comprobamos si los puntos son iguales
                    if (p2 == p)
                    {
                        //Esto comprobamos que no sea en el mismo punto el golpe
                        int i = 0;
                        foreach (Point punto in barco.PuntosGolpe)
                        {
                            if (punto == p)
                            {
                                i++;
                            }
                        }
                        //Si no se ha dado anteriormente un golpe se disminuye los puntos de vida
                        if (i == 0)
                        {
                            MessageBox.Show("Te Golpearon", "Peligro", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                            barco.PuntosVida--;
                            barco.PuntosGolpe.Add(p);
                        }
                        return true;
                    }
                }
            }
            return false;
        }
        //Esta funcion nos permite enviar mensajes al servidor
        public void Enviar(string mensaje, int x, int y)
        {
            //Creamos un binaryWriter para enviar datos
            BinaryWriter datos = new BinaryWriter(new BufferedStream(cliente.GetStream()));
            //Enviamos los datos de acuerdo al siguiente orden
            datos.Write(mensaje);
            datos.Write(x);
            datos.Write(y);
            datos.Flush();
        }

En el cliente:

 //Esta funcion nos permite enviar mensajes al servidor
        public void Enviar(string mensaje, int x, int y)
        {
            //Creamos un binaryWriter para enviar datos
            BinaryWriter datos = new BinaryWriter(new BufferedStream(cliente.GetStream()));
            //Enviamos los datos de acuerdo al siguiente orden
            datos.Write(mensaje);
            datos.Write(x);
            datos.Write(y);
            datos.Flush();

        }

No hay comentarios:

Publicar un comentario