Apache的Mina(Multipurpose Infrastructure Networked Applications)是一个网络应用框架,可以帮助用户开发高性能和高扩展性的网络应用程序;它提供了一个抽象的、事件驱动的异步API,使Java NIO在各种传输协议(如TCP/IP,UDP/IP协议等)下快速高效开发。
Apache Mina也称为:
1.NIO框架
2.客户端/服务端框架(典型的C/S架构)
3.网络套接字(networking socket)类库
4.事件驱动的异步API(注意:在JDK7中也新增了异步API)
总之:我们简单理解它是一个封装底层IO操作,提供高级操作API的通讯框架!
Mina 的核心包:
org.apache.mina.core.service
org.apache.mina.core.session
org.apache.mina.core.polling
org.apache.mina.transport.socket
先用Mina做一个简单的应用程序。
第一步 下载使用的jar包
第二步 工程创建配置
DemoServer1
package lcl.mina.demo1;import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.log4j.Logger;
import org.apache.mina.common.IdleStatus;
import org.apache.mina.common.IoAcceptor;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.LineDelimiter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import lcl.mina.demo1.DemoServer1Handler;
public class DemoServer1 {
private static Logger logger = Logger.getLogger(DemoServer1.class);
private static int PORT = 3005;
public static void main(String[] args) {
// TODO Auto-generated method stub
IoAcceptor acceptor = null; // 创建连接
try{
//创建非组赛的server段的socket
acceptor = new NioSocketAcceptor();
//创建过滤器 (使用Mina提供的文本换行符编解码器)
acceptor.getFilterChain().addLast("codec",
new ProtocolCodecFilter(
new TextLineCodecFactory(
Charset.forName("utf-8"),
LineDelimiter.MAC.getValue(),
LineDelimiter.MAC.getValue()
)
)
);
//自己定义的编解码器
// acceptor.getFilterChain().addLast("codec",
// new ProtocolCodecFilter(
// new LCLTextLineCodecFactory(
// Charset.forName("utf-8"),
// "\r\n"
// )
// )
// );
//设置读取数据的缓冲区大小
acceptor.getSessionConfig().setReadBufferSize(2048);
//设置读写通道10庙内误操作进入空闲状态
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
//绑定逻辑处理器
acceptor.setHandler(new DemoServer1Handler());
//绑定端口,启动服务
acceptor.bind(new InetSocketAddress(PORT));
logger.info("lcl server start uccess with port: " + PORT);
}catch(Exception e){
logger.error("lcl server start error",e);
e.printStackTrace();
}
}
}
DemoServer1Handler
package lcl.mina.demo1;
import java.util.Date;
import org.apache.log4j.Logger;
import org.apache.mina.common.IdleStatus;
import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;
public class DemoServer1Handler extends IoHandlerAdapter{
public static Logger logger = Logger.getLogger(DemoServer1Handler.class);
@Override
public void sessionCreated(IoSession session) throws Exception {
logger.info("server and client begin to create connect...");
}
@Override
public void sessionOpened(IoSession session) throws Exception {
logger.info("server and client has connect...");
}
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
String msg = message.toString();
logger.info("server receive data:" + msg);
if ("lcl".equals(msg)) { // 服务端断开连接的条件
session.close();
}
Date date = new Date();
session.write(date);
}
@Override
public void messageSent(IoSession session, Object message) throws Exception {
logger.info("server send message success...");
}
@Override
public void sessionClosed(IoSession session) throws Exception {
logger.info("session close");
}
@Override
public void sessionIdle(IoSession session, IdleStatus status)
throws Exception {
logger.info("server is not busy...");
}
@Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
logger.info("server catch exception...");
}
}
LCLMinaClient1
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.log4j.Logger;
import org.apache.mina.common.ConnectFuture;
import org.apache.mina.common.IoConnector;
import org.apache.mina.common.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.LineDelimiter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
import lcl.mina.demo1.LCLMinaClient1Handler;
public class LCLMinaClient1 {
private static Logger logger = Logger.getLogger(LCLMinaClient1.class);
private static String HOST = "127.0.0.1";
private static int PORT = 3005;
public static void main(String[] args) {
// TODO Auto-generated method stub
// 创建一个非阻塞的客户端程序
IoConnector connector = new NioSocketConnector(); // 创建连接
// 设置链接超时时间
connector.setConnectTimeout(30000);
// 添加过滤器
connector.getFilterChain().addLast( //添加消息过滤器
"codec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset
.forName("utf-8"), LineDelimiter.MAC.getValue(),
LineDelimiter.MAC.getValue())));
// 添加业务逻辑处理器类
connector.setHandler(new LCLMinaClient1Handler());// 添加业务处理
IoSession session = null;
try {
ConnectFuture future = connector.connect(new InetSocketAddress(
HOST, PORT));// 创建连接
future.awaitUninterruptibly();// 等待连接创建完成
session = future.getSession();// 获得session
session.write("lcl hello mina");// 发送消息
} catch (Exception e) {
logger.error("client connect catch exception...", e);
}
session.getCloseFuture().awaitUninterruptibly();// 等待连接断开
connector.dispose();
}
}
LCLMinaClient1Handler
import org.apache.log4j.Logger;
import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;
public class LCLMinaClient1Handler extends IoHandlerAdapter {
private static Logger logger = Logger.getLogger(LCLMinaClient1Handler.class);
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
String msg = message.toString();
logger.info("client receive data:" + msg);
}
@Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
logger.error("client connect catch exception...", cause);
}
}