【问题标题】:Any NIO frameworks for .NET? [closed].NET 的任何 NIO 框架? [关闭]
【发布时间】:2010-10-13 11:50:46
【问题描述】:

.NET 是否有任何非阻塞 IO 框架?

我正在寻找类似于 Apache MinaJBoss Netty 为 Java 提供的东西:一个用于实现高度可扩展的服务器的框架——而不仅仅是 .NET 框架提供的低级支持。

编辑:为了更好地解释我希望看到的内容,这里有一个基本示例,说明您可以使用 Mina 做什么:

在 Mina 中,我可以像这样实现 ProtocolDecoder:

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

还有一个像这样的 CommandHandler:

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

如果我通过调用来启动服务器

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

我会得到一个非阻塞服务器。

它将运行一个(或至少几个)线程,循环遍历所有传入连接,从套接字收集数据,并调用SimpleDecoder.doDecode() 以查看它是否在连接上有完整的命令。然后它将命令传递给CommandHandler.messageReceived(),我可以接管处理。

【问题讨论】:

  • 从第一天开始,非阻塞 I/O 就成为 .NET 的一部分。您到底在寻找什么?
  • 我正在寻找 .NET 中低级调用之上的服务器框架。
  • 我对 Java 的了解还不够,不知道为什么像 MINA 这样的东西会有帮助。但是异步访问内置于 .NET 的每个级别。它在 WCF、ADO.NET、工作流中——无处不在。我查看了 MINA 页面,发现他们在该页面上所说的任何内容在 .NET 中没有任何价值。
  • 也许您可以告诉我们您需要编写的程序类型。不要假设需要像 MINA 这样的东西来做到这一点。
  • 您在寻找 ASP.NET 对异步页面的支持吗?允许异步操作完成,同时允许原始处理线程处理其他 HTTP 请求,然后在异步操作完成时提取原始请求?

标签: c# .net frameworks nio


【解决方案1】:

你可以看看SuperSocket,http://supersocket.codeplex.com/ 它可能不像 Mina 和 Netty 那样强大,但它是一种你可以轻松使用的简单框架。

【讨论】:

    【解决方案2】:

    XF.Serverthis question 说它是片状的。最后一个问题提供了有关如何在 .NET 中编写高性能网络代码的建议(使用异步套接字等)

    Google 图书上还有 C# Network Programming 的预览版,其中讨论了异步套接字调用等内容。

    这个MSDN article 也很有趣,但不会让你更接近实际的框架。

    【讨论】:

    【解决方案3】:

    您可以通过ikvm 在.Net 中直接使用Mina。

    【讨论】:

    • 使用 Mina 的人正在寻找高性能。您认为与 ikvm 一起使用的 mina 会表现良好吗?
    • 一般来说非阻塞IO不一定能提供更好的性能,但可扩展性更好。非阻塞套接字 IO 可防止每个连接都需要一个线程。在单个线程上服务多个连接可以减少多个线程的内存和上下文切换开销。由于 nio 操作受 IO 限制而不是 CPU 限制,我怀疑但没有证据表明 ivkm 引入的任何开销都可以忽略不计。
    猜你喜欢
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    相关资源
    最近更新 更多