sábado, 21 de septiembre de 2013

Problemas para Finalizar la Comunicación

Tenemos un problema para finalizar la comunicación entre el servidor y el cliente, para ello se hizo lo siguiente:
Se tuvo problemas con la forma de leer los datos para terminar la comunicacion para lo siguiente se cambio el while por un do-while
-Con el do while nos permite hacer el fin de la comunicacion en el cliente y en el servidor es:
string mensaje1 = "";
            //Este lazo se ejecuta mientras no llegue un mensaje de Terminar
            do
            {
                //creamos un flujo
                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 servidor
                        Invoke(new Pinto(Pintar), new object[] { x, y, true });
                        break;
                    case "False":
                        //pintamos en radar de acuerdo a la respuesta del servidor
                        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 "Ganar":
                        //Informamos que se gano la partida
                        MessageBox.Show("Ganaste", "Informe", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                        //Preguntamos si quiere seguir jugando
                        DialogResult resultado = MessageBox.Show("Quieres Jugar un Nuevo Juego", "Informacion", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                        if (resultado == DialogResult.Yes)
                            //Si selecciona si Invoacamos una funcion para juego nuevo
                            Invoke(new Nuevo(NuevoJuego));
                        else
                        {
                            //Enviamos terminar al servidor
                            Enviar("Terminar", 0, 0);
                            MessageBox.Show("La aplicacion se cerrara", "Informe", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                        break;
                    default:
                        break;
                }
            } while (mensaje1 != "Terminar");
//Cerramos el flujo
            datos.Close();
            //Cerramos el cliente
            cliente.Close();
            //Cerramos el formulario
            this.Close();
-Con el do while nos permite hacer el fin de la comunicacion el servidor, verificando si esta conectado y el mensaje recibido por el servidor
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));
Para la solución, se obtuvo la idea de: http://www.dreamincode.net/forums/topic/180149-c%23-servermulti-client/

No hay comentarios:

Publicar un comentario