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