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