Mina框架快速入门

2024-05-25 09:08
文章标签 入门 快速 框架 mina

本文主要是介绍Mina框架快速入门,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

翻译网址:http://mina.apache.org/mina-project/quick-start-guide.html
第一次写了一个比较正式的译文,如不好请指正~!

Mina框架快速入门
此教程将带你构建一个基于Mina的程序.它将带你构建一个时间服务器.
此教程需要以下先决条件:
  • MINA 2.0.7 Core
  • JDK 1.5 or greater
  • [SLF4J|http://www.slf4j.org/] 1.3.0 or greater
    • Log4J 1.2 users: slf4j-api.jarslf4j-log4j12.jar, and Log4J 1.2.x
    • Log4J 1.3 users: slf4j-api.jarslf4j-log4j13.jar, and Log4J 1.3.x
    • java.util.logging users: slf4j-api.jar and slf4j-jdk14.jar
    • 重要: 请确保你使用正确的 slf4j-*.jar 以匹配你的logging框架. 例如, slf4j-log4j12.jar and log4j-1.3.x.jar 不能一起使用, 会出故障.

我已经在Windows2000专业版和Linux上测试过程序.如果你运行该程序有任何问题请不要犹豫,联系我们,与Mina开发者对话.同时,这个教程一直尝试保持独立的开发环境(IDE,编辑器...等等).此教程可运行在任何你熟知的环境下。编辑指令和步进执行此程序已经因为简洁被移除。如果你需要学习如何编辑执行Java程序的帮助,请查阅此Java教程: http://docs.oracle.com/javase/tutorial/

编写MINA时间服务器
我们将以通过创建一个名叫MinaTimeServer.java的文件开始。初始代码如下:
   
  1. public class MinaTimeServer {
  2. public static void main(String[] args) {
  3. // code will go here next
  4. }
  5. }
这段代码对所有人来说应该是简单的。我们简单定义一个mian方法用来启动程序。在这点上,我们将开始添加代码以补足我们的服务器。首先,我们需要一个对象用来监听进来的连接。因为这个程序是基于TCP/IP的,所以我们将给我们的程序添加一个SocketAcceptor。
   
  1. import org.apache.mina.core.service.IoAcceptor;
  2. import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
  3. public class MinaTimeServer
  4. {
  5. public static void main( String[] args )
  6. {
  7. IoAcceptor acceptor = new NioSocketAcceptor();
  8. }
  9. }
在NioSocketAcceptor的地方,我们就可以开始定义 处理类,并将NioSocketAcceptor绑定到一个端口。

接下来,我们给配置添加一个过滤器。这个过滤器将记录所有信息,比如:新创建的会话,接收到的消息,发送过的消息,会话关闭。下一个过滤器是一个 ProtocolCodecFilter。这个过滤器将翻译二进制或 协议的 特定数据到消息对象,反之亦然。我们使用一个存在的TextLine factory(文本行工厂),因为它将为你处理文本消息(你不必再编写编码解码部分了)
   
  1. import java.nio.charset.Charset;
  2. import org.apache.mina.core.service.IoAcceptor;
  3. import org.apache.mina.filter.codec.ProtocolCodecFilter;
  4. import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
  5. import org.apache.mina.filter.logging.LoggingFilter;
  6. import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
  7. public class MinaTimeServer
  8. {
  9. public static void main( String[] args )
  10. {
  11. IoAcceptor acceptor = new NioSocketAcceptor();
  12. acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );
  13. acceptor.getFilterChain().addLast( "codec",new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));
  14. }
  15. }

这时,我们将定义处理类用以服务客户端连接和当前时间的请求。这个处理类是一个必需实现IoHandler接口的类。因为几乎所有程序都使用MINA,所以这里变成了程序的重中之重,因为它服务 所有 来自客户端进来的请求。在这个教程,我们将扩展类 IoHandlerAdapter。这个是一个适配器模式类,用以简化需要编写的代码数量,为了满足传递实现IoHandler接口的类的要求。
   
  1. import java.io.IOException;
  2. import java.nio.charset.Charset;
  3. import org.apache.mina.core.service.IoAcceptor;
  4. import org.apache.mina.filter.codec.ProtocolCodecFilter;
  5. import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
  6. import org.apache.mina.filter.logging.LoggingFilter;
  7. import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
  8. public class MinaTimeServer
  9. {
  10. public static void main( String[] args ) throws IOException
  11. {
  12. IoAcceptor acceptor = new NioSocketAcceptor();
  13. acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );
  14. acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));
  15. acceptor.setHandler( new TimeServerHandler() );
  16. }
  17. }
我们现在将添加NioSocketAcceptor配置。这允许我们给socket做特定的套接字设置,用来接收来自客户端的连接。
    
  1. import java.io.IOException;
  2. import java.nio.charset.Charset;
  3. import org.apache.mina.core.session.IdleStatus;
  4. import org.apache.mina.core.service.IoAcceptor;
  5. import org.apache.mina.filter.codec.ProtocolCodecFilter;
  6. import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
  7. import org.apache.mina.filter.logging.LoggingFilter;
  8. import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
  9. public class MinaTimeServer
  10. {
  11. public static void main( String[] args ) throws IOException
  12. {
  13. IoAcceptor acceptor = new NioSocketAcceptor();
  14. acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );
  15. acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));
  16. acceptor.setHandler( new TimeServerHandler() );
  17. acceptor.getSessionConfig().setReadBufferSize( 2048 );
  18. acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );
  19. }
  20. }
在MinaTimeServer类里有2行新的代码。这些方法设置IoHandler,输入缓冲区的大小和会话的空闲属性。
缓冲区大小 被指定是为了告诉底层操作系统 给进来的数据 分配多少空间。
第二行指定何时检查空闲的会话。在调用的setIdleTime中,第一个参数定义了当一个会话空闲了,以什么方式来检查,第二个参数定义了 会话会被认为是空闲之前的 以秒为单位的时间的长度。

处理类的代码显示如下:
    
  1. import java.util.Date;
  2. import org.apache.mina.core.session.IdleStatus;
  3. import org.apache.mina.core.service.IoHandlerAdapter;
  4. import org.apache.mina.core.session.IoSession;
  5. public class TimeServerHandler extends IoHandlerAdapter
  6. {
  7. @Override
  8. public void exceptionCaught( IoSession session, Throwable cause ) throws Exception
  9. {
  10. cause.printStackTrace();
  11. }
  12. @Override
  13. public void messageReceived( IoSession session, Object message ) throws Exception
  14. {
  15. String str = message.toString();
  16. if( str.trim().equalsIgnoreCase("quit") ) {
  17. session.close();
  18. return;
  19. }
  20. Date date = new Date();
  21. session.write( date.toString() );
  22. System.out.println("Message written...");
  23. }
  24. @Override
  25. public void sessionIdle( IoSession session, IdleStatus status ) throws Exception
  26. {
  27. System.out.println( "IDLE " + session.getIdleCount( status ));
  28. }
  29. }
在这个类中使用的方法为 exceptionCaughtmessageReceived and sessionIdle;
exceptionCaught
为了处理进程 和 处理远程连接的正常过程中出现的异常, exceptionCaught 应该总是被定义。如果这个方法没有被定义,异常可能不被及时报告。
exceptionCaught方法将简单打印错误的栈轨迹,并且关闭会话。对大部分程序来说,这个标准的做法,除非处理类能恢复这个异常条件。

messageReceived
messageReceived方法 将从客户端接收数据并写回给客户端以当前时间。如果从客户端接收的消息是单词"quit",这时 会话 将被关闭。这个方法也对客户端打印出当前时间。依靠你使用的编码解码协议,进到这个方法来的对象(第二个参数)是不同的,以及你用session.write(对象)方法传递给这个会话的对象。如果你没有做特定的编码解码协议,你将最可能接收到一个IoBuffer对象,并要求写回一个IoBuffer对象。

sessionIdle
一旦会话持续空闲 达到你调用  acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 )  指定的 总时间, sessionIdle方法  将被调用。

剩下要做的是定义 服务器要监听的 socket的地址,并实际调用以开启服务器。
代码显示如下:
   
  1. import java.io.IOException;
  2. import java.net.InetSocketAddress;
  3. import java.nio.charset.Charset;
  4. import org.apache.mina.core.service.IoAcceptor;
  5. import org.apache.mina.core.session.IdleStatus;
  6. import org.apache.mina.filter.codec.ProtocolCodecFilter;
  7. import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
  8. import org.apache.mina.filter.logging.LoggingFilter;
  9. import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
  10. public class MinaTimeServer
  11. {
  12. private static final int PORT = 9123;
  13. public static void main( String[] args ) throws IOException
  14. {
  15. IoAcceptor acceptor = new NioSocketAcceptor();
  16. acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );
  17. acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));
  18. acceptor.setHandler( new TimeServerHandler() );
  19. acceptor.getSessionConfig().setReadBufferSize( 2048 );
  20. acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );
  21. acceptor.bind( new InetSocketAddress(PORT) );
  22. }
  23. }

试验时间服务器
这时我们可以继续并编译程序。一旦你编译成功,你就可以运行这个程序,检测其会发生什么。测试这个程序最便捷的方式是启动这个程序,然后 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
Mon Apr 09 23:42:55 EDT 2007
quit
Connection closed by foreign host.
user@myhost:~>
MINA Time server started.
Session created...
Message written...
下一步?
请访问我们用户指导页http://mina.apache.org/mina-project/userguide/user-guide-toc.html,会发现更多的资源。


这篇关于Mina框架快速入门的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1001069

相关文章

shell脚本快速检查192.168.1网段ip是否在用的方法

《shell脚本快速检查192.168.1网段ip是否在用的方法》该Shell脚本通过并发ping命令检查192.168.1网段中哪些IP地址正在使用,脚本定义了网络段、超时时间和并行扫描数量,并使用... 目录脚本:检查 192.168.1 网段 IP 是否在用脚本说明使用方法示例输出优化建议总结检查 1

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte