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