2009-03-15 30 views
22

Có bất kỳ khung công tác IO không chặn nào cho .NET không?Bất kỳ khung công tác NIO nào cho .NET?

Tôi đang tìm một cái gì đó tương tự như những gì Apache MinaJBoss Netty cung cấp cho Java: một khuôn khổ để triển khai các máy chủ có khả năng mở rộng cao - không chỉ hỗ trợ cấp thấp mà khung công tác .NET cung cấp.

EDIT: Để giải thích rõ hơn những gì tôi muốn thấy, đây là một ví dụ cơ bản về những gì bạn có thể làm với Mina:

Trong Mina tôi có thể thực hiện một ProtocolDecoder như thế này:

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

Và một CommandHandler như thế này:

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

Nếu tôi khởi động server bằng cách gọi

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

Tôi sẽ nhận được một máy chủ không chặn.

Nó sẽ chạy một chuỗi (hoặc ít nhất một vài), đạp xe qua tất cả các kết nối đến, thu thập dữ liệu từ ổ cắm và gọi SimpleDecoder.doDecode() để xem nó có lệnh hoàn chỉnh trên kết nối không. Sau đó, nó sẽ chuyển lệnh đến CommandHandler.messageReceived() và tôi có thể tiếp quản quá trình xử lý.

+0

Đây là khung công tác NIO được thiết kế tốt cho Java: http://www.jboss.org/netty. Tôi đang tìm kiếm một tương đương cho. Net (và tôi cho rằng Rasmus cũng vậy). Nó không chỉ là IO không đồng bộ mà là một khuôn khổ trên cùng mà đơn giản hoá việc phát triển rất nhiều. – jgauffin

+1

Không chặn I/O đã là một phần của .NET kể từ ngày 1. Bạn đang tìm kiếm cái gì, chính xác? –

+0

Tôi đang tìm một khung máy chủ trên đầu các cuộc gọi cấp thấp trong .NET. –

Trả lời

0

Bạn có thể sử dụng Mina trực tiếp trong .Net qua ikvm.

+0

Những người sử dụng Mina đang tìm kiếm hiệu suất cao. Bạn có nghĩ mina được sử dụng với ikvm sẽ hoạt động tốt không? – bokan

+4

Nói chung không chặn IO không nhất thiết phải có hiệu suất tốt hơn, nhưng khả năng mở rộng tốt hơn. Ổ cắm không chặn IO ngăn chặn sự cần thiết cho một sợi cho mỗi kết nối. Phục vụ nhiều kết nối trên một luồng đơn giúp giảm chi phí bộ nhớ và bối cảnh của nhiều luồng. Kể từ khi hoạt động nio được IO ràng buộc và không CPU bị ràng buộc, tôi nghi ngờ, nhưng không có bằng chứng, rằng bất kỳ chi phí giới thiệu bởi ivkm là không đáng kể. –

3

XF.Server, trong đó this question nói là không ổn định. Câu hỏi cuối cùng này cung cấp lời khuyên về cách viết mã mạng có hiệu suất cao trong .NET (sử dụng ổ cắm async, v.v.)

Ngoài ra còn có bản xem trước C# Network Programming trên Google Sách, trong số những thứ khác, cuộc gọi socket không đồng bộ.

Điều này MSDN article cũng thú vị, nhưng giúp bạn không gần gũi hơn với khung thực tế.

+0

Cảm ơn thông tin của bạn, đặc biệt là liên kết: http://stackoverflow.com/questions/319732/tips-techniques-for-high-performance-c-server-sockets – Dodd

4

Bạn có thể xem SuperSocket, http://supersocket.codeplex.com/ Nó có thể không mạnh như Mina và Netty, nhưng nó là loại khung đơn giản mà bạn có thể sử dụng dễ dàng.

Các vấn đề liên quan