这是下载mina的网址
http://mina.apache.org/downloads.html
下载了Binaries和sources之后,建一个工程,就可以跑例子了
先从Start那个例子开始吧。
首先是一个server类,MinaTimeServer,
定义 一个Port
private static final int PORT = 9123;
然后在main函数中,
开启一个非阻塞的接受,即服务器
IoAcceptor acceptor = new NioSocketAcceptor();
添加filter,这个是log的,没什么好说的
acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );
这个可以好好说说。filterchain就是一个filter的链,这个是codec的,
也就是说解码用的,TextLineCodeFactory是其中的一个,即每一行来编解码。
acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));
下面是set一个handler,也就是怎么解决client传入的数据
acceptor.setHandler( new TimeServerHandler() );
这个就≈io里面的buffer
acceptor.getSessionConfig().setReadBufferSize( 2048 );
设置idle,其中10应该是10秒
acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );
最后绑定上,ok了
acceptor.bind( new InetSocketAddress(PORT) );
TimeServerHandler类extends了IoHandlerAdapter,其中IoHandlerAdapter只有几个空实现。再F3到IoHandler接口,有挺多的方法。通过名字也挺好辨认的:
sessionCreated,建立session;
sessionOpened,打开session;
sessionClosed,关闭session;
sessionIdle,session闲置;
exceptionCaught,捕捉异常;
messageReceived,接受信息;
messageSent,发送消息。
其中最常用的几个也就算是
@Override public void exceptionCaught( IoSession session, Throwable cause ) throws Exception { cause.printStackTrace(); }
@Override public void messageReceived( IoSession session, Object message ) throws Exception { System.out.println(message.getClass()); String str = message.toString(); if( str.trim().equalsIgnoreCase("quit") ) { // "Quit" ? let's get out ... session.close(true); return; } // Send the current date back to the client Date date = new Date(); session.write( date.toString() ); System.out.println("Message written..."); }
@Override public void sessionIdle( IoSession session, IdleStatus status ) throws Exception { System.out.println( "IDLE " + session.getIdleCount( status )); }
这三个了。
messageReceived方法中的两个参数,IoSession session就是session了,Object message就是client发来的信息,如果用
System.out.println(message.getClass());
会发现时String型的,这是因为用到了codec的原因。否则返回的将会是一个IoBuffer。
后面的session.write();就是返回给用户的值
至于后来的sessionIdle,就是设置在session闲置的时候要做的事。
下面接着看echoserver这个例子,main跟最简单的例子基本上一样,
但是
acceptor.getStatistics().getReadBytesThroughput()
这个方法不知道是干什么的,总在控制台输出,很讨厌。而且不论我输入什么,这个值都不变,总是0.0,期待牛人讲解一下。
而在handler里
@Override public void sessionCreated(IoSession session) { session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10); // We're going to use SSL negotiation notification. session.setAttribute(SslFilter.USE_NOTIFICATION); }
设置了一些在上个例子里写在main里面的东西,说明这样写更加专业。
@Override public void messageReceived(IoSession session, Object message) throws Exception { LOGGER.info( "Received : " + message ); // Write the received data back to remote peer session.write(((IoBuffer) message).duplicate()); }
这里就揭示了为什么会输入一个字符,输出的确实两个