整体来说 ,mina服务端采用基于nio的单线程,轮询机制。 使用selector 获取客户端的链接,并创建sesssion,session通过process来处理io操作。
nio的典型模式如下所示:
- private NioEchoServer() throws IOException {
- Selector roller = Selector.open();
- ServerSocketChannel serverChannel = ServerSocketChannel.open(); //
- serverChannel.socket().bind(new InetSocketAddress(port));
- serverChannel.configureBlocking(false );
- serverChannel.register(roller, SelectionKey.OP_ACCEPT);
- }
- public void start() throws IOException {
- int keyAdded = 0 ;
- while ((keyAdded = roller.select()) > 0 ) {
- Set<SelectionKey> keySets = roller.selectedKeys();
- Iterator iter = keySets.iterator();
- while (iter.hasNext()) {
- SelectionKey key = (SelectionKey) iter.next();
- iter.remove();
- actionHandler(key);
- }
- }
- }
private NioEchoServer() throws IOException {
Selector roller = Selector.open();
ServerSocketChannel serverChannel = ServerSocketChannel.open(); //
serverChannel.socket().bind(new InetSocketAddress(port));
serverChannel.configureBlocking(false);
serverChannel.register(roller, SelectionKey.OP_ACCEPT);
}
public void start() throws IOException {
int keyAdded = 0;
while ((keyAdded = roller.select()) > 0) {
Set<SelectionKey> keySets = roller.selectedKeys();
Iterator iter = keySets.iterator();
while (iter.hasNext()) {
SelectionKey key = (SelectionKey) iter.next();
iter.remove();
actionHandler(key);
}
}
}
1 服务端绑定port
2 创建Selector
3 创建SeversocketChannel,面向流的侦听socket 通道。
4 监听客户端的请求,
接下来就通过mina 创建服务端socket Accpeptor 使用单线程并监处理端口和客户端请求,学习一下mina的源码
- IoAcceptor acceptor = new NioSoketAcceptor (); //根据实现的类,调用不同的构造方法
IoAcceptor acceptor = new NioSoketAcceptor (); //根据实现的类,调用不同的构造方法
上面代码, 创建一个socket Acceptor ,mina内部实现如下 :
super(new DefaultSocketSessionConfig(), NioProcessor.class); //传入具体的ioprocess 的实现类。
最终调用的类和构造方法:
- AbstractPollingIoAcceptor
- protected AbstractPollingIoAcceptor(IoSessionConfig sessionConfig, //模板模式的使用,根据子类传入IoProcessor实现类构造SimpleIoprocessorPool 池
- Class<? extends IoProcessor<T>> processorClass) {
- this (sessionConfig, null , new SimpleIoProcessorPool<T>(processorClass),