`
zybing
  • 浏览: 457084 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

MINA Quick Start(1.1)

    博客分类:
  • Mina
阅读更多

来源:http://mina.apache.org/quick-start-guide.html

 

这篇介绍带领你浏览基于MINA程序的处理流程。这篇介绍介绍一个时间服务器。在开始前有一些准备工作:

  • MINA1.1核心
  • JDK1.5或更高
  • SLF4J1 .3.0或更高
    •   Log4j 1.2 使用者: slf4j-api.jar, slf4j-log4j12.jar, and Log4J 1.2.x
    •   Log4j 1.3 使用者: slf4j-api.jar, slf4j-log4j13.jar, and Log4J 1.3.x
    •   java.util.logging 使用者:slf4j-api.jar and slf4j-jdk14.jar
    •   重要:一定要使用正确的slf4j-*.jar和你使用的log框架版本合适
      如:slf4j-log4j12.jar and log4j-1.3.x.jar 不能再一起使用,否则会失效



我已经测试过这个程序,在Windows2000 professional,和Linux上。如果你有任何问题,请联系我们,这样可以和MINA开发者进行联系。同时,这篇介绍努力和开发平台(IDE、编辑者等)无关。这篇介绍工作环境将使你刚到舒服。为了简洁,Compilation commands and steps to execute the program 被去除了。如果你需要知道如何Compilation commands and steps to execute the program ,参考 Java tutorial

编写MINA时间服务器

 
我们将从 MinaTimeServer.java开始。

public class MinaTimeServer {

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

 这段代码对任何人都不复杂。我们简单定义了一个main函数,程序的开始。在这一点上,我们将开始增加代码,来搭建我们的服务器。

首先,我们需要一个对象,来监听所有的链接。这个程序是TCP/IP,我们增加一个SockAcceptor

import org.apache.mina.common.ByteBuffer;
import org.apache.mina.common.IoAcceptor;
import org.apache.mina.common.SimpleByteBufferAllocator;
import org.apache.mina.transport.socket.nio.SocketAcceptor;

public class MinaTimeServer {

    public static void main(String[] args) {
        // The following two lines change the default buffer type to 'heap',
        // which yields better performance.c
        ByteBuffer.setUseDirectBuffers(false);
        ByteBuffer.setAllocator(new SimpleByteBufferAllocator());

        IoAcceptor acceptor = new SocketAcceptor();
    }
}

 这里的SocketAcceptor,我们能够继续顶一个处理类(handler class),绑定SocketAcceptor到一个端口。如果你对在SocketAcceptor上增加线程模型感兴趣,请阅读Configuring Thread Model

 

我们将要增加SocketAcceptor配置。这允许我们定义socket设置,使用到所有的链接上。

import java.io.IOException;
import java.nio.charset.Charset;
import org.apache.mina.common.ByteBuffer;
import org.apache.mina.common.IoAcceptor;
import org.apache.mina.common.SimpleByteBufferAllocator;
import org.apache.mina.filter.LoggingFilter;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.SocketAcceptor;
import org.apache.mina.transport.socket.nio.SocketAcceptorConfig;

public class MinaTimeServer {

    private static final int PORT = 9123;

    public static void main(String[] args) throws IOException {
        ByteBuffer.setUseDirectBuffers(false);
        ByteBuffer.setAllocator(new SimpleByteBufferAllocator());

        IoAcceptor acceptor = new SocketAcceptor();

        SocketAcceptorConfig cfg = new SocketAcceptorConfig();
        cfg.getFilterChain().addLast( "logger", new LoggingFilter() );
        cfg.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));
    }
}

这里创建了一个SocketAcceptorConfig实例,一旦我们准备好开始启动acceptor,将传给acceptor 。

首先我们重新设置address flag。更多信息见JDK Documentation

其次我们增加一个filter给configuration。这个filter将记录所有信息,如新建一个session,收到信息,传输信息,session关闭。下一个filter是ProtocolCodecFilter。这个filter将解析2进制或者和协议相关的数据转换成对象,或者反过来。

 

最后绑定acceptor到端口。这个方法意味着启动服务器流程。不调用这个方法,服务器不会给客户连接进行服务

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.mina.common.ByteBuffer;
import org.apache.mina.common.IoAcceptor;
import org.apache.mina.common.SimpleByteBufferAllocator;
import org.apache.mina.filter.LoggingFilter;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.SocketAcceptor;
import org.apache.mina.transport.socket.nio.SocketAcceptorConfig;

public class MinaTimeServer {

    private static final int PORT = 9123;

    public static void main(String[] args) throws IOException {
        ByteBuffer.setUseDirectBuffers(false);
        ByteBuffer.setAllocator(new SimpleByteBufferAllocator());

        IoAcceptor acceptor = new SocketAcceptor();

        SocketAcceptorConfig cfg = new SocketAcceptorConfig();
        cfg.getFilterChain().addLast( "logger", new LoggingFilter() );
        cfg.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));

        acceptor.bind( new InetSocketAddress(PORT), new TimeServerHandler(), cfg);
        System.out.println("MINA Time server started.");
    }
}

定义了一个端口变量,类型为整形的,对SocketAcceptor.bind(SocketAddress, IoHandler)调用 。

第一个参数是SocketAddress,定义了网络地址,需要侦听的。

第二个参数传递的绑定方法是一个类,必须实现IoHandler接口。对已大多数使用MINA的程序,这个成为编程的主要工作(the workhorse of the program),服务于所有的客户端。对于这个介绍,我们将扩张这个IoHandlerAdapter。这个类采用adapter design pattern 来简化需要实现的IoHandler接口的代码编写。

第三个参数是configuration对象。已经配置了一个logger过滤器,编码过滤器。 MINA将每个接收到的消息都经过一些或者全部的过滤器链,在IoAcceptor中定义。这种情况下,我们将传递消息通过logging过滤器,和编码过滤器。这个logging filter将简单的采用SL4J库赖记录log,并且codec过滤器将解码每一个收到的消息,并且采用TextLineCodecFactory对每一个消息进行编码。

import java.util.Date;
import org.apache.mina.common.IdleStatus;
import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;
import org.apache.mina.common.TransportType;
import org.apache.mina.transport.socket.nio.SocketSessionConfig;

public class TimeServerHandler extends IoHandlerAdapter {
	public void exceptionCaught(IoSession session, Throwable t) throws Exception {
		t.printStackTrace();
		session.close();
	}

	public void messageReceived(IoSession session, Object msg) throws Exception {
		String str = msg.toString();
		if( str.trim().equalsIgnoreCase("quit") ) {
			session.close();
			return;
		}

		Date date = new Date();
		session.write( date.toString() );
		System.out.println("Message written...");
	}

	public void sessionCreated(IoSession session) throws Exception {
		System.out.println("Session created...");

		if( session.getTransportType() == TransportType.SOCKET )
			((SocketSessionConfig) session.getConfig() ).setReceiveBufferSize( 2048 );

        session.setIdleTime( IdleStatus.BOTH_IDLE, 10 );
	}
}
 

这里我们有了介绍程序的处理部分代码。我们重写方法:exceptionCaught、messageReceived和sessionCreated。在启动之前,这个类集成了IoHandlerAdapter,实现了Adapter design pattern

 

exceptionCaught:打印错误到strace trace, 关闭连接。对大多数程序,这是一个标准的做法,除非这个handler能够在错误状态中恢复。

 

 

messageReceived:从客户端接收到的数据,会写当前的时间给客户端。如果从客户端接收到的是quit单词,session将会被关闭。这个方法也会打印当前时间给客户端。依赖于你使用的编码,传入的对象(第二个参数)也将不同,如(Depending on the protocol codec that you use, the object (second parameter) that gets passed in to this method will be different, as well as the object that you pass in to the session.write(Object) method. 

如果你没有定义协议编码,你将接收到ByteBuffer对象,且要求协会ByteBuffer对象

 

SessionCreated:session初始化发生的时候。这种情况下,我们打印出方法进入,测试这个链接的传输协议是基于socket的(采用UDP),设置接受buffer大小。上述例子中,传入的bugger尺寸设置成2048字节。空闲时间设置成10秒。如果我们重写sessionidle方法,sessionidle方法将10秒被调用一次。

 

 

Try out the Time server 

At this point, we can go ahead and compile the program.  Once you have compiled the program you can run the program in order to test out what happens.  The easiest way to test the program is to start the program, and then telnet in to the program:

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 
Mon Apr 09 23:42:55 EDT 2007 
quit 
Connection closed by foreign host. 
user@myhost:~>
MINA Time server started. 
Session created... 
Message written...

Using MINA in restricted Java environnements

DIRMINA-659   issue rised the necessity of adding a special permission when running MINA framework in a restricted environnement like applets or Java Webstart technology. This happens when shutting down the thread pools (ExecutorService ).

In order to get it to work properly, you will need to set the following permission :

permission java.lang.RuntimePermission "modifyThread"; 

Or you can also choose to sign your code.

What's Next?

Please visit our  Documentation   page to find out more resources. You can also keep reading  other tutorials .

 

分享到:
评论

相关推荐

    Mina-1.1.7.jar

    《Mina-1.1.7.jar:Java服务器开源框架的异步并发之力》 Mina,全称为Apache Mina,是一个用Java编写的高性能网络通信框架,它为开发网络应用提供了一种简单且强大的抽象层。Mina的核心特性在于其异步事件驱动的...

    mina的高级使用,mina文件图片传送,mina发送文件,mina报文处理,mina发送xml和json

    Apache Mina是一个开源的网络通信应用框架,主要应用于Java平台,它为高性能、高可用性的网络应用程序提供了基础架构。在本文中,我们将深入探讨Mina的高级使用,特别是在文件图片传送、文件发送、XML和JSON报文处理...

    apache-mina-2.0.4.rar_apache mina_mina

    Apache Mina是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这个"apache-mina-2.0.4.rar"压缩包包含的是Apache Mina 2.0.4版本的源代码,是深入理解和定制Mina的...

    mina连接 mina心跳连接 mina断线重连

    Apache Mina是一个开源的网络通信框架,常用于构建高性能、高效率的服务端应用程序,尤其在Java平台上。在本文中,我们将深入探讨Mina的核心概念,包括连接管理、心跳机制以及断线重连策略。 首先,让我们理解"Mina...

    MINA_API+MINA_DOC+mina

    MINA (Java IO Network Application Framework) 是一个由Apache软件基金会开发的开源网络通信框架,主要应用于构建高性能、高可用性的网络服务器。这个压缩包包含了MINA API文档、自学手册以及开发指南,对于学习和...

    Mina+Socket通信

    Mina和Socket是两种常见的网络通信框架和技术,它们在Java编程环境中被广泛使用。本篇文章将深入探讨如何使用Mina与Socket实现通信,并提供客户端和服务端的实现代码概述。 Mina(全称“MINA: Minimalistic ...

    mina2.0 含11个jar包

    mina-core-2.0.0-M6.jar mina-example-2.0.0-M6.jar mina-filter-codec-netty-2.0.0-M6.jar mina-filter-compression-2.0.0-M6.jar mina-integration-beans-2.0.0-M6.jar mina-integration-jmx-2.0.0-M6.jar mina-...

    mina新手教程源码 mina+springboot+idea最简单的案例。

    mina新手案例,mina新手教程源码 mina+springboot最简单的案例。用的IDEA * mina服务端 * 1、添加@Controller注解和 @PostConstruct注解,代表启动springboot项目时也调用该类下的该方法, * 启动springboot项目...

    给予mina 协议进行大数据传输

    标题中的“给予mina协议进行大数据传输”指的是一种基于Java的网络通信框架——Apache MINA(Model-View-Controller for Network Applications)。MINA是Apache软件基金会的一个项目,它提供了一个高度可扩展和高...

    Mina开发实例(服务端、客户端)DEMO

    Apache Mina是一个高度可扩展的网络通信框架,它允许开发者创建高性能、高效率的服务端和客户端应用程序。在Java世界中,Mina以其简洁的API和灵活性而受到青睐,尤其适用于处理大量的并发连接,如TCP/IP和UDP协议。...

    mina.zip内涵所有mina所需jar包

    Apache Mina是一个高度可扩展的Java网络通信框架,它提供了简单而强大的开发接口,用于创建高性能、高效率的网络应用程序。Mina的核心理念是将网络协议处理与业务逻辑分离,使得开发者可以专注于实现应用程序的业务...

    Java springboot 整合mina 框架,nio通讯基础教程,mina框架基础教程.zip

    Java SpringBoot 整合Mina框架,涉及到的核心技术主要包括Java NIO(非阻塞I/O)、Mina框架以及SpringBoot的集成应用。本教程旨在帮助开发者深入理解和掌握这些技术,并提供了一个可直接使用的基础平台框架。 Java ...

    mina-http-2.0.7.jar.zip_mina_mina 获取POST_mina-http_mina-http-2.0

    MINA HTTP模块不仅支持HTTP 1.1,还可能包含对HTTP 2.0的部分支持,尽管标题中没有明确指出。在MINA框架下,你可以创建自定义的HTTP服务器,处理来自客户端的HTTP请求,并返回响应。 3. POST请求处理: 在HTTP协议...

    Mina案例+使用文档.pdf

    Mina有1.0.x和1.1.x两个主要分支,其中1.0.x版本适合运行在JDK 1.4环境下,而1.1.x则要求JDK 1.5或以上版本。 - **依赖库**:除了Mina的核心库(如mina-core-1.1.7.jar),还需要下载SLF4J(Simple Logging Facade ...

    mina demo mina jar包

    Apache Mina是一个开源项目,它提供了一个高度可扩展的网络通信框架,用于简化开发高性能、高可用性的网络服务器和客户端应用程序。"Mina demo mina jar包"指的是使用Apache Mina框架创建的一个演示示例,这个示例...

    mina自定义编解码器详解

    **mina自定义编解码器详解** mina是一个Java开发的网络通信框架,广泛应用于TCP和UDP协议的服务器和客户端开发。在mina框架中,编解码器(Codec)扮演着至关重要的角色,它负责将应用层的数据转换为网络传输的字节...

    spring boot 整合mina 串口

    **Spring Boot 整合Mina实现串口通信详解** 在Java开发中,有时我们需要与硬件设备进行串口通信,例如读取传感器数据或控制工业设备。Spring Boot作为一款轻量级的框架,使得快速构建应用变得简单。而Mina则是一款...

    springboot 深度整合mina开箱即用

    在本文中,我们将深入探讨如何将Spring Boot与Mina进行深度整合,以便为新手开发者提供一个开箱即用的解决方案。Spring Boot以其简洁的配置和快速的开发体验,已经成为Java领域中的主流微服务框架,而Mina则是一个...

    mina客户端简单代码示例

    Apache Mina是一个开源的网络通信框架,主要用于简化Java应用程序与远程服务器之间的通信。它提供了高度可扩展和高性能的网络协议处理能力,支持多种传输层协议,如TCP/IP、UDP/IP和SSL/TLS等。在本示例中,我们关注...

    mina心跳包机制

    mina心跳包机制是Apache Mina框架中的一个关键特性,它用于维持网络连接的活跃状态,确保数据能够在客户端和服务端之间顺畅地传输。Mina是一个高度可扩展的Java网络应用框架,广泛应用于各种分布式系统和网络服务,...

Global site tag (gtag.js) - Google Analytics