-
-
Save Gr3gorywolf/0d69a9f7530c7168be6bdf4857ab9ba3 to your computer and use it in GitHub Desktop.
Esta clase es la encargada de toda la comunicación cliente-servidor de parte del cliente
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
///<summary> | |
///Hecho por Merli Mejia(JAVARD) - merlimejia2@gmail.com | |
/// | |
/// Esta clase es la encargada de toda la comunicacion cliente-servidor de parte del cliente | |
/// | |
/// </summary> | |
using System; | |
using System.Collections.Generic; | |
using System.Net.Sockets; | |
using System.Text; | |
using System.Threading; | |
using System.Threading.Tasks; | |
using UnityEngine; | |
public class networking : MonoBehaviour | |
{ | |
TcpClient tcp = new TcpClient();//Intancia de cliente tcp principal | |
private int puerto = 8080;//puerto al que nos conectamos | |
private string ip = "192.168.0.5";//ip a la que nos conectamos | |
private int tiempoLimiteConexion = 5000;//tiempo limite para conectarse | |
private int memoriaParaLectura = 256;//memoria maxima de lectura | |
NetworkStream networkStream;//stream de servidor-cliente | |
Task leyendo;//nos damos cuenta cuando una lectura esta pasando, paso o no | |
Task escribiendo;//nos damos cuenta cuando una escritura esta pasando, paso o no | |
//Variables publicas************************************************************** | |
public string ADIVINADOR = "jugador-adivinador"; | |
public string APOSTADOR = "jugador-apostador"; | |
public string tipoJugador = ""; | |
public bool conectado = false; | |
public bool buscandoPartida = false; | |
public bool enPartida = false; | |
//esos bytes solo se declaran una sola vez debido a que ese tamaño es el tamaño maximo de un conjunto de paquetes que llegan | |
public Byte[] data = new Byte[1000000]; | |
//******************************************************************************** | |
//testing*************************************************** | |
public GameObject testing; | |
public string comandoEnUso = ""; | |
//********************************************************** | |
void Start() | |
{ | |
try | |
{ | |
conectar((bool resultado) => | |
{ | |
if (resultado == true) | |
{ | |
//Debug.Log("CONECTADO!"); | |
try | |
{ | |
networkStream = tcp.GetStream(); | |
} | |
catch (SocketException e) | |
{ | |
Debug.Log("ERROR: " + e); | |
} | |
Thread thread = new Thread(oirDelServidor); | |
thread.IsBackground = true; | |
thread.Start(); | |
} | |
else | |
{ | |
//Debug.Log("NO CONECTADO: ERROR DESPUES DE: " + tiempoLimiteConexion + " MS"); | |
} | |
}); | |
} | |
catch(SocketException e) | |
{ | |
Debug.Log("ERROR: " + e); | |
} | |
} | |
void Update() | |
{ | |
conectado = tcp.Connected; | |
if(conectado == true) | |
{ | |
//Debug.Log(escribiendo.IsCompleted); | |
} | |
} | |
private void OnApplicationQuit() | |
{ | |
desconectar(); | |
} | |
public void desconectar() | |
{ | |
networkStream.Close(); | |
tcp.Close(); | |
} | |
/// <summary> | |
/// Este metodo es el encargado de conectar el cliente con el servidor | |
/// </summary> | |
/// <param name="callback">Se utiliza para invocar una accion despues de que se haya conectado al servidor</param> | |
public void conectar(Action<bool> callback) | |
{ | |
try | |
{ | |
bool result = tcp.ConnectAsync(ip, puerto).Wait(tiempoLimiteConexion); | |
if (callback != null) callback(result); | |
} | |
catch(SocketException e) | |
{ | |
Debug.Log("ERROR: " + e); | |
} | |
} | |
/// <summary> | |
/// Este metodo manda un mensaje al servidor diciendo que quiere buscar una partida | |
/// </summary> | |
public void buscarPartida() | |
{ | |
buscandoPartida = true; | |
byte[] data = Encoding.ASCII.GetBytes("mm"); | |
escribiendo = networkStream.WriteAsync(data, 0, data.Length); | |
} | |
/// <summary> | |
/// Este es el loop principal o "listener" por donde entran todos los mensajes del servidor | |
/// </summary> | |
public void oirDelServidor() | |
{ | |
while (true) | |
{ | |
//data available es la forma nativa de tcp saber cuando esta recibiendo datos en un intervalo de tiempo | |
if (networkStream.DataAvailable) | |
{ | |
int tamañopaquete= networkStream.Read(data, 0, data.Length); | |
/// y aqui estaba tu error mariconsito hijo de perra | |
//en get string pueden ir 3 argumentos | |
//el primero es el buffer con todos los datos | |
//el segundo es el offset osea desde que byte empezara a leer | |
//el tercero es HASTA QUE BYTE LEERA de esta forma el solo obtendra lo que llego en ese momento | |
//y no leera el buffer completo por lo que solo te traera lo que el server envio. so sigue asi prro vas bien | |
string mensaje = Encoding.UTF8.GetString(data, 0, tamañopaquete); | |
//esta mierda es lo mas innecesario que nunca haya visto en mi life xD | |
// mensaje = serializarMsj(mensaje); | |
ejecutarComandoServidor(mensaje); | |
} | |
} | |
} | |
private string serializarMsj(string msj) | |
{ | |
List<char> cap = new List<char>(); | |
for (int i = 0; i < msj.Length; i++) | |
{ | |
if (msj[i] != '\0') | |
{ | |
//Debug.Log(mensaje[i]); | |
cap.Add(msj[i]); | |
} | |
} | |
string mensaje = new string(cap.ToArray()); | |
return mensaje; | |
} | |
/// <summary> | |
/// Este metodo ejecuta los comandos que le pases | |
/// </summary> | |
/// <param name="comando">Comando a ejecutar</param> | |
private void ejecutarComandoServidor(string comando) | |
{ | |
Debug.Log(comando); | |
comandoEnUso = comando; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment