`
Riddick
  • 浏览: 640350 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

MINA2 之快速上手指南

阅读更多

一、介绍

 

该教程通过构建一个time server,带你走进给予MINA的应用程序开发的大门,但在开始之前我们需要具备下面的必要条件:

  • MINA 2.x的核心包
  • JDK 1.5 或更高版本
  • SLF4J 1.3.0 或更高版本
  1. Log4J 1.2的用户:slf4j-api.jar, slf4j-log4j12.jar, and Log4J 1.2.x
  2. Log4J 1.3的用户:slf4j-api.jar, slf4j-log4j13.jar, and Log4J 1.3.x
  3. java.util.logging的用户:slf4j-api.jar and slf4j-jdk14.jar

注意:请务必确认你所使用的slf4j-*.jar要与你的日志框架相匹配。例如,slf4j-log4j12.jar 和 log4j-1.3.x.jar不能在一起使用,否则会引起混乱。
我已经在Windows 2000 professional 和 linux平台上测试了这个程序,如果你在运行这个程序的过程中遇到了问题,请立即联系我们的开发人员。

当然,这个程序是与开发环境(IDE, editors等等)无关的,它可以在任何你熟悉的平台中运行。另外,为了简化,编译命令与运行脚本都没有体现,如果你需要学习如何编译并运行java程序,请参考Java tutorial。


二、编写基于MINA框架的time server

 

我们从创建一个名为MinaTimeServer.java的文件开始,最初的代码如下:

public class MinaTimeServer { 
  
    public static void main(String[] args) { 
        // code will go here next 
    } 
} 

 

对所有人来说,这段代码应该是简单易懂的,我们只是简单的定义了一个main方法是这个程序能够正常运行起来。从现在开始,我们将逐步加入代码是其最终成为一个可用的server。首先,我们需要一个可以监听连接到来的对象,既然我们的程序是基于TCP/IP的,所以我们在程序中加入一个SocketAcceptor。

import org.apache.mina.core.service.IoAcceptor; 
import org.apache.mina.transport.socket.nio.NioSocketAcceptor; 
  
public class MinaTimeServer 
{ 
  
    public static void main( String[] args ) 
    { 
        IoAcceptor acceptor = new NioSocketAcceptor(); 
    } 
  
} 

 

加入NioSocketAcceptor之后,我们可以继续定义一个handler类,并将其与NioSocketAcceptor绑定到一个端口上。

下面,我们在配置中增加一个filter,这个filter将把二进制数据或是协议相关的数据转换成为一个消息对象,反之亦然。我们使用现有的TextLine工厂类,以为它可以处理基于文本的信息(你不需要自己来实现编解码部分)。

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 ) 
    { 
        IoAcceptor acceptor = new NioSocketAcceptor(); 
  
        acceptor.getFilterChain().addLast( "logger", new LoggingFilter() ); 
        acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" )))); 
    } 
} 

 

然后,我们定义一个handler,这个handler将对客户端的连接以及过去当前时间的请求做出服务。handler类必须实现IoHandler接口。对于大多数基于MINA的应用程序,这个操作无疑是一个很大的负担,因为它将处理客户端说有的请求。在这个教程中,我们的handler将继承自IoHandlerAdapter,这个类依照适配器模式来简化实现IoHandler接口所带来的代码量。

import java.io.IOException; 
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 
    { 
        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() ); 
    } 
} 

 

现在,我们在NioSocketAcceptor增加一些Socket相关的配置:

import java.io.IOException; 
import java.nio.charset.Charset; 
  
import org.apache.mina.core.session.IdleStatus; 
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 
    { 
        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() ); 
idle sessions 
        acceptor.getSessionConfig().setReadBufferSize( 2048 ); 
        acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 ); 
    } 
} 

 

在MinaTimeServer增加了两行新的内容,这些set方法分别设置了IoHandler、input buffer size和session对象上的idle属性。buffer size指明了底层操作系统应该给与新到来的数据分配多少空间;第二行指明了什么时候应该检测idle sessions。在setIdleTime这个方法中,第一参数指明了在检测session是否idle时,应该关心那一种活动,第二个参数指明了session变为idle状态时需要经过多长的时间。

handler的代码如下:

import java.util.Date;
   
import org.apache.mina.core.session.IdleStatus; 
import org.apache.mina.core.service.IoHandlerAdapter; 
import org.apache.mina.core.session.IoSession; 
  
public class TimeServerHandler extends IoHandlerAdapter 
{ 
    @Override 
    public void exceptionCaught( IoSession session, Throwable cause ) throws Exception 
    { 
        cause.printStackTrace(); 
    } 
  
    @Override 
    public void messageReceived( IoSession session, Object message ) throws Exception 
    { 
        String str = message.toString(); 
        if( str.trim().equalsIgnoreCase("quit") ) { 
            session.close(); 
            return; 
        } 
  
        Date date = new Date(); 
        session.write( date.toString() ); 
        System.out.println("Message written..."); 
    } 
  
    @Override 
    public void sessionIdle( IoSession session, IdleStatus status ) throws Exception 
    { 
        System.out.println( "IDLE " + session.getIdleCount( status )); 
    } 
} 

 

该类用到的方法有exceptionCaught、messageReceived和sessionIdle。在handler中,一定要定义exceptionCaught方法,该方法用来处理在远程连接中处理过程中发生的各种异常,如果这个方法没有被定义,我们可能不能发现这些异常。

在这个handler中,exceptionCaught方法只是简单地打印出异常堆栈信息并关闭连接,对于大多数程序来说,这是一种比较标准的操作,除非连接可以在异常条件下恢复。

messageReceived方法会接收客户端的数据并返回当前的的系统时间,如果从客户端接收到了消息‘quit’,则session会被关闭。与调用session.write(Object)的情况相同,不同的协议编解码器决定了传入该方法的对象(第二个参数)也是不同的。如果你没有指定协议编解码器,你最有可能接收到一个IoBuffer对象,当然,调用session.write(Object)也是一个IoBuffer对象。

当session持续idle的时间与acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 )设置的时间一致时,sessionIdle方法将被调用。

现在剩下的工作只是定义一个server监听的地址和端口了,当然还需要启动服务。代码如下:

 

import java.io.IOException; 
import java.nio.charset.Charset; 
  
import org.apache.mina.core.session.IdleStatus; 
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 
    { 
        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() ); 
idle sessions 
        acceptor.getSessionConfig().setReadBufferSize( 2048 ); 
        acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 ); 
        acceptor.setLocalAddress(new InetSocketAddress(PORT)); 
        acceptor.bind(); 
    } 
} 

 

正如你所见,这里调用了acceptor.setLocalAddress( new InetSocketAddress(PORT) );方法,该方法指明了server将在哪个IP和端口上监听。最后一步调用了IoAcceptor.bind()方法,该方法将端口与具体的客户端进程绑定在一起。

三、验证Time server

 

现在,我们编译上面的程序,编译完成后就可以运行并查看运行结果了。最简单的测试途径就是启动程序,并使用telnet与之建立连接:

 

 

Client Output

Server Output

user@myhost:~> telnet 127.0.0.1 9123
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
hello
Wed Oct 17 23:23:36 EDT 2007
quit
Connection closed by foreign host.
user@myhost:~>

MINA Time server started.
Message written...

 

四、接下来

 

获取更多资源,请浏览MINA的Documentation。你也可以阅读其他教程。

分享到:
评论

相关推荐

    MINA_API+MINA_DOC+mina

    它还可能包含示例代码,展示如何处理客户端连接、读写数据、异常处理等常见任务,让开发者能快速上手MINA服务器开发。 学习MINA API,开发者可以掌握异步网络编程的核心技巧,理解MINA如何通过事件驱动和过滤器链...

    SSI+Mina2(Struts2+Spring4+Mybatis3+Mina2)集成发布就可运行

    配置文件的详细注释是为了帮助理解和调试,使得初学者也能快速上手。 在提供的压缩包文件列表中,"ReadMe.txt"通常是包含项目说明和使用指南的文本文件,而"SSI"可能是项目源码、配置文件或者其他相关资源的目录。...

    apache_mina2收集的教程

    《Mina2.0快速入门与源码剖析》是一份快速上手指南,适合初学者。它会引导你完成Mina2的安装和基本应用开发,同时也会带你走进Mina的源码世界,帮助你理解框架内部的工作流程,这对于进一步的定制和扩展非常有帮助。...

    3本mina教程和mina帮助文档

    对于初学者来说,这是一个很好的资源,可以帮助他们快速上手并理解Mina的核心功能。 3. **Apache_Mina_Server_深入教程V1.0.pdf**:这份深入教程可能更专注于Mina的高级特性和技术,包括事件模型、NIO(非阻塞I/O)...

    Apache-Mina-2.rar_apache mina_java mina_mina_mina-core-1.1.3

    对于初学者来说,这样的文档可以帮助快速理解和上手Mina,对于有经验的开发者,它也能提供必要的参考和解决实际问题的策略。 "java_mina"标签表明这个框架是用Java语言实现的,因此具备Java的跨平台特性。Mina利用...

    mina 用户 guides

    书中还提供了大量示例代码和实践案例,帮助开发者快速上手并深入理解Mina的工作原理。 **九、中英文对照** 为了方便不同语言背景的开发者,该指南包含了中英文对照,使得全球的开发者都能无障碍地学习和使用Mina。...

    mina学习资料--很实用

    7. **实战示例**:学习指南通常会包含实际的应用示例,帮助你快速上手并理解如何在项目中应用Mina。 通过深入学习和实践这些知识,你将能够利用Mina框架构建出高效、稳定的网络服务,应对高并发场景下的通信挑战。

    Mina in Action preview

    预览版的PPT文件“Mina in action-preview.ppt”可能会包含部分章节的概要、关键概念的讲解以及实例演示,帮助读者快速上手Mina框架。虽然没有详细的描述,但通常这样的预览内容足以激发读者的兴趣,并为后续深入...

    mina用户指南中文版(waylau).zip

    6. **学习和进阶**:《mina用户指南中文版》不仅介绍了基本概念,还提供了丰富的示例代码,帮助读者快速上手。对于想要深入了解Mina内部原理和技术细节的开发者,还可以参考Mina的源码和官方文档。 7. **总结**:...

    mina库文件

    - **文档**:API 文档、用户指南和开发者指南,帮助开发者快速上手和使用 MINA。 - **库依赖**:可能包含 MINA 运行所需的第三方库,如 SLF4J 日志接口、JUnit 测试框架等。 - **构建脚本**:如 Maven POM 文件,...

    mina发布所有jar包

    描述中提到“包含操作文档”,意味着除了核心库之外,压缩包可能还包含了使用和配置MINA的指南、API参考文档以及示例代码,这对于开发者来说是至关重要的资源,有助于理解和快速上手MINA框架。 Apache MINA的核心...

    Mina 2.0.0包

    通过阅读这些文档,开发者可以快速上手并理解如何有效地使用Mina框架。 3. **示例**:Mina通常会提供一些示例代码,帮助开发者理解如何创建服务器和客户端,以及如何使用过滤器和其他高级特性。这些示例可以帮助...

    mina学习笔记

    5. 实例应用:提供了一些实际的MINA应用示例,帮助初学者快速上手。 《Mina2.0快速入门与源码剖析》这本书可能是MINA 2.0版本的指南,它可能包含以下内容: 1. 快速入门教程:针对MINA 2.0的新特性,提供快速搭建...

    Apache_Mina_Server_2.0中文参考手册

    5. **易用性**:Mina提供清晰的API和丰富的文档,使得开发者能够快速上手并进行开发。中文参考手册更是为国内开发者提供了语言上的便利,使得理解Mina的原理和用法更为容易。 6. **社区支持**:作为Apache软件基金...

    基于Java的实例源码-高性能Java网络框架 MINA.zip

    6. **丰富的社区支持**:MINA有一个活跃的社区,提供了许多示例、教程和文档,便于开发者快速上手。 **压缩包子文件的文件名称列表分析** 文件"apache-mina-2.0.5"可能包含的是MINA框架的2.0.5版本。这个版本可能...

    Mina2.0阅读源码笔记(很值得一看)

    - **QuickStart**: 快速入门指南,非常适合初学者快速上手。 - **UserGuide**: 用户指南,涵盖了 Mina 的基本概念和多个实用示例,是深入理解 Mina 功能的关键文档。 #### 二、Mina 核心概念与组件 1. **Io...

    mina高性能Java网络框架 v2.1.6.zip

    - 文档:可能包括API文档、用户指南和开发者手册,帮助用户快速上手和解决问题。 - 示例:MINA通常会提供示例项目,展示如何使用框架构建实际应用,如简单的聊天服务器或文件传输服务。 通过学习和使用Apache MINA...

    MinaDemos.rar

    "MinaDemos.rar"是一个针对MINA框架的示例集合,特别适合初学者快速上手。这个压缩包包含了客户端和服务端的代码实例,帮助开发者理解MINA的工作原理和实际应用。通过这些示例,你可以学习如何创建MINA客户端和...

    微信小程序入门全流程解析-注册到发布实战指南

    适合人群:适用于零基础或初级水平的小程序开发者,尤其是希望快速上手开发小程序的新手。 使用场景及目标:①了解小程序的基础概念和发展趋势;②掌握小程序的注册、配置和开发流程;③熟悉微信开发者工具的各项...

    camel2.2.0 手册

    为了快速上手 Apache Camel,用户可以通过阅读手册第二章的简单示例开始。对于希望更深入学习的读者,建议跳过快速入门,直接进入后续章节,这些章节将涵盖更多关于架构、企业集成模式、食谱、教程以及语言和组件...

Global site tag (gtag.js) - Google Analytics