基于MINA框架疾速开发网络应用程序
1.MINA框架简介
MINA(Multipurpose Infrastructure for Network Applications)是用于开发高机能和高可用性的网络利用程序的基本框架。通过应用MINA框架可以能够省下处置底层I/O和线程并发等庞杂工作,开发职员可能把更多的精神投入到业务设计跟开发当中。MINA框架的应用比拟普遍,运用的开源名目有Apache Directory、AsyncWeb、Apache Qpid、QuickFIX/J、Openfire、SubEthaSTMP、red5等。MINA框架当前稳固版本是1.1.6,最新的2.0版本目前已经宣布了M1版本。
MINA框架的特色有:基于java NIO类库开发;采用非梗阻方法的异步传输;事件驱动;支持批量数据传输;支持TCP、UDP协定;把持反转的设计模式(支撑Spring);采用优雅的松耦合架构;可机动的加载过滤器机制;单元测试更轻易实现;可自定义线程的数目,以提高运行于多处理器上的性能,曼秀雷敦水彩润唇膏;采取回调的方式完成调用,线程的使用更容易。
2.MINA框架的常用类
类NioSocketAcceptor用于创建服务端监听;
类NioSocketConnector用于创建客户端连接;
类IoSession用来保留会话属性和发送消息;
类IoHandlerAdapter用于定义业务逻辑,常用的方法有:
方式 定义
sessionCreated() 当会话创建时被触发
sessionOpened() 当会话开端时被触发
sessionClosed() 当会话封闭时被触发
sessionIdle() 当会话闲暇时被触发
exceptionCaught() 当接口中其余方法抛出异样未被捕捉时触发此办法
messageRecieved() 当吸收到消息后被触发
messageSent() 当发送消息后被触发
3.服务端应用开发示例
下面将以MINA2.0M1版本为基础,通过一个典范来演示一下如何使用MINA框架进行开发。开发环境为jdk6.0,开发工具NetBeans6.0,所需jar包slf4j-api.jar、slf4j-jdk14.jar、MINA-core-2.0.0-M1.jar。
首先定义一个业务逻辑处理器TimeServerHandler,继续自IoHandlerAdapter,实现的功效有:当客户端创建会话时会显示客户端装备的IP和端口;当客户端输入quit时停止会话;客户端输入其它内容时则向客户端发送当前时光。代码如下:
package src;
import java.util.Date;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
public class TimeServerHandler extends IoHandlerAdapter {
@Override
public void sessionCreated(IoSession session) {
// 显示客户真个ip和端口
System.out.println(session.getRemoteAddress().toString());
}
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
String str = message.toString();
if (str.trim().equalsIgnoreCase("quit")) {
session.close();// 结束会话
return;
}
Date date = new Date();
session.write(date.toString());// 返回当前时间的字符串
System.out.println("Message written...");
}
}
package src;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
public class MinaTimeServer {
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("UTF-8"))));// 指定编码过滤器
acceptor.setHandler(new TimeServerHandler());// 指定业务逻辑处理器
acceptor.setDefaultLocalAddress(new InetSocketAddress(PORT));// 设置端口号
acceptor.bind();// 启动监听
}
}
4.测试
首先运行MinaTimeServer,启动服务端,接着在命令行运行“telnet 127.0.0.1 9123”,来登录,这时会看到服务端输出如下:
2008-2-21 16:15:29 org.apache.MINA.filter.logging.LogLevel$4 log
/10.64.2.137:4140 IP和端口号
信息: CREATED
2008-2-21 16:15:29 org.apache.MINA.filter.logging.LogLevel$4 log
信息: OPENED 在客户端输入回车,在客户端可以看到服务端返回当前的时间:
Thu Feb 21 16:20:14 CST 2008
服务端输出:
2008-2-21 16:20:14 org.apache.MINA.filter.logging.LogLevel$4 log
信息: RECEIVED: HeapBuffer[pos=0 lim=2 cap=2048: 0D 0A] 接收收到回车符
Message written...
2008-2-21 16:20:14 org.apache.MINA.filter.logging.LogLevel$4 log
信息: SENT: HeapBuffer[pos=0 lim=29 cap=30: 54 68 75 20 46 65 62 20 32 31 20 31 36 3A 32 30...]
2008-2-21 16:20:14 org.apache.MINA.filter.logging.LogLevel$4 log
信息: SENT: HeapBuffer[pos=0 lim=0 cap=0: empty] 5.客户端开发示例
首先定义类TimeClientHandler来处理消息接收事件:
package src.client;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
public class TimeClientHandler extends IoHandlerAdapter {
public TimeClientHandler() {
}
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
System.out.println(message);// 显示接受到的消息
}
}
package src.client;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
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();
}
}
6.总结
通过上述示例可以懂得到:使用MINA框架来开发的网络应用程序代码构造更清楚;MINA框架实现了底层的线程治理;MINA内置的编码器可以满意大多数用户的需要,省去了开发人员新闻编码解码的工作。具称使用MINA开发服务器程序的性能已经迫近使用 C/C++ 语言开发的网络服务。因而,倡议在网络应用程序开发进程中尝试使用MINA框架来进步咱们的开发效率和应用程序的履行效力,新开1.76金币传奇。
网通体系集成公司 杨庆成