介绍
本教程通过构建一个时间服务器(time server),向你展示基于MINA应用的构建过程,以下是进行本教程的先决条件:
MINA 2.x的核心包
JDK 1.5 或更高版本
SLF4J 1.3.0 或更高版本
? Log4J 1.2的用户:slf4j-api.jar, slf4j-log4j12.jar, 和 Log4J 1.2.x
? Log4J 1.3的用户:slf4j-api.jar, slf4j-log4j13.jar, 和Log4J 1.3.x
? java.util.logging的用户:slf4j-api.jar 和 slf4j-jdk14.jar
注意:请确保使用正确的slf4j-*.jar与你的日志框架相匹配。例如,slf4j-log4j12.jar和log4j-1.3.x.jar不能在一起使用,否则会引起混乱。
我已经在Windows 2000 professional 和 linux平台上测试了这个程序,如果你在运行这个程序的过程中遇到了问题,请立即联系我们的开发人员。当然,本教程尽量保持与开发环境(IDE, editors等等)无关,它可以在任何你熟悉的平台中运行。另外,为了简化,编译命令与运行脚本都没有体现,如果你需要帮助了解如何编译并运行java程序,请参考Java tutorial。
编写MINA时间服务器
首先创建一个名为MinaTimeServer.java的文件,最初的代码如下:
public class MinaTimeServer {
public static void main(String[] args) {
// code will go here next
}
}
对所有人来说,这段代码应该很简单,我们只是简单的定义了一个main方法启动这个程序。从现在开始,我们将逐步加入代码实现时间服务器。首先,我们需要一个对象用来监听到来的连接,既然我们的程序是基于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将记录所有的日志信息,例如session创建,消息接收,消息发送,消息关闭。下一个filter是ProtocolCodecFilter,其把二进制数据或是协议相关的数据转换成为一个消息对象,反之亦然。我们使用一个现有的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类必须实现 IoHandler接口。对于大多数基于MINA的应用程序,这是编程的重心,因为它将处理所有来自客户端的请求。在本教程中,我们将继承自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() );
acceptor.getSessionConfig().setReadBufferSize( 2048 );
acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );
}
}
在MinaTimeServer增加了两行新内容,这些set方法分别设置了IoHandler、输入buffer大小和session对象上的idle属性。Buffer大小告诉底层操作系统应该分配多大空间放置到来的数据;第二行指明什么时候应该检测session空闲。在setIdleTime方法中,第一参数定义当session空闲时,检测那些活动,第二个参数定义session变为空闲状态时需要经过多长的时间。
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方法,该方法用来处理在处理远程连接的过程中发生的各种异常,如果此方法没有定义,可能无法获得正确的异常报告。
exceptionCaught方法只是简单地打印出异常堆栈信息并关闭连接,对于大多数程序来说,这是标准做法,除非连接可以在异常情况下恢复。
messageReceived方法接收客户端的数据并返回当前的系统时间,如果来自客户端的消息为‘quit’,则session关闭。根据协议编解码器的不同,传入该方法的对象(第二个参数)也是不同的,该对象与调用session.write(Object)方法传入的对象相同。如果你没有指定协议编解码器,你可能接收到一个IoBuffer对象,当然,必须输出IoBuffer对象。
当session保持指定(acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 )设置的)时间的空闲时,sessionIdle方法将被调用。
剩下的就是定义server监听的地址和端口了,当然还需要启动服务器。代码如下:
import java.io.IOException;
import java.net.InetSocketAddress;
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.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
public class MinaTimeServer
{
private static final int PORT = 9123;
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() );
acceptor.getSessionConfig().setReadBufferSize( 2048 );
acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );
acceptor.bind( new InetSocketAddress(PORT) );
}
}
正如你看到的, acceptor.setLocalAddress( new InetSocketAddress(PORT) ),方法定义server将监听哪个主机和端口。最后调用IoAcceptor.bind()方法,该方法绑定端口并启动远程客户端的处理过程。
验证Time server
现在编译程序,编译完成后就可以运行并查看运行结果了。最简单的测试方式就是启动程序,并使用telnet与之建立连接:
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:~>
|
分享到:
相关推荐
Apache Mina是一个强大而灵活的网络通信框架,适用于需要快速开发高性能网络应用程序的场景。通过本手册的学习,开发者不仅能够掌握Mina的基本用法,还能够深入了解其背后的架构设计原理。这对于未来在网络编程领域...
1. **入门指南**:介绍如何搭建MINA环境,以及快速创建一个简单的MINA应用。 2. **核心概念**:解释MINA中的关键组件,如Session、Filter、ProtocolDecoder和ProtocolEncoder等。 3. **API详解**:详细阐述MINA提供...
Apache MINA 2 用户指南 Apache MINA 2 是一个基于 Java 语言的网络应用框架,旨在帮助开发者快速构建高性能、可靠、可...Apache MINA 2 用户指南提供了一个详细的指南,帮助开发者快速掌握 MINA 框架的使用和开发。
### Apache MINA 2.0 用户指南:基础知识 #### 基础概念介绍 Apache MINA 2.0 是一款高性能且易于使用的网络应用程序框架,它简化了开发人员在网络编程方面的负担,允许开发者专注于应用程序的核心功能,而不是底层...
Apache MINA 2.0是一个高性能的网络应用框架,主要用于简化网络编程,使开发者能夜快速构建可扩展、高性能的网络应用。MINA提供了基于Java NIO(New I/O)API的抽象层,让开发者能够以更简单的方式处理网络操作。本...
这个压缩包包含了MINA API文档、自学手册以及开发指南,对于学习和理解MINA框架有极大的帮助。 首先,`MINA-2.0.0-API.chm` 文件是MINA 2.0版本的API帮助文档,它是以CHM(Compiled Help Manual)格式编译的Windows...
1. **基于MINA框架快速开发网络应用程序(转载).html**:这可能是一个教程或指南,教读者如何利用MINA快速构建网络应用,可能包含基本概念、设置步骤和简单示例。 2. **Apache_Mina_Server_2.0中文参考手册V1.0.pdf*...
6. **学习和进阶**:《mina用户指南中文版》不仅介绍了基本概念,还提供了丰富的示例代码,帮助读者快速上手。对于想要深入了解Mina内部原理和技术细节的开发者,还可以参考Mina的源码和官方文档。 7. **总结**:...
1. **MINA-2.0.0-M4.chm**:这是Apache Mina 2.0.0-M4版本的离线帮助文档,通常包含详细的API参考、用户指南和开发者教程。CHM是Microsoft编写的HTML帮助文件,便于用户快速查找和理解Mina的各种类、接口和方法。 2...
**Mina 2.0 用户开发指南** Mina是一个强大且高效的开源框架,主要用于构建分布式系统和服务,尤其在开发网络应用程序时。它以其高性能、可扩展性和灵活性而闻名。Mina 2.0用户指南是为开发者提供的详尽参考资料,...
预览版的PPT文件“Mina in action-preview.ppt”可能会包含部分章节的概要、关键概念的讲解以及实例演示,帮助读者快速上手Mina框架。虽然没有详细的描述,但通常这样的预览内容足以激发读者的兴趣,并为后续深入...
这份"汉王科技面部识别终端脱机通讯开发指南V2.3.pdf"是开发者们的重要参考资料,它详细介绍了如何与这款终端进行通信并进行定制化的应用程序开发。 在开发过程中,首先需要理解的是面部识别的基本原理,这包括人脸...
2. **示例**:Mina提供的示例代码,可以帮助开发者快速理解和学习如何使用框架来构建网络应用。 3. **文档**:可能包括Javadoc和用户指南,帮助开发者更好地理解API和最佳实践。 4. **Readme-说明.htm**:通常会提供...
2. **参考文档**:在压缩包中可能包含的MINA官方文档,通常包括用户指南、API参考和开发者指南,这些文档详尽解释了MINA的核心概念、类库和方法,帮助开发者快速熟悉MINA的工作机制。 3. **教程**:教程可能是MINA...
7. **实战示例**:学习指南通常会包含实际的应用示例,帮助你快速上手并理解如何在项目中应用Mina。 通过深入学习和实践这些知识,你将能够利用Mina框架构建出高效、稳定的网络服务,应对高并发场景下的通信挑战。
- **文档**:API 文档、用户指南和开发者指南,帮助开发者快速上手和使用 MINA。 - **库依赖**:可能包含 MINA 运行所需的第三方库,如 SLF4J 日志接口、JUnit 测试框架等。 - **构建脚本**:如 Maven POM 文件,...
描述中提到的"Mina中文参考手册"对于中国开发者来说是一份宝贵的资源,它详细介绍了如何使用Apache Mina进行开发。手册可能涵盖了Mina的基本概念、架构、API使用、以及如何构建实际的应用程序等内容。对于初学者来说...
Apache MINA (Multipurpose Infrastructure for Network Applications) 是一个开源框架,主要用于简化开发高性能且易于维护的网络应用程序。MINA 提供了一种与传输协议无关的抽象层,使得开发者可以专注于业务逻辑,...
- `bin`: 可执行文件或脚本,用于快速启动Mina服务。 - `examples`: 示例代码,帮助初学者理解如何使用Mina开发应用。 通过深入学习和使用Mina提供的API,开发者可以构建出高效、稳定、可扩展的网络应用,无论是...
描述中提到“包含操作文档”,意味着除了核心库之外,压缩包可能还包含了使用和配置MINA的指南、API参考文档以及示例代码,这对于开发者来说是至关重要的资源,有助于理解和快速上手MINA框架。 Apache MINA的核心...