Friday, April 29, 2011

Any NIO frameworks for .NET?

Are there any non-blocking IO frameworks for .NET?

I am looking for something similar to what Apache Mina and JBoss Netty provides for Java: a framework for implementing highly scalable servers - not just the low-level support that the .NET framework provides.

EDIT: To better explain what I would like to see, here is a basic example of what you can do with Mina:

In Mina I can implement a ProtocolDecoder like this:

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

And a CommandHandler like this:

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

If I start the server by calling

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

I will get a non-blocking server.

It will run a single (or at least just a few) threads, cycling through all incoming connections, gathering data from the sockets, and call SimpleDecoder.doDecode() to see if it has a complete command on the connection. Then it will pass the command to CommandHandler.messageReceived(), and I can take over the processing.

From stackoverflow
  • Non-blocking I/O has been part of .NET since day 1. What are you looking for,exactly?

    Rasmus Faber : I am looking for a server-framework on top of the low-level calls in .NET.
    John Saunders : I don't know enough about Java to know why something like MINA would be helpful. But async access is built into every level of .NET. It's in WCF, ADO.NET, Workflow - everywhere. I looked at the MINA page and see no value in .NET for anything they said on that page.
    John Saunders : Maybe you could give us some idea of the kind of program you need to write. Don't assume that something like MINA is required to do that.
  • I'd take a look at the Windows Communication Foundation. It has many options that allow usage patterns similar to your samples.

  • Are you looking for ASP.NET's support for asynchronous pages? Allowing an async-operation to complete while allowing the original processing thread to process other HTTP requests and then picking up the original request when the async-operation completes?

  • You can use Mina directly in .Net via ikvm.

  • You can take a look at SuperSocket, http://supersocket.codeplex.com/ It may not be strong like Mina and Netty, but it is kind of simple framework you can use easily.

0 comments:

Post a Comment