Estoy trabajando en un "sistema de aplicación", donde también tengo que hacer una aplicación de servidor. Estoy trabajando en C# (.NET 4.0). El servidor recogerá principalmente datos de diferentes aplicaciones/clientes de punto de venta (que deberían ser de alrededor de 50-100, pero el servidor también debería ser capaz de atender entre 200 y 300 clientes). Desde un único cliente, un servidor probablemente recibirá alrededor de 1 KB aproximadamente 100 veces por día. El servidor principalmente necesita aceptar los datos, descifrarlos y almacenarlos en el disco. También debería verificar los cambios en el directorio específico para enviar nuevas configuraciones a los clientes, lo que no debería ser muy frecuente.Ayuda con el servidor TCP controlado por evento
Soy bastante nuevo en C# y en la programación del servidor, así que por favor tengan paciencia conmigo. Pensé en usar los métodos threadlinking y async (hay un buen ejemplo de eso en un libro "C# in un nutshell"). Pero dedico bastante tiempo a buscar la mejor solución y encontré esto. Pero el multihilo trae más problemas que beneficios en mi caso. Por lo tanto, pensé en el servidor incluso impulsado. "Un solo proceso, maneja cada evento (conexión aceptada, datos disponibles para leer, puede escribir al cliente, ...) en una devolución de llamada". de "what is event driven web server". Encuentro que la mejor solución para mi problema.
Pero no tengo idea de cómo codificarlo, no pude encontrar ningún ejemplo sobre los servidores controlados por eventos. Por lo que yo entiendo, debería hacer un hilo (+1 para GUI), luego crear un oyente TCP y de alguna manera crear eventos para que cuando el oyente TCP pueda aceptar un cliente el evento active y active el servidor, también cuando los datos para leer de los clientes estaría disponible despertaría el servidor.
Por favor, ayúdame a codificar esto, estoy totalmente perdido. Sé cómo podría hacer esto usando
while(true)
{
check if client wants to connect
accept client and add it to client list
iterate through client list and check if anyone is sending data ...
accept data and store it
...
}
Pero eso no se basa en eventos y está desperdiciando CPU. El servidor no estará muy activo, por lo que me gustaría que sea lo más eficiente posible.
Algunos ejemplos realmente ayudarían.
Gracias por su tiempo y sus respuestas.
p.s. ¿Puedo usar solo un puerto para todos los clientes?
EDIT: Para aclarar, quiero codificar un servidor de eventos, pero no sé cómo hacerlo, así que acabo de hacer un ejemplo de lo que sé (encuestas de clientes).
Ejemplo horrible. No maneja excepciones o desconexiones del extremo remoto (lectura de 0 bytes). Convierte una aceptación asíncrona para sincronizar con un evento, ¿por qué no usar simplemente 'AcceptTcpClient'. No utilice contextos mágicos para realizar operaciones asincrónicas (en su caso una matriz de objetos); – jgauffin