MINA经典入门例子----Time Server

原文地址 http://blog.sina.com.cn/s/blog_720bdf0501010b8r.html

貌似java的IO、NIO的入门例子都有相关的Time Server Demo。本例为MINA官方Demo翻译过来而已。

MINA百科:

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

  目前正在使用 MINA 的软件包括有:Apache Directory Project、AsyncWeb、AMQP(Advanced Message Queuing Protocol)、RED5 Server(Macromedia Flash Media RTMP)、ObjectRADIUS、Openfire 等等。

目前最新版本为2.02 Release,官方网站为:http://mina.apache.org/

MINA框架的特点有:基于java NIO类库开发;采用非阻塞方式的异步传输;事件驱动;支持批量数据传输;支持TCP、UDP协议;控制反转的设计模式(支持Spring);采用优雅的松耦合架构;可灵活的加载过滤器机制;单元测试更容易实现;可自定义线程的数量,以提高运行于多处理器上的性能;采用回调的方式完成调用,线程的使用更容易。 
     MINA框架的常用类 
类NioSocketAcceptor用于创建服务端监听; 
类NioSocketConnector用于创建客户端连接; 
类IoSession用来保存会话属性和发送消息; 
类IoHandlerAdapter用于定义业务逻辑,常用的方法有: 
方法 定义 
sessionCreated() 当会话创建时被触发 
sessionOpened() 当会话开始时被触发 
sessionClosed() 当会话关闭时被触发 
sessionIdle() 当会话空闲时被触发 
exceptionCaught() 当接口中其他方法抛出异常未被捕获时触发此方法 
messageRecieved() 当接收到消息后被触发 
messageSent() 当发送消息后被触发

Time Server测试示例:

测试环境:Eclipse,jdk1.6,所需jar包,slf4j-api-1.5.11.jar、slf4j-jdk14-1.5.2.jar、mina-core-2.0.2.jar。 
      1、服务器端:

1)服务器Server代码:

package org.apache.mina.example.gettingstarted.timeserver;

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() );

  // 设置buffer的长度

  acceptor.getSessionConfig().setReadBufferSize( 2048 );

  //设置连接超时时间
  acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );

  // 绑定端口

  acceptor.bind( new InetSocketAddress(PORT) );
 }
}

2)业务逻辑处理器代码:

 1 package org.apache.mina.example.gettingstarted.timeserver;
 2
 3 import java.util.Date;
 4
 5 import org.apache.mina.core.service.IoHandlerAdapter;
 6 import org.apache.mina.core.session.IdleStatus;
 7 import org.apache.mina.core.session.IoSession;
 8
 9 public class TimeServerHandler extends IoHandlerAdapter
10 {
11
12 //连接异常时处理方法
13 @Override
14 public void exceptionCaught( IoSession session, Throwable cause ) throws Exception
15 {
16 cause.printStackTrace();
17 }
18
19
20 @Override
21 public void messageReceived( IoSession session, Object message ) throws Exception
22 {
23 String str = message.toString();
24
25 if( str.trim().equalsIgnoreCase("quit") ) {
26 session.close(true);
27 return;
28 }
29
30 Date date = new Date();
31 session.write( date.toString() );
32 System.out.println("Message written...");
33 }
34
35
36 @Override
37 public void sessionIdle( IoSession session, IdleStatus status ) throws Exception
38 {
39 System.out.println( "IDLE " + session.getIdleCount( status ));
40 }
41 }

2、客户端测试代码

1)客户端代码

 1 package com.kdiller.mina;
 2
 3 import java.net.InetSocketAddress;
 4 import java.nio.charset.Charset;
 5
 6 import org.apache.mina.core.future.ConnectFuture;
 7 import org.apache.mina.filter.codec.ProtocolCodecFilter;
 8 import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
 9 import org.apache.mina.filter.logging.LoggingFilter;
10 import org.apache.mina.transport.socket.nio.NioSocketConnector;
11
12 public class MinaTimeClient {
13  public static void main(String[] args) {
14   // 创建客户端连接器.
15   NioSocketConnector connector = new NioSocketConnector();
16   connector.getFilterChain().addLast("logger", new LoggingFilter());
17   connector.getFilterChain().addLast(
18     "codec",
19     new ProtocolCodecFilter(new TextLineCodecFactory(Charset
20       .forName("UTF-8")))); // 设置编码过滤器
21   connector.setConnectTimeout(30);
22   connector.setHandler(new TimeClientHandler());// 设置事件处理器
23   ConnectFuture cf = connector.connect(new InetSocketAddress("127.0.0.1",
24     9123));// 建立连接
25   cf.awaitUninterruptibly();// 等待连接创建完成
26   cf.getSession().write("hello");// 发送消息
27   cf.getSession().write("quit");// 发送消息
28   cf.getSession().getCloseFuture().awaitUninterruptibly();// 等待连接断开
29   connector.dispose();
30  }
31 }

2)客户端处理器

 1 package com.kdiller.mina;
 2
 3 import org.apache.mina.core.service.IoHandlerAdapter;
 4 import org.apache.mina.core.session.IdleStatus;
 5 import org.apache.mina.core.session.IoSession;
 6
 7 public class TimeClientHandler extends IoHandlerAdapter {
 8  public TimeClientHandler() {
 9  }
10
11  @Override
12  public void messageReceived(IoSession session, Object message)
13    throws Exception {
14   System.out.println("messageReceived method was called!");
15   System.out.println(message);// 显示接收到的消息
16  }
17
18  @Override
19  public void exceptionCaught(IoSession session, Throwable cause)
20    throws Exception {
21   // TODO Auto-generated method stub
22   super.exceptionCaught(session, cause);
23  }
24
25  @Override
26  public void messageSent(IoSession session, Object message) throws Exception {
27   // TODO Auto-generated method stub
28   super.messageSent(session, message);
29   System.out.println("messageSent method was called!");
30   System.out.println(message);
31  }
32
33  @Override
34  public void sessionClosed(IoSession session) throws Exception {
35   // TODO Auto-generated method stub
36   super.sessionClosed(session);
37   System.out.println("sessionClosed method was called!");
38  }
39
40  @Override
41  public void sessionCreated(IoSession session) throws Exception {
42   // TODO Auto-generated method stub
43   super.sessionCreated(session);
44   System.out.println("sessionCreated method was called!");
45  }
46
47  @Override
48  public void sessionIdle(IoSession session, IdleStatus status)
49    throws Exception {
50   // TODO Auto-generated method stub
51   super.sessionIdle(session, status);
52  }
53
54  @Override
55  public void sessionOpened(IoSession session) throws Exception {
56   // TODO Auto-generated method stub
57   super.sessionOpened(session);
58   System.out.println("sessionOpened method was called!");
59  }
60
61 }
时间: 2024-10-11 06:00:04

MINA经典入门例子----Time Server的相关文章

js图片轮换经典小例子

使用js脚本实现图片轮换.图片轮播的小例子,纯js实现的,感觉不错,收藏下. 例子,js脚本实现图片轮换代码. <script type="text/javascript"> var NowFrame = 1; //初始化显示第几张 var MaxFrame = 3; //最大显示几张 function show() { for (var i = 1; i < (MaxFrame + 1); i++) { if (i == NowFrame) document.get

[转载]MongoDB开发学习 经典入门

如果你从来没有接触MongoDB或对MongoDB有一点了解,如果你是C#开发人员,那么你不妨花几分钟看看本文.本文将一步一步带您轻松入门. 阅读目录 一:简介 二:特点 三:下载安装和开启服务器 四:使用mongo.exe 执行数据库增删改查操作 五:更多命令 六:MongoDB语法与现有关系型数据库SQL语法比较 七:可视化的客户端管理工具MongoVUE 八:在C#中使用官方驱动操作MongoDB 九,在C#中使用samus驱动操作MongoDB 十:写个批处理,方便开启Mongodb服务

批处理经典入门教程!(从不懂到高手)

写这篇教程的目的,是让每一个看过这些文字的朋友记住一句话:如果爱可以让事情变的更简单,那么就让它简单吧!看这篇教程的方法 脚本之家补充说明:批处理相对来说是比较简单的语言,大家可以通过多写多看别人的实例来学习,不懂的百度一下. 这是一篇技术教程, 真心诚意会用很简单的文字表达清楚自己的意思,只要你识字就能看懂,就能学到知识.写这篇教程的目的,是让每一个看过这些文字的朋友记住一句话:如果爱可 以让事情变的更简单,那么就让它简单吧!看这篇教程的方法,就是慢!慢慢的,如同品一个女人.一杯茗茶,你会发现

【Bootstrap Demo】入门例子创建

本文简单介绍下如何来使用 Bootstrap,通过引入 Bootstrap,来实现一个最基本的入门例子. 在前一篇博文[Bootstrap]1.初识Bootstrap 基础之上,我们完全可以更加方便快捷的创建一个的简单例子.这个例子只有基本的东西:引入了预编译版的 CSS 和 JavaScript 文件,页面只包含了一个 container 元素. 在Bootstrap的官方网站的下载页面 http://getbootstrap.com/getting-started/#download ,也有

JPA入门例子

(1).JPA介绍: JPA全称为Java PersistenceAPI ,Java耐久化API是Sun公司在Java EE 5标准中提出的Java耐久化接口.JPA吸取了当前Java耐久化技能的长处,旨在标准.简化Java目标的耐久化作业.运用JPA耐久化目标,并不是依赖于某一个ORM结构.      为何要运用JAP?      在说为何要运用JPA之前,咱们有必要了解为何要运用ORM技能. ORM 是Object-Relation-Mapping,即目标联系暗射技能,是目标耐久化的中心.O

python socket编程入门(编写server实例)+send 与sendall的区别与使用方法

python 编写server的步骤: 1. 第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket( family, type ) family参数代表地址家族,可为AF_INET或AF_UNIX.AF_INET家族包括Internet地址,AF_UNIX家族用于同一台机器上的进程间通信. type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字). 2. 第二步是将socket绑定到指定地址.这

freemarker入门例子

freemarker入门例子,直接代码如下: FreeMarkerTest import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.util.ArrayList; import java.util.HashMap; import java.util.List; impor

spring mvc构建WEB应用程序入门例子

在使用spring mvc 构建web应用程序之前,需要了解spring mvc 的请求过程是怎样的,然后记录下如何搭建一个超简单的spring mvc例子. 1) spring mvc的请求经历 请求由DispatcherServlet分配给控制器(根据处理器映射),在控制器完成处理后,请求会被发送到一个视图(根据viewController解析逻辑视图) 来呈现输出结果. 整理成下图所示: 2)搭建一个简单的spring mvc例子 ①创建一个maven工程,其中pom中要有spring相关

jquery ui中的dialog,官网上经典的例子

jquery ui中的dialog,官网上经典的例子 jquery ui中dialog和easy ui中的dialog很像,但是最近用到的时候全然没有印象,一段时间不用就忘记了,这篇随笔介绍一下这个控件. 1.实例 官网源代码中给出了一些实例,首先看看实例是什么样子的. a.默认功能 也是最简单的应用,也就是打开一个对话框,代码如下 <!doctype html> <html lang="en"> <head> <meta charset=&q