2009-03-15 13 views
22

Esistono framework IO non bloccanti per .NET?Qualsiasi framework NIO per .NET?

Sto cercando qualcosa di simile a ciò che Apache Mina e JBoss Netty fornisce per Java: un framework per l'implementazione di server altamente scalabili - non solo il supporto di basso livello fornito dal framework .NET.

EDIT: per spiegare meglio quello che mi piacerebbe vedere, ecco un esempio di base di ciò che si può fare con Mina:

In Mina posso realizzare un ProtocolDecoder come questo:

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); 
    } 
} 

E un CommandHandler come questo:

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. 
    } 
} 

se inizio il server chiamando

0.123.
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(); 

Otterrò un server non bloccante.

Eseguirà un singolo (o almeno alcuni thread), scorrendo tra tutte le connessioni in entrata, raccogliendo i dati dalle prese e chiamando SimpleDecoder.doDecode() per verificare se ha un comando completo sulla connessione. Quindi passerà il comando a CommandHandler.messageReceived() e io posso rilevare l'elaborazione.

+0

Ecco un framework NIO ben progettato per Java: http://www.jboss.org/netty. Sto cercando un equivalente per .Net (e suppongo che anche i Rasmus lo facciano). Non è solo IO asincrono, ma una struttura in primo piano che semplifica notevolmente lo sviluppo. – jgauffin

+1

L'I/O non bloccante fa parte di .NET dal giorno 1. Che cosa stai cercando esattamente? –

+0

Sto cercando un framework server in cima alle chiamate di basso livello in .NET. –

risposta

0

È possibile utilizzare Mina direttamente in .Net tramite ikvm.

+0

Le persone che utilizzano Mina cercano prestazioni elevate. Pensi che mina usata con ikvm funzionerà bene? – bokan

+4

Generalmente l'IO non bloccante non offre necessariamente migliori prestazioni, ma una migliore scalabilità. Il socket IO non bloccante impedisce la necessità di un thread per connessione. La manutenzione di molte connessioni su un singolo thread riduce la memoria e il sovraccarico dell'interruttore di contesto di più thread. Poiché le operazioni di nio sono legate all'IO e non alla CPU, sospetto, ma non ho prove, che qualsiasi sovraccarico introdotto da ivkm è trascurabile. –

3

C'è il XF.Server, che dice che this question è instabile. Quest'ultima domanda offre consigli su come scrivere codice di rete ad alte prestazioni in .NET (utilizzare socket asincroni, ecc.)

C'è anche un'anteprima di C# Network Programming su Google Libri che tratta, tra le altre cose, di chiamate socket asincrone.

Questo MSDN article è anche interessante, ma non ti avvicina a un quadro reale.

+0

Grazie per le tue informazioni, in particolare il link: http://stackoverflow.com/questions/319732/tips-techniques-for-high-performance-c-server-sockets – Dodd

4

Puoi dare un'occhiata a SuperSocket, http://supersocket.codeplex.com/ Potrebbe non essere forte come Mina e Netty, ma è una specie di semplice framework che puoi usare facilmente.