MINA作为高效能的可应对高并发访问的NIO框架,特性就不多介绍了。下面提供一些使用的实例。
服务器端代码:
/**
* Description 用来启动MINA服务端
* @author Administrator
* 2012-10-21
*/
public class MinaTimeServer {
protected static Logger logger = LoggerFactory.getLogger(MinaTimeServer.class);
private static final int PORT = 9123; // 定义监听端口
public static void main(String[] args) throws IOException {
//监听客户端的连接
IoAcceptor acceptor = new NioSocketAcceptor();
acceptor.getFilterChain().addLast("logger", new LoggingFilter());
acceptor.getFilterChain().addLast(
"codec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset
.forName("GBK")))); // 指定编码过滤器
acceptor.setHandler(new TimeServerHandler()); // 指定业务逻辑处理器
// 在过滤器链中没有添加“threadPool”过滤器,则业务逻辑处理和IoProcessor使用同一个线程。如果设置了“threadPool”过滤器,
// 则使用设置的线程池产生线程进行业务逻辑处理,
acceptor.getFilterChain().addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool()));
acceptor.setDefaultLocalAddress(new InetSocketAddress(PORT)); // 设置端口号
acceptor.bind(); // 启动监听
}
}
服务器端程序的业务处理器:
/**
* Description 业务逻辑处理器TimeServerHandler,继承自IoHandlerAdapter,
* 实现的功能有:当客户端创建会话时会显示客户端设备的IP和端口;当客户端输入quit时结束会话;客户端输入其它内容时则向客户端发送当前时间。
* @author Administrator
* 2012-10-21
*/
public class TimeServerHandler extends IoHandlerAdapter {
@Override
public void sessionCreated(IoSession session) {
//显示客户端的ip和端口
System.out.println("Client IP:" + session.getRemoteAddress().toString());
}
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
String str = message.toString();
if (str.trim().equalsIgnoreCase("quit")) {
//结束会话,断开连接
session.close(true);
return;
}
Date date = new Date();
session.write("Server return to client: " + date.toString()); //返回当前时间的字符串
System.out.println("Message written..." + str);
}
}
这时可以进行测试前面的代码,用命令行中输入:
telnet 127.0.0.1 9123
服务器端会收到客户端的连接信息,显示:
Client IP:/127.0.0.1:3815
然后在telent窗口中输入字符:test123
服务器端会打印:Message written...test123
客户端显示服务器端返回的信息:Server return to client: Sun Oct 21 17:22:09 CST 2012
可看出MINA的客户端和服务器端可以相互进行通信。
下面是MINA客户端的连接类代码:
/**
* Description MinaTimeClient类用于连接服务端,并向服务端发送消息
* @author Administrator
* 2012-10-21
*/
public class MinaTimeClient {
public static void main(String[] args) {
// 与服务端建立连接
NioSocketConnector connector = new NioSocketConnector();
connector.getFilterChain().addLast("logger", new LoggingFilter());
connector.getFilterChain().addLast(
"codec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset
.forName("UTF-8")))); // 设置编码过滤器
connector.setConnectTimeout(30);
connector.setHandler(new TimeClientHandler()); // 设置事件处理器
ConnectFuture cf = connector.connect(new InetSocketAddress("127.0.0.1",
9123)); // 建立连接
cf.awaitUninterruptibly(); // 等待连接创建完成
cf.getSession().write("hello"); // 发送消息
cf.getSession().write("quit"); // 发送消息
cf.getSession().getCloseFuture().awaitUninterruptibly(); // 等待连接断开
connector.dispose();
}
}
客户端连接类用到的处理器代码:
/**
* Description TimeClientHandler处理消息接收事件
* @author Administrator
* 2012-10-21
*/
public class TimeClientHandler extends IoHandlerAdapter {
public TimeClientHandler() {
}
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
System.out.println("Client received message:" + message); // 显示接收到的消息
}
}
启动程序测试:
开始->运行->cmd->tecnet 127.0.0.1 9123
通过JDK自带工具jvisualvm查看线程:
![](http://dl.iteye.com/upload/attachment/0076/0635/8f9a72c4-0bc1-39d6-9fec-949e00af8aab.jpg)
可看到几个线程:
NioSocketAcceptor-1为服务器端监听端口9999通过线程池创建的一个线程。
NioProcessor-2为IoProcessor线程池创建的线程,用来IO处理。
pool-3-thread-3为过滤器配置的线程池创建的线程,用来业务逻辑处理。