2009-03-15 18 views
22

¿Hay marcos IO no bloqueantes para .NET?¿Todos los marcos de NIO para .NET?

Estoy buscando algo similar a lo que Apache Mina y JBoss Netty proporciona para Java: un marco para implementar servidores altamente escalables, no solo el bajo nivel de soporte que proporciona .NET framework.

EDIT: para explicar mejor lo que me gustaría ver, aquí es un ejemplo básico de lo que puede hacer con Mina:

En Mina puedo implementar un ProtocolDecoder así:

public class SimpleDecoder extends CumulativeProtocolDecoder { 
    protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception { 
    if (in.remaining() < 4) 
     return false; 
    int length = in.getInt(); 
    if(in.remaining() < 4 + length) 
     return false; 
    Command command = new Command(in.asInputStream()); 
    out.write(command); 
    } 
} 

Y un CommandHandler así:

public abstract class CommandHandler extends IoHandlerAdapter{ 
    public void messageReceived(IoSession session, Object message) throws IOException, CloneNotSupportedException { 
    Command command = (Command) message; 
    // Handle command. Probably by putting it in a workqueue. 
    } 
} 

si comienzo el servidor llamando

CommandHandler handler = new CommandHandler(); 
NioSocketAcceptor acceptor = new NioSocketAcceptor(); 
acceptor.getFilterChain().addLast("protocol", new ProtocolCodecFilter(new SimpleDecoder(false))); 
acceptor.setLocalAddress(new InetSocketAddress(port)); 
acceptor.setHandler(handler); 
acceptor.bind(); 

Voy a obtener un servidor sin bloqueo.

Ejecutará un único hilo (o al menos unos pocos), recorrerá todas las conexiones entrantes, recopilará datos de los sockets y llamará al SimpleDecoder.doDecode() para ver si tiene un comando completo en la conexión. Luego, pasará el comando al CommandHandler.messageReceived() y yo puedo encargarme del procesamiento.

+0

Aquí hay un marco NIO bien diseñado para Java: http://www.jboss.org/netty. Estoy buscando un equivalente para .Net (y supongo que Rasmus también). No es solo un IO asíncrono sino un framework en la parte superior que simplifica enormemente el desarrollo. – jgauffin

+1

La E/S sin bloqueo ha sido parte de .NET desde el día 1. ¿Qué está buscando exactamente? –

+0

Estoy buscando un servidor-framework además de las llamadas de bajo nivel en .NET. –

Respuesta

0

Puede usar Mina directamente en .Net a través del ikvm.

+0

Las personas que usan Mina están buscando un alto rendimiento. ¿Crees que mina utilizada con ikvm tendrá un buen rendimiento? – bokan

+4

Generalmente, IO no bloqueante no proporciona necesariamente un mejor rendimiento, sino una mejor escalabilidad. El IO de socket no bloqueante evita la necesidad de un hilo por conexión. El mantenimiento de muchas conexiones en un único subproceso reduce la memoria y la sobrecarga del cambio de contexto de varios subprocesos. Como las operaciones nio están vinculadas a IO y no a CPU, sospecho, pero no tengo evidencia, que cualquier sobrecarga introducida por ivkm es insignificante. –

3

Está el XF.Server, que this question dice es escamoso. Esta última pregunta ofrece consejos sobre cómo escribir código de red de alto rendimiento en .NET (use conectores asincrónicos, etc.)

También hay una vista previa de C# Network Programming en Google Books que trata, entre otras cosas, llamadas de socket asíncronas.

Este MSDN article también es interesante, pero no te acerca a un marco real.

+0

Gracias por su información, especialmente el enlace: http://stackoverflow.com/questions/319732/tips-techniques-for-high-performance-c-server-sockets – Dodd

4

Puedes echar un vistazo a SuperSocket, http://supersocket.codeplex.com/ Puede que no sea tan fuerte como Mina y Netty, pero es un armazón simple que puedes usar fácilmente.