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
- Apache Mina学习笔记(一)
- Apache MINA学习笔记
- apache-Mina学习笔记
- apache mina 学习(一)-----时间服务器
- Apache Mina(一)
- Apache Mina (一)
- Apache Mina(一)
- Apache Mina(一)
- Apache Mina(一)
- Apache Mina(一)
- mina 学习笔记一
- MINA学习笔记一
- MINA学习笔记一
- Mina框架学习笔记(一)
- Mina框架学习笔记(一)
- Mina框架学习笔记(一)
- Mina框架学习笔记(一)
- mina学习笔记一:mina上路
- C语言 条件编译 总结使用
- 超实用的——BAT面试技巧
- Android自定义View之(下拉刷新+侧滑删除)
- ubuntu上部署tomcat7的注意事项
- EAVB 下一代汽车音视频传输技术(一)
- Apache Mina学习笔记(一)
- 搞机器学习要哪些技能
- JSP中的分页技术源码(MYSQL数据库)
- PCA9555的使用个人总结
- maven项目的创建
- Ubuntu 使用C++ 11新特性
- 有关EAVB的一系列问题(二)
- AndroidStudio——数据库SQLite
- 数据库使用索引的利弊