一、mina是什么
官方解释:Apache的Mina(Multipurpose Infrastructure Networked Applications)是一个网络应用框架,可以帮助用户开发高性能和高扩展性的网络应用程序;它提供了一个抽象的、事件驱动的异步API,使Java NIO在各种传输协议(如TCP/IP,UDP/IP协议等)下快速高效开发。
官网地址:http://mina.apache.org/
源码分析:http://my.oschina.net/ielts0909/blog/90355/
参考地址:http://www.blogjava.net/qileilove/archive/2013/12/17/407662.html
二、mina的工作流程
基于 Apache MINA 的网络应用有三个层次,分别是 I/O 服务、I/O 过滤器和 I/O 处理器:
_ I/O 服务:I/O 服务用来执行实际的 I/O 操作。Apache MINA 已经提供了一系列支持不同协议的 I/O 服务,如 TCP/IP、UDP/IP、串口和虚拟机内部的管道等。开发人员也可以实现自己的 I/O 服务。
_ I/O 过滤器:I/O 服务能够传输的是字节流,而上层应用需要的是特定的对象与数据结构。I/O 过滤器用来完成这两者之间的转换。I/O 过滤器的另外一个重要作用是对输入输出的数据进行处理,满足横切的需求。多个 I/O 过滤器串联起来,形成 I/O 过滤器链。
_ I/O 处理器:I/O 处理器用来执行具体的业务逻辑。对接收到的消息执行特定的处理。
创建一个完整的基于 Apache MINA 的网络应用,需要分别构建这三个层次。Apache MINA 已经为 I/O 服务和 I/O 过滤器提供了不少的实现,因此这两个层次在大多数情况下可以使用已有的实现。I/O 处理器由于是与具体的业务相关的,一般来说都是需要自己来实现的。
事件驱动的 API
Apache MINA 提供的是事件驱动的 API。它把与网络相关的各种活动抽象成事件。网络应用只需要对其感兴趣的事件进行处理即可。事件驱动的 API 使得基于 Apache MINA 开发网络应用变得比较简单。应用不需要考虑与底层传输相关的具体细节,而只需要处理抽象的 I/O 事件。比如在实现一个服务端应用的时候,如果有新的连接进来,I/O 服务会产生sessionOpened这样一个事件。如果该应用需要在有连接打开的时候,执行某些特定的操作,只需要在 I/O 处理器中此事件处理方法sessionOpened中添加相应的代码即可。
参考地址:http://blog.csdn.net/jacman/article/details/7432981
三、创建Mina的服务端和客户端,输出
2.1.创建Server
package com.ict.minaServer;
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import java.io.IOException;
import java.net.InetSocketAddress;
/**
Created by chenlong on 2016/8/29.
*/
public class MinaServer {
public static void main(String[] args)
{
//创建ServerScoket
SocketAcceptor acceptor = new NioSocketAcceptor();
//设置传输方式(这里设置成对象传输模式,还有很多的类型后面会具体讲到
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
ProtocolCodecFilter filter = new ProtocolCodecFilter(
new ObjectSerializationCodecFactory());
chain.addLast("objectFilter", filter);
MinaServerHanlder minaServerHanlder=new MinaServerHanlder();
// 添加消息处理
acceptor.setHandler(minaServerHanlder);
// 开启服务器
int bindPort = 10026;
try {
acceptor.bind(new InetSocketAddress(bindPort));
} catch (IOException e) {
e.printStackTrace();
}
// minaServerHanlder.messageSent();
}
}
2.2.创建消息处理类
package com.ict.minaServer;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
/**
public class MinaServerHanlder extends IoHandlerAdapter {
private int count = 0;
// 由底层决定是否创建一个session
public void sessionCreated(IoSession session) {
System.out.println("新客户连接");
}
// 创建了session 后会回调sessionOpened
public void sessionOpened(IoSession session) throws Exception {
count++;
System.out.println("第 " + count + " 个 client 登陆!address: : "
+ session.getRemoteAddress());
sessionWrite(session);
}
// 获取session连接,用来随时向客户端发送消息
public void sessionWrite(IoSession session) throws Exception {
session.write(“Sent by Server1”+1);
session.write(“Sent by Server1”+2);
}
// 当收到了客户端发送的消息后会回调这个函数
public void messageReceived(IoSession session, Object message)
throws Exception {
System.out.println("服务器收到客户端发送指令 :" );
System.out.println(message);
// session.write(“Sent by Server1”);
// messageSent(session,“Sent by Server2”);
}
public void messageSent(IoSession session, Object message) {
System.out.println("message send to client");
// session.write(“Sent by Server3”);
}
// session 关闭调用
public void sessionClosed(IoSession session) {
System.out.println("one client disconnect");
session.closeNow();
}
// session 空闲的时候调用
public void sessionIdle(IoSession session, IdleStatus status) {
System.out.println("connect idle");
}
// 异常捕捉
public void exceptionCaught(IoSession session, Throwable cause) {
System.out.println("throws exception");
}
}
3.客户端代码
3.1.创建客户端
package com.ict.minaClient;
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
import java.net.InetSocketAddress;
/**
Created by chenlong on 2016/8/29.
*/
public class MinaClient {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 创建Socket
NioSocketConnector connector = new NioSocketConnector();
//设置传输方式
DefaultIoFilterChainBuilder chain = connector.getFilterChain();
ProtocolCodecFilter filter = new ProtocolCodecFilter(new ObjectSerializationCodecFactory());
chain.addLast(“objectFilter”, filter);
//设置消息处理
connector.setHandler(new MinaClientHanlder());
//超时设置
connector.setConnectTimeoutCheckInterval(30);
//连接
ConnectFuture cf = connector.connect(new InetSocketAddress("localhost", 10026));
cf.awaitUninterruptibly();
cf.getSession().getCloseFuture().awaitUninterruptibly();
connector.dispose();
}
}
3.2.创建客户端消息处理
package com.ict.minaClient;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
/**
// messageReceived(session,"");
for (int i = 0; i < 10; i++) {
session.write(“p 412703840,4,1,1410248991,73451566,22615771,1239,125,90,0,0,1,900\r\n”
+ “p 412703840,4,1,1410248991,73451566,22615771,1239,125,90,0,0,1,900\r\n”
+ “p 412703840,4,1,1410248991,73451566,22615771,1239,125,90,0,0,1,900\r\n”
+ “p 412703840,4,1,1410248991,73451566,22615771,1239,125,90,0,0,1,900”);
}
}
public void sessionClosed(IoSession session)
{
System.out.println("client close");
}
public void messageReceived(IoSession session , Object message)throws Exception
{
System.out.println("客户端接受到了消息"+message) ;
// session.write(“Sent by Client1”);
}
}
参考地址:http://blog.csdn.net/pdw_jsp/article/details/8603224