zoukankan      html  css  js  c++  java
  • Apache MINA框架入门

    说明

    NIO API是在Java 1.4引入的。MINA是基于NIO编写的。首先要了解NIO与BIO的概念以及区别,NIO代表非阻塞IO,BIO代表着阻塞式IO。具体细节请百度。。。

    MINA是一个简单但功能齐全的网络应用框架(其实已经被NettyPK掉了,但都是一类型的东西,很多东西相通的,因为我们单位在用MINA所以优先看这个)。下载地址:http://mina.apache.org/downloads-mina.html    或者在maven中添加:

            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.6.6</version>
                <type>jar.sha256</type>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>1.6.6</version>
            </dependency>
            <dependency>
                <groupId>org.rxtx</groupId>
                <artifactId>rxtx</artifactId>
                <version>2.1.7</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
            <dependency>
                <groupId>org.apache.mina</groupId>
                <artifactId>mina-core</artifactId>
                <version>2.0.7</version>
            </dependency>
            <dependency>

    MINA的使用流程:

    编写自己的IoService,在这里我们创建IoService的子类。随后编写不同的过滤器(例如关于编解码的过滤器),将这些过滤器添加到过滤器链中,设置当前IoService监听的端口(可以是多个),设置处理器也就是业务逻辑编写的地方。

    MINA说明:

    当客户端向这一端口发送消息,IoService会监听这个端口,并经过过滤链进行处理后,传给IoHandler,在这个处理器中有很多函数,这些函数会在不同情况下触发(连接建立时、接收到消息时、连接关闭时、连接超时时等等)。你需要重写你需要的方法,在里面编写你的业务逻辑。

    下面是MINA的一个示意图:


    一个简单的demo:首先是编写一个服务端

    1. 首先是IoService的代码:

    package com.mina;
    
    import java.io.IOException;
    import java.net.InetSocketAddress;
    import java.nio.charset.Charset;
    
    import org.apache.mina.core.service.IoAcceptor;
    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;
    
    public class MinaTimeServer {
    
    	public static void main(String[] args) throws IOException {
    		//创建IoService的实例
    		IoAcceptor acceptor = new NioSocketAcceptor();
    		//设置过滤链  日志、编解码
    		acceptor.getFilterChain().addLast("logger", new LoggingFilter());
    		acceptor.getFilterChain().addLast("codec",
    				new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
    		//设置处理器 就是业务逻辑处理的地方
    		acceptor.setHandler(new TimeServerHandler());
    		//让其监听某个端口
    		acceptor.bind(new InetSocketAddress(9123));
    	}
    }
    

    2. 接下来就是编写这个TimeServerHndler类了

    package com.mina;
    
    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 TimeServerHandler extends IoHandlerAdapter{
        //设置一个变量  
    	 public static int count=0;
    	
        //当捕获到异常时会触发(这里不做任何处理,仅仅打印一下)
    	public void execptionCaught(IoSession session,Throwable cause) throws Exception {	
    		cause.printStackTrace();
    	}
        //当接收到数据时触发
    	public void messageReceived(IoSession session, Object message) {
    		String mes=message.toString();
        //当接受到的数据是quit时或者用户请求大于2次关闭连接
    	if(mes.trim().equalsIgnoreCase("quit")||count>2) {
    		System.out.println("正在退出时间服务器");
    		session.write("正在退出时间服务器。。。。");
    		session.close();
    		return;
    	}
            //向客户端回复一个当前时间
    		Date date = new Date();
    		session.write(date.toString());
    		System.out.println("message writen:"+mes);
    		count++;
    	}
    	
    }
    

    这个时间服务器就写完了。可以在cmd窗口县通过telnet命令向这个端口发送数据,来测试一下。

    测试服务端

    打开cmd窗口,输入命令Telnet localhost 9123

    注意:如果显示这个不是内部命令什么的,先检查拼写,没问题后百度怎么开启电脑的teinet。

    输入该命令后窗口如下:

    这时可以输入任意字符,会发送到该端口,输入quit退出。或者次数到了后也会自动断开连接。

    向服务器发送任意字符,服务器会向你回复一个时间戳。

    下面我们自己写一个客户端来和服务端连接。

    客户端的编写

    客户端和服务器端的编写几乎是一样的,将IoService替换一下,服务器时我们用的是NioSocketAcceptor,客户端我们换成NioSocketConnector。这两个都是IoService的实现类。写法差不多直接上代码:

    这是IoService的代码:

    package com.minaTcpClient;
    
    import java.net.InetSocketAddress;
    import java.nio.charset.Charset;
    import org.apache.mina.core.future.ConnectFuture;
    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;
    
    public class TcpClient {
    
    	public static void main(String[] args) {
    		//创建IoService实例
    		NioSocketConnector connector = new NioSocketConnector();
    		//设置过滤链
    		connector.getFilterChain().addLast("logger", new LoggingFilter());
    		connector.getFilterChain().addLast("codec",
    				new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
    		//设置处理器
    		connector.setHandler(new TcpClientHandler());
    		//连接地址
              ConnectFuture connect = connector.connect(new InetSocketAddress("localhost",9123));
    	}
    }
    

    下面是TcpClientHandler的代码:

    package com.minaTcpClient;
    
    import org.apache.mina.core.service.IoHandlerAdapter;
    import org.apache.mina.core.session.IoSession;
    
    public class TcpClientHandler extends IoHandlerAdapter{
        //会话创建时触发
    	public void sessionCreated(IoSession session) throws Exception {
            System.out.println("session  Created");
        }
    	//会话打开时触发(第一次连接时先触发sessionCreated函数,后触发本函数)
    	 public void sessionOpened(IoSession session) throws Exception {
    	       session.write("Hello....");
    	    }
    	 //当接收到消息时触发
    	 public void messageReceived(IoSession session, Object message) throws Exception {
    		 System.out.println("收到:"+message.toString());
    	        session.write("Received :"+message.toString());
    	    }
    }
    

    写完上面的代码后先启动服务器,让后启动客户端。这个顺序应该能理解。。。。。。

    关于UDP协议

    UDP协议的写法是一样的,MINA在一定程度上屏蔽了两者的差异。

    在编写上只需要将IoService的实现类替换一下

    服务器端的NioSocketAcceptor替换为NioDatagramAcceptor

    客户端的NioSocketConnector替换为NioDatagramConnector

    他们都是IoService的实现类。

  • 相关阅读:
    REAL6410、OK6410、TE6410 的区别
    在裸奔2440时候遇到的GPIO郁闷问题(作者gooogleman)
    Jlink V8 48 RMB,力特USB转串口线 35 RMB 甩了!所剩不多,先到先得。
    一个机械专业小混混(gooogleman)学习嵌入式ARM的真实经历
    如何给自己淘宝的宝贝做google广告?
    程序员开网店的一些经验分享
    【有奖辩论】工程师和销售创业谁更有优势?
    关于高端ARM处理器选型的一些个人看法(作者:gooogleman)
    要搬家了,准备甩掉剩下的十多个源动力笔记本包,运动休闲包!
    推荐一款高性价比android /wince/Linux ARM11 S3C6410 开发板
  • 原文地址:https://www.cnblogs.com/dingzuoheng/p/12805070.html
Copyright © 2011-2022 走看看