一、简介
Apache Mina Server 是一个网络通信应用框架,也就是说, 也可以提供JAVA对象的序列化服务、虚拟机管道通信服务等),Mina可以帮助我们快速开发高性能、高扩展性的网络通信应用,Mina提供了事件驱动、异步(Mina的异步IO默认使用的是JAVA NIO作为底层支持)操作的编程模型。Mina主要有1.x和2.x两个分支。学习mina,需要已掌握JAVA IO、JAVA NIO、JAVASocket、 JAVA线程及并发(java.util.concurrent.*)的知识。Mina同时提供了网络通信的Server端、Client端的封装。Mina的API 将真正的网络通信与我们的应用程序隔离开来,你只需要关心你要发送、接收的数据以及你的业务逻辑即可。
二、过程
当客户端向这一端口发送消息,IoService会监听这个端口,并经过过滤链进行处理后,传给IoHandler,在这个处理器中有很多函数,这些函数会在不同情况下触发(连接建立时、接收到消息时、连接关闭时、连接超时时等等)。你需要重写你需要的方法,在里面编写你的业务逻辑。
Mina 同时提供了网络通信的Server 端、Client 端的封装,无论是哪端,Mina 在整个网通通信结构中都处于如下的位置:可见Mina 的API 将真正的网络通信与我们的应用程序隔离开来,你只需要关心你要发送、接收的数据以及你的业务逻辑即可。同样的,无论是哪端,Mina 的执行流程如下所示:
三、常用类以及方法
类NioSocketAcceptor用于创建服务端监听;
类NioSocketConnector用于创建客户端连接;
类IoSession用来保存会话属性和发送消息;
类IoHandlerAdapter用于定义业务逻辑,
常用的方法有:
sessionCreated() 当会话创建时被触发
sessionOpened() 当会话开始时被触发
sessionClosed() 当会话关闭时被触发
sessionIdle() 当会话空闲时被触发
exceptionCaught() 当接口中其他方法抛出异常未被捕获时触发此方法
messageRecieved() 当接收到消息后被触发
messageSent() 当发送消息后被触发
四、使用步骤
1.导包
2.服务端
步骤:
1.创建IOService的实例
2.创建过滤链
3…设置处理器 重写需要的方法,在里面编写业务逻辑。是业务处理的地方
4.监听接口
package mina_0826;import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.service.IoHandler;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.FilterEvent;
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;import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;public class MInaServer {
//服务器public static void main(String[] args) throws IOException {//1.创建IOService的实例//监听这个接口IoAcceptor acceptor = new NioSocketAcceptor();//2.创建过滤链acceptor.getFilterChain().addLast("logger",new LoggingFilter());acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));//3.设置处理器 重写需要的方法,在里面编写业务逻辑。业务处理的地方acceptor.setHandler(new TimeServerHander());//4.让其监听某个端口acceptor.bind(new InetSocketAddress(9999));System.out.println("服务器开启");
}
}class TimeServerHander extends IoHandlerAdapter {public TimeServerHander() {super();
}@Override
public void sessionCreated(IoSession session) throws Exception {super.sessionCreated(session);System.out.println("服务器:会话通道创建");
}@Override
public void sessionOpened(IoSession session) throws Exception {super.sessionOpened(session);System.out.println("服务器:会话打开");
}@Override
public void sessionClosed(IoSession session) throws Exception {super.sessionClosed(session);System.out.println("服务器:会话关闭");
}@Override
public void sessionIdle(IoSession session, IdleStatus status) throws Exception {super.sessionIdle(session, status);System.out.println("服务器:会话休眠");
}@Override
public void exceptionCaught(IoSession session, Throwable cause) throws Exception {super.exceptionCaught(session, cause);System.out.println("服务器:有异常出现!");
}@Override
public void messageReceived(IoSession session, Object message) throws Exception {super.messageReceived(session, message);System.out.println("服务器:接收信息");
}@Override
public void messageSent(IoSession session, Object message) throws Exception {super.messageSent(session, message);System.out.println("服务器:发送信息");
}@Override
public void inputClosed(IoSession session) throws Exception {super.inputClosed(session);System.out.println("服务器:输入关闭!");
}
}
客户端:
步骤:
1.实例化连接器
2.设置过滤链
3.处理器
4.进行连接
package mina_0826;import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.service.IoHandler;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.FilterEvent;
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;import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import java.sql.Connection;public class MInaClient {
public static void main(String[] args) {//1.连接器,NioSocketConnector connector = new NioSocketConnector();//2.设置过滤链connector.getFilterChain().addLast("logger",new LoggingFilter());connector.getFilterChain().addLast("codec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));//3.设置处理器connector.setHandler(new MyClientHandler());//4.连接地址ConnectFuture connect =connector.connect(new InetSocketAddress("localhost",9999));System.out.println("客户端已连接!");
}
}
class MyClientHandler extends IoHandlerAdapter {
public MyClientHandler() {super();
}@Override
public void sessionCreated(IoSession session) throws Exception {super.sessionCreated(session);session.write("你好,服务器!");System.out.println("客户端:会话被创建!");
}@Override
public void sessionOpened(IoSession session) throws Exception {super.sessionOpened(session);System.out.println("客户端:会话打开!");}@Override
public void sessionClosed(IoSession session) throws Exception {super.sessionClosed(session);System.out.println("客户端:会话关闭!");
}@Override
public void sessionIdle(IoSession session, IdleStatus status) throws Exception {super.sessionIdle(session, status);System.out.println("客户端:会话休眠!");
}@Override
public void exceptionCaught(IoSession session, Throwable cause) throws Exception {super.exceptionCaught(session, cause);System.out.println("客户端:有异常出现!");
}@Override
public void messageReceived(IoSession session, Object message) throws Exception {super.messageReceived(session, message);System.out.println("客户端:接收信息!");
}@Override
public void messageSent(IoSession session, Object message) throws Exception {super.messageSent(session, message);System.out.println("客户端:发送信息!"+message);}@Override
public void inputClosed(IoSession session) throws Exception {super.inputClosed(session);System.out.println("客户端:输入关闭!");
}
}
五、总结
优点:采用非阻塞方式的异步传输;