Como parte de todo el código generado para el MMO en que he estado trabajando voy a dejar por aquí la biblioteca de comunicaciones TCP para C#. En ella se incluyen las siguientes clases para que las uséis:
ServidorTCP - Permite crear un servidor TCP para recibir información de un cliente TCP.
ClienteTCP - Permite crear un cliente TCP para enviar información a un servidor TCP.
Paquete - Abstracción de datos enviados entre el cliente y el servidor.
Requisitos:
.Net Framework 3.5
Que vuestro proyecto sea en C#
Instalación:
Los pasos serían:
1. Descargar la biblioteca de este enlace.
2. Copiar los ficheros BibliotecaTCP.dll y BibliotecaTCP.XML del fichero comprimido descargado al directorio DEBUG de vuestro proyecto. (NOTA: Si no metéis el XML os perderéis la descripción de los métodos y los parámetros que reciben)
3. Desde Visual Studio y con vuestro proyecto abierto, seleccionar arriba en "Proyecto > Agregar referencia...", y en la pestaña de Examinar seleccionáis el BibliotecaTCP.dll que habéis pegado en vuestro DEBUG.
Listo, ya podéis trabajar con él.
Detalles de uso:
Os dejo el diagrama de clases aquí, y para hacer esta parte más fácil, os paso este enlace con el proyecto para Visual Studio 2008 en el que he estado haciendo las pruebas de la librería. He tratado de ser lo más claro posible en el código y he ido comentando línea a línea, así que ahí tenéis un buen ejemplo práctico de todo el funcionamiento que permite esta biblioteca. Para probarla, en vuestro mismo ordenador podéis ejecutar dos veces la aplicación y por un lado seleccionar el servidor y por el otro el cliente para pasar información de uno al otro.
Voy a resumir un poco la información que veréis en ese proyecto, para que también quede aquí:
Paquete
Es la clase que envuelve los datos que se enviarán del cliente al servidor para hacer transparente toda la codificación de strings y enteros a bytes. Es por ello que la idea consiste en: respecto al ClienteTCP, se prepara un paquete con los datos que se quieren enviar y se le pasa al cliente; respecto al ServidorTCP, todos los datos que recibe los empaqueta para su posterior lectura. El funcionamiento es como sigue:
1. Para crear un paquete.
[code:1]Paquete aux = new Paquete();[/code]
2. Para agregar datos (pueden ser de tipo string o int positivos y negativos).
[code:1]aux.AgregarElemento(cadena);
aux.AgregarElemento(entero);[/code]
Ahora se puede pasar el paquete al ClienteTCP para su envío, tenéis el código en el apartado del ClienteTCP.
3. Para leer los datos de un paquete recibido hay que saber en que orden se agregaron las strings y enteros, por ejemplo, en el apartado anterior se agregó una cadena primero y un entero después, pues eso se leería del paquete del siguiente modo.
[code:1]string s = (string)aux.ObtenerElemento(0);
int n = (int)aux.ObtenerElemento(1);[/code]
ServidorTCP
Es la clase que se queda a la escucha por un puerto TCP para recibir información de un ClienteTCP. Algunos detalles de implementación son:
- Programado para correr en un hilo de ejecución paralelo, por lo que no bloqueará la ejecución de la aplicación en la que corra el servidor.
- Respecto al manejo de paquetes de datos, tiene una lista en la que los va guardando según van llegando, y al pedirle al servidor un paquete recibido, lo devuelve y lo borra de la lista.
- En caso de que se produzca alguna excepción inesperada (por ejemplo que el ClienteTCP no cierre la conexión correctamente), el servidor lo detectará y se relanzará pasados 5 segundos para volver a escuchar a futuros clientes.
Por lo que la idea del ServidorTCP consiste en arrancarlo y cada X tiempo (o constantemente) pedirle un paquete de la lista para obtener la información recibida. El funcionamiento es como sigue:
1. Para arrancarlo:
[code:1]ServidorTCP stcp = new ServidorTCP(11985);
stcp.Run();[/code]
2. Para recibir los paquetes tenemos tres opciones.
[code:1]Paquete aux;
List
aux = stcp.UltimoPaquete; //Devolvería el paquete más reciente
aux = stcp.PrimerPaquete; //Devolvería el paquete más antiguo
lista = stcp.TodosPaquetes; //Develve una lista con todos los paquetes[/code]
3. Para detenerlo.
[code:1]stcp.Desconectar = true;[/code]
ClienteTCP
Es la clase que se encargará de enviar los datos al ServidorTCP. Algunos detalles de implementación son:
- Programado para correr en un hilo de ejecución paralelo, por lo que no bloqueará la ejecución de la aplicación en la que corra el cliente.
- Respecto al manejo de paquetes de datos, tiene una lista en la que los va guardando, y el hilo que se ejecuta de forma paralela comprueba de forma constante si hay algo nuevo que enviar para enviarlo automáticamente.
- En caso de que se produzca alguna excepción inesperada (por ejemplo que el ServidorTCP se haya caído), el cliente lo detectará y tratará de volver a conectarse pasados 5 segundos.
Por lo que la idea del ClienteTCP consiste en arrancarlo y pasarle los paquetes que queramos enviar, que él se encargará de hacer esta operación sin necesidad de hacer más por nuestra parte. El funcionamiento es como sigue:
1. Para arrancarlo:
[code:1]ClienteTCP ctcp = new ClienteTCP("127.0.0.1", 11985);
ctcp.Run();[/code]
2. Para enviar los paquetes.
[code:1]Paquete aux;
aux.AgregarElemento("Hola mundo");
ctcp.EnviarPaquete(aux);[/code]
3. Para detenerlo.
[code:1]ctcp.Desconectar = true;[/code]
Otros:
De momento he liberado la librería en DLL, pero dentro de no mucho colgaré el código mejor explicado y en varias entregas (una por clase) en mi blog dedicado al mundillo de la programación.
No obstante, cualquier duda que os surja sobre el funcionamiento, tema que os gustaria ampliar, lo que sea, podéis dejármela en este hilo que en cuanto pueda os hago un feedback.
Un saludo y espero que os sea útil!.