Apache Mina学习笔记(一)

来源:互联网 发布:2016禁毒知识网络大赛 编辑:程序博客网 时间:2024/05/19 16:20

mina是什么?

    官方解释:Apache的Mina(Multipurpose Infrastructure Networked Applications)是一个网络应用框架,可以帮助用户开发高性能和高扩展性的网络应用程序;它提供了一个抽象的、事件驱动的异步API,使Java NIO在各种传输协议(如TCP/IP,UDP/IP协议等)下快速高效开发。    个人认为mina就是底层数据传输和用户应用程序交互的一个接口,因为Mina 处于中间层, 它不关心底层网络数据如何传输, 只负责接收底层数据,过滤并转换为 Java 对象提供给我们的应用程序, 然后把应用程序响应值过滤并转换为底层识别的字节, 提供给底层传输;

mina的工作流程

这里写图片描述
这是从mina官网上扣下来的一个工作流程图,从这个图里面我们可以很清楚的看到mina有三个核心的接口:
一个是IoService:创建对象服务的(可以是客户端,也可以是服务端)
一个是IoFileter:数据过滤的,主要是编码和解码操作
一个是IoHandler:业务处理

mina入门实例HelloWorld

1.创建java项目,需要用到mina的核心包和sl4j两个包
这里写图片描述
2. 根据mina的工作流程一步步来,先创建IoService,在编写过滤器,最后在编写业务逻辑

package com.server;import java.nio.charset.Charset;import org.apache.mina.core.service.IoAcceptor;import org.apache.mina.core.session.IdleStatus;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;public class Server {    public static void main(String[] args) {        IoAcceptor acceptor = new NioSocketAcceptor();//Tcp协议的服务端接口实现类        acceptor.getFilterChain().addLast( //添加消息过滤器                "codec",                new ProtocolCodecFilter(new TextLineCodecFactory(                    Charset.forName("UTF-8"),                    LineDelimiter.WINDOWS.getValue(),                    LineDelimiter.WINDOWS.getValue()                )));        //设置读取缓冲区大小        acceptor.getSessionConfig().setReadBufferSize(2048);        //当读写通道多长时间不操作进入空闲状态操作        acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);        //绑定业务逻辑操作        acceptor.setHandler(new ServerHandler());    }}

3.编写服务端的业务处理类ServerHandler.java

package com.server;import java.util.Date;import org.apache.mina.core.service.IoHandlerAdapter;import org.apache.mina.core.session.IdleStatus;import org.apache.mina.core.session.IoSession;public class ServerHandler extends IoHandlerAdapter{    @Override    public void sessionCreated(IoSession session) throws Exception {        System.out.println("服务端与客户端创建连接...");    }    @Override    public void sessionOpened(IoSession session) throws Exception {        System.out.println("服务端与客户端连接打开...");    }    @Override    public void messageReceived(IoSession session, Object message)            throws Exception {        String msg = message.toString();        System.out.println("服务端接收到的数据为:" + msg);        if ("bye".equals(msg)) { // 服务端断开连接的条件            session.close();        }        Date date = new Date();        session.write(date);    }    @Override    public void messageSent(IoSession session, Object message) throws Exception {        System.out.println("服务端发送信息成功...");    }    public void sessionClosed(IoSession session) throws Exception {    }    @Override    public void sessionIdle(IoSession session, IdleStatus status)            throws Exception {        System.out.println("服务端进入空闲状态...");    }}

这个时候你的服务端已经按照mina的工作流程完成了,接下来我们要实现mina的客户端了。
4、客户端的工作流程和服务端基本一样,唯一的区别就是一个收消息,一个发消息,现在来编写客户端代码Client.java

package com.client;import java.net.InetSocketAddress;import java.nio.charset.Charset;import org.apache.mina.core.future.ConnectFuture;import org.apache.mina.core.service.IoConnector;import org.apache.mina.core.session.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;public class Client {    public static void main(String[] args) {        IoConnector connector = new NioSocketConnector();        connector.setConnectTimeout(30000);//设置超时时间        //添加消息过滤器        connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(                    Charset.forName("utf-8"),                    LineDelimiter.WINDOWS.getValue(),                    LineDelimiter.WINDOWS.getValue()        )));        //绑定业务逻辑        connector.setHandler(new ClientHandler());        IoSession session = null;        try {            ConnectFuture future = connector.connect(new InetSocketAddress(                    "localhost", 9312));// 创建连接            future.awaitUninterruptibly();// 等待连接创建完成            session = future.getSession();// 获得session            session.write("Hello World");// 发送消息        } catch (Exception e) {            System.out.println("客户端链接异常...");        }        session.getCloseFuture().awaitUninterruptibly();// 等待连接断开        connector.dispose();    }}

5.客户端处理业务逻辑类ClientHandler.java

package com.client;import org.apache.mina.core.service.IoHandlerAdapter;import org.apache.mina.core.session.IoSession;public class ClientHandler extends IoHandlerAdapter{    @Override    public void messageReceived(IoSession session, Object message)            throws Exception {        String msg = message.toString();        System.out.println("客户端接收到的信息为:" + msg);    }}

mina基础

至于为什么mina官网上给出的工作流程第一步创建连接用的是IoService,而例子里面服务端和客户端创建的却不是这个呢?看完下面以服务就明白了
这里写图片描述
这张图是IoAcceprot跟IoService之间的关系(从mina官网上面扣下来的)
这里写图片描述
这张图是IoConnector跟IoService之间的关系,当然也是从mina官网上面扣下来的了。

0 1
原创粉丝点击