Существуют ли какие-либо неблокирующие структуры ввода-вывода для .NET?
Я ищу что-то похожее на то, что Apache Mina и JBoss Netty обеспечивает Java: инфраструктуру для реализации масштабируемых серверов - не только поддержку низкого уровня, предоставляемую платформой .NET.
РЕДАКТИРОВАТЬ: Чтобы лучше объяснить, что я хотел бы видеть, вот основной пример того, что вы можете сделать с Миной:
В 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()
, и я могу взять на себя обработку.