2009-03-15 7 views
22

Czy istnieją nie blokujące struktury IO dla .NET?Dowolne środowiska NIO dla .NET?

Szukam czegoś podobnego do tego, co Apache Mina i JBoss Netty zapewnia Javę: platformę do implementacji wysoce skalowalnych serwerów - nie tylko wsparcie niskiego poziomu obsługiwane przez platformę .NET.

EDIT: Aby lepiej wyjaśnić, co chciałbym zobaczyć, tutaj jest podstawowym przykładem tego, co można zrobić z Mina:

w Mina mogę wdrożyć ProtocolDecoder takiego:

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

I CommandHandler tak:

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

Gdybym uruchomić serwer wywołując

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

Otrzymam serwer nieblokujący.

Uruchamia pojedyncze (lub przynajmniej kilka) wątków, przechodzi przez wszystkie połączenia przychodzące, zbiera dane z gniazd i wywołuje SimpleDecoder.doDecode(), aby sprawdzić, czy ma pełne polecenie połączenia. Następnie przekaże komendę do CommandHandler.messageReceived() i mogę przejąć przetwarzanie.

+0

Oto dobrze zaprojektowane środowisko NIO dla Javy: http://www.jboss.org/netty. Szukam odpowiednika dla .Net (i przypuszczam, że Rasmus też). To nie tylko asynchroniczne IO, ale także framework, który znacznie upraszcza programowanie. – jgauffin

+1

Non-blocking I/O jest częścią .NET od 1. dnia. Czego dokładnie szukasz? –

+0

Poszukuję ram serwerowych na szczycie wywołań niskiego poziomu w .NET. –

Odpowiedz

0

Możesz użyć Mina bezpośrednio w .Net przez ikvm.

+0

Ludzie używający Mina szukają wysokiej wydajności. Czy myślisz, że mina używana z ikvm będzie dobrze działać? – bokan

+4

Ogólnie nie blokujące IO niekoniecznie dają lepszą wydajność, ale lepszą skalowalność. Nie blokujące gniazdo IO zapobiega potrzebie wątku na połączenie. Obsługa wielu połączeń w jednym wątku zmniejsza obciążenie pamięci i kontekstu na wiele wątków. Ponieważ operacje nio są powiązane z IO, a nie z procesorem, podejrzewam, ale nie mam dowodów, że jakiekolwiek obciążenie wprowadzone przez ivkm jest znikome. –

3

Istnieje XF.Server, który mówi, że this question jest niestabilny. To ostatnie pytanie zawiera porady dotyczące pisania wysokowydajnego kodu sieciowego w .NET (użyj gniazd asynchronicznych itp.).

Istnieje również podgląd C# Network Programming w Książkach Google, który omawia, między innymi, asynchroniczne wywołania gniazd.

Ta MSDN article jest również interesująca, ale nie zbliża cię do rzeczywistej struktury.

+0

Dziękujemy za informacje, zwłaszcza link: http://stackoverflow.com/questions/319732/tips-techniques-for-high-performance-c-server-sockets – Dodd

4

Możesz spojrzeć na SuperSocket, http://supersocket.codeplex.com/ Może nie być mocna, jak Mina i Netty, ale jest to prosta struktura, z której możesz łatwo korzystać.

Powiązane problemy