Hola, me gustaria que me hecharan una mano en esto, llevo 3 dias tratando con esto de los socket en c# lamentablemente google no me ha brindado mucha informacion.
Empece este emulador hace algunos dias, lo que quiero hacer es que múltiples clientes se conecten al servidor, encontré como hacerlo buscando y buscando por google.
Con este codigo, el servidor escucha al cliente, ya lo probé y el cliente que esta hecho en adobe flash, al ingresar los datos del login queda esperando a recibir una respuesta y si cierro el emulador, en el cliente aparece "Conexion interrumpida con el servidor" ¿Quieres volver a intentar conectarte al juego?.
Con un Sniffer o husmeador de trafico de red, Analice los paquetes que se envian, y son dos paquetes : "[Af][DatosDeLaCuenta]" y [Ax][NoRecuerdoDeQueEraXD] pero el que importa es el AF.
Lo que quiero lograr es que el emulador analice si se recibe el paquete AF y envie el paquete [AlEc][DarAccesoALaCuentaIngresada] y lograr pasar de la pantalla login.
Aqui les dejo el codigo que escucha al cliente, me falta el para analizar y me gustaria que me enseñaran como hacer lo que les pido, Muchas Gracias. Cualquier cosa comenten por favor.
public class GestorEntrada
{
//En estas variables esta almacenado los datos del servidor que pregunta a un archivo de texto cual es la ip y el puerto de entrada
public static string IP = Ajustes.IP_SERVIDOR;
public static int Puerto = Ajustes.RealmPort;
public static IPAddress ipAddress = Dns.GetHostEntry(IP).AddressList[0];
public static IPEndPoint localEndPoint = new IPEndPoint(ipAddress, Puerto);
public static Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
public static void EscucharCliente()
{
// Crear un TCP/IP socket.
// Enlazando el socket a el punto de encuentro y escuchar las conexiones entrantes
listener.Bind(localEndPoint);
listener.Listen(100);
ColorConsola.Info("Esperando conexiones entrantes...");
}
}
Ummm espero que esto de ayude para comenzar yo usaria un TcpListener en lugar de socket, yo usaria 2 clases una que es la que escucha en determinado puerto(Servidor.cs), y otra que procesa(Procesar.cs).
El funcionamiento seria :
1-. Servidor inicia un TcpListener en un determinado puerto y esta a la escucha de las peticiones del cliente usando el metodo "AcceptTcpClient()".
2-. Recibe la peticon del cliente y crea una instancia de la clase Procesar(new Procesar(datoscliente)) que tiene como parametro un odjecto TcpClient(el que es creado usando AcceptTcpClient()).
3-.Teniendo mi objeto "Procesar" creo un nuevo Thread(proceso) en el cual invoco a un metodo al que llamaria "process"
4.-Otra ves llamo a AcceptTcpClient().
Lo que lo hace multiusuario es que cada peticon se procesa en un Thread diferente eso es todo aqui un ejemplo:
Servidor.cs(Escrito directamente aqui en la ventana de posteo no se si compile pero te dara una idea)
public class Servidor
{
private int puerto = 8069; //El puerto en el que corre
TcpListener listener;
public void listen()
{
listener = new TcpListener(IPAndress.Any,puerto);
listener.Start();
//Comiensa el ciclo repetitivo para aceptar peticiones
while(true)
{
TcpClient s = listener.AcceptTcpClient();//En este punto el programa esta detenido esperando al cliente
Procesar p = new Procesar(s);//Aqui ya recibi una peticion
Thread t = new Thread(new ThreadStart(p.process)); // aqui la proceso en un nuevo Thread
t.Start();//Listo es todo nuevamente regresa a s = listener.AcceptTcpClient(); y se repite el proceso
}
}
}
Aqui el codigo de la clase Procesar.cs
public class Procesar()
{
TcpClient c;
Stream input;//para leer los datos del cliente
StreamWriter output;//para escribir la respuesta
public Procesar(TcpClient socket)
{
this.c= socket;
}
public void process()
{
input = new BufferedStream(c.GetStream());
output = new StreamWriter(new BufferedStream(c.GetStream()));
//Aqui el codigo para procesar input
//la respuesta la enviamos escribiendo en output usando Write o WriteLine
output.Flush();//invocamos al metodo Flush del output
c.close();//cerramos el TcpClient
}
}
Bueno esa es la extructura basica con la que yo trabajaria aunque e visto otras formas pero que no me convecieron mucho.
Por ultimo usamos nuestra clase servidor en nuestro metodo principal con
Servidor myServer=new Servidor()
myServer.Start();