apache mina 学习笔记之一:mina简介和环境搭建

熊孩纸 阅读:1120 2021-03-31 22:54:33 评论:0

Mina简介:

          Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版中提供),MINA 所支持的功能也在进一步的扩展中。

Apache Mina经常用作:
1)NIO框架库
2)客户端/服务器通信框架库
3)网络Socket通信库

Apache Mina还伴随有不少子项目:
1)Asyncweb
构建于Apache Mina异步框架之上的HTTP服务器
2)FtpServer
一个FTP服务器
3)SSHd
一个Java库,支持SSHH协议
4)Vysper

一个XMPP服务器


本文将通过一个简单的问候程序 HelloServer 来介绍 MINA 的基础架构的同时演示如何使用MINA 开发网络应用程序。

环境准备

  1. 首先到官方网站下载最新的 MINA 版本,地址是:http://mina.apache.org/downloads.html。下载之前先介绍一下 MINA 的两个版本:1.0.x 适合运行环境为 JDK1.4,1.1.x 适合 JDK1.5 的版本,两者的编译环境都需要 JDK1.5。JDK1.5 已经是非常普遍了,本文中使用 1.1.5 版本的 MINA,编译和运行所需的文件是 mina-core-1.1.5.jar。
  2. 下载 MINA 的依赖包 slf4j。MINA 使用此项目作为日志信息的输出,而 MINA 本身并不附带此项目包,请到http://www.slf4j.org/download.html地址下载 slf4j 包,slf4j 项目解压后有很多的文件,本例中只需要其中的 slf4j-api-1.4.3.jar 和 slf4j-simple-1.4.3.jar 这两个 jar 文件。如果没有这两个文件就会导致启动例子程序的时候报 org/slf4j/LoggerFactory 类没找到的错误。
  3. 当然要求机器上必须装有 1.5 或者更新版本的 JDK。
  4. 最好你应该选择一个顺手的 Java 开发环境例如 Eclipse 或者 NetBeans 之类的,可以更方便的编码和调试,虽然我们的最低要求只是一个简单的文本编辑器而已。

项目先决条件:

1、apache mina core 2.09.jar文件

2、Eclipse或MyEclipse或IDEA 编辑器

3、slf4j的jar文件

项目结构:



编写代码并执行

1、编写代码HelloServer.java,如下:

package demo.mina.echo; 
 
 
import java.io.IOException; 
import java.net.InetSocketAddress; 
import java.nio.charset.Charset; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
 
 
import org.apache.mina.core.service.IoAcceptor; 
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.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 HelloServer { 
    private static final int PORT = 9123; 
    public static void main(String[] args){ 
        // 监听连接的对象 
        IoAcceptor acceptor = new NioSocketAcceptor();         
        // 配置过滤器 
        // logger过滤器会输出所有的信息,例如新创建的会话、消息的接收、消息的发送、会话的关闭 
        // codec过滤器会转换二进制活协议规定的数据为消息对象,这里是处理基于文本的消息 
        acceptor.getFilterChain().addLast("logger", new LoggingFilter()); 
        acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter( 
                new TextLineCodecFactory(Charset.forName("UTF-8")))); 
         
        //  
        acceptor.setHandler(new TimeServerHandler());         
        // 设置输入缓冲区的大小和会话的IDLE熟悉 
        acceptor.getSessionConfig().setReadBufferSize(2048); 
        acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);         
        try { 
            acceptor.bind(new InetSocketAddress(PORT)); 
            System.out.println("HelloServer started on port " + PORT); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
    }     
     
} 
/* 
 * HelloServer 处理逻辑 
 * 
 */ 
class TimeServerHandler extends IoHandlerAdapter { 
<span style="white-space:pre">	</span>//当有异常发生时触发 
    @Override 
    public void exceptionCaught(IoSession session, Throwable cause) 
            throws Exception { 
        cause.printStackTrace(); 
        session.close(); 
    } 
    //收到来自客户端的消息 
    @Override 
    public void messageReceived(IoSession session, Object message) throws Exception { 
   //来至客户端信息 
        String str = message.toString(); 
        //来至客户端ip信息 
        String ip = session.getRemoteAddress().toString(); 
        System.out.println("===> Message From " + ip +" : " + str);     
        session.write("Hello,Client " + ip); 
        //接受客户端字符串"quit"关闭当前会话连接 
        if(str.trim().equalsIgnoreCase("quit")){ 
            session.close(true); 
            return; 
        } 
//        Calendar time = Calendar.getInstance(); 
//        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
//        session.write(df.format(time.getTime())); 
//        System.out.println("Time Message written..."); 
    } 
    //连接被关闭时触发 
    @Override 
public void sessionClosed(IoSession session) throws Exception { 
// TODO Auto-generated method stub 
    System.out.println("session closed from " + session.getRemoteAddress().toString()); 
} 
    //有新连接时触发 
@Override 
public void sessionOpened(IoSession session) throws Exception { 
// TODO Auto-generated method stub 
System.out.println("session open for " + session.getRemoteAddress()); 
} 
@Override 
    public void sessionIdle(IoSession session, IdleStatus status) throws Exception { 
        //System.out.println("IDLE "+session.getIdleCount(status)); 
    } 
     
     
 
 
}

2、运行HelloServer
在命令行输入telnet 127.0.0.1 9123


服务器端的输出也可以看到:


 

 

声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号