`

Apache Mina的学习应用(三)

阅读更多

在客户端和服务端的中定义相关的业务逻辑类的实现:通过实现IoHandler 中实现方法,操作各种业务。

一般的开发中采用IoHandlerAdapter,通过重写部分的方法实现的相关的业务逻辑;

IoHandler

IoHandler具有以下功能

  • sessionCreated sessionCreated
  • sessionOpened sessionOpened
  • sessionClosed sessionClosed
  • sessionIdle sessionIdle
  • exceptionCaught exceptionCaught
  • messageReceived messageReceived
  • messageSent messageSent

sessionCreated事件

Session Created event is fired when a new connection is created.

会话创建事件被激发时,一个新的连接被创建。

 For TCP its the result of connection accept, and for UDP this is generated when a UDP packet is received.

对于TCP的连接其结果接受,这是为UDP时生成一个UDP数据包接收。

 This function can be used to initialize session attributes, and perform one time activities for a particular connection.

该功能可用于初始化会话属性,并执行一次活动的特定连接。

This function is invoked from the I/O processor thread context, hence should be implemented in a way that it consumes minimal amount of time, as the same thread handles multiple sessions.

调用此函数从I / O处理器线程上下文,因此应该采取一种方式,它消耗最少量的时间,相同的线程处理多个会话执行。

sessionOpened Event sessionOpened事件

Session opened event is invoked when a connection is opened.

调用的事件是打开一个连接。

Its is always called after sessionCreated event.它总是sessionCreated事件后调用。 If a thread model is configured, this function is called in a thread other than the I/O processor thread.

如果一个线程模型配置,该函数被调用的线程比I / O处理器线程等。

sessionClosed Event sessionClosed事件

Session Closed event is closed, when a session is closed.

会话关闭时,当一个会话结束。

Session cleaning activities like cash cleanup can be performed here.

sessionIdle Event sessionIdle事件

Session Idle event is fired when a session becomes idle.

会议空闲事件被激发时,会变为空闲。

 This function is not invoked for UDP transport.

此功能没有援引UDP传输。

exceptionCaught Event exceptionCaught事件

This functions is called, when an Exception is thrown by user code or by MINA.

这个函数被调用,当异常是由用户代码或MINA的异常。

The connection is closed, if its an IOException.连接关闭,如果它的一个IOException。

messageReceived Event messageReceived事件

Message Received event is fired whenever a message is received.

消息收稿事件被激发时,收到一条消息。

This is where the most of the processing of an application happens.

这就是对一个应用程序处理大部分发生。

You need to take care of all the message type you expect here.

您需要考虑所有类型的信息在这里照顾你期望。

messageSent Event messageSent事件

Message Sent event is fired, whenever a message aka response has been sent(calling IoSession.write()).消息发送的事件被激发,每当有消息又名反应已发送(呼叫IoSession.write())。

 

 

客户端的业务逻辑处理器:

源代码如下:

package cn.com.unutrip.java.opensource.mina.sumup;


import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.com.unutrip.java.opensource.mina.sumup.message.AddMessage;
import cn.com.unutrip.java.opensource.mina.sumup.message.ResultMessage;
/**
 * 
 * 处理所有I / O活动的MINA的激發。
 *  The interface is hub of all activities done at the end of the Filter Chain.
 *  该接口是在过滤器链的末端进行的所有活动的中心。 
* IoHandler has following functions IoHandler具有以下功能 
* sessionCreated  :
*  会话创建事件被激发时,一个新的连接被创建。 For TCP its the result of connection accept, and for UDP this is generated when a UDP packet is received.对于TCP的连接其结果接受,这是为UDP时生成一个UDP数据包接收。 This function can be used to initialize session attributes, and perform one time activities for a particular connection.该功能可用于初始化会话属性,并执行一次活动的特定连接。 
*This function is invoked from the I/O processor thread context, hence should be implemented in a way that it consumes minimal amount of time, as the same thread handles multiple sessions.调用此函数从I / O处理器线程上下文,因此应该采取一种方式,它消耗最少量的时间,相同的线程处理多个会话执行。 
* 
* sessionOpened  :会话开始一个连接时调用此事件,它总在sessionCreated事件后调用,如果一个线程模型配置
* 该函数被调用的的线程IoHandler。
 
* sessionClosed  : 当一个会话结束,session清理活动的活动的连接。
 
* sessionIdle  : 此方法被激发时,会变成空闲,此功能没有援引UDP传输。
 
* exceptionCaught   : 当用户代码或者mina异常是,连接关闭,如果它的一个连接IOException
* 
* messageReceived :  当接受到一个消息时被激发,对应一个应用程序的处理的大部分业务逻辑,
 
* messageSent  : 消息发送的时间被激发,
* 
*  调用的事件是打开一个连接。 Its is always called after sessionCreated event.它总是sessionCreated事件后调用。
*   If a thread model is configured, this function is called in a thread other than the I/O processor thread.
*   如果一个线程模型配置,该函数被调用的线程比I / O处理器线程等。

 * 
 * 客户端业务处理器的应用
 * 
 * @author longgangbai
 *
 */
public class ClientSessionHandler extends IoHandlerAdapter {

    private final static Logger logger = LoggerFactory.getLogger(ClientSessionHandler.class);
          
          private final int[] values;
      
          private boolean finished;
      
          public ClientSessionHandler(int[] values) {
              this.values = values;
          }
      
          public boolean isFinished() {
              return finished;
          }
          /**
           *  
           *  调用的事件是打开一个连接。 Its is always called after sessionCreated event.
           *  它总是sessionCreated事件后调用。 
           *  If a thread model is configured, this function is called in a thread other than the I/O processor thread.
           *  如果一个线程模型配置,该函数被调用的线程比I / O处理器线程等。 
           */
          @Override
          public void sessionOpened(IoSession session) {
              logger.error("ClientSessionHandler =%%%%%%%%%%%%%%%%%%%%%%%%%%%sessionOpened ");
              // send summation requests
              for (int i = 0; i < values.length; i++) {
                  AddMessage m = new AddMessage();
                  m.setSequence(i);
                  m.setValue(values[i]);
                  session.write(m);
              }
          }
          /**
           * 接受来自服务端的数据信息
           * 接受到消息事件被激发时,收到一条消息。
           *  This is where the most of the processing of an application happens.
           * 这就是对一个应用程序处理大部分发生。
           *  You need to take care of all the message type you expect here.
           *  您需要考虑所有类型的信息在这里照顾你期望。(重要的业务逻辑的写这里)
           */
          @Override
          public void messageReceived(IoSession session, Object message) {
              logger.error("ClientSessionHandler =%%%%%%%%%%%%%%%%%%%%%%%%%%%messageReceived ");
              // server only sends ResultMessage. otherwise, we will have to identify
              // its type using instanceof operator.
              ResultMessage rm = (ResultMessage) message;
              if (rm.isOk()) {
                  // server returned OK code.
                  // if received the result message which has the last sequence
                  // number,
                  // it is time to disconnect.
                  if (rm.getSequence() == values.length - 1) {
                      // print the sum and disconnect.
                      logger.error("The sum: " + rm.getValue());
                      session.close(true);
                      finished = true;
                  }
              } else {
                  // seever returned error code because of overflow, etc.
                  logger.error("Server error, disconnecting...");
                  session.close(true);
                  finished = true;
              }
          }
      
         /**
          * 发生异常时的操作
          * 当异常是由用户代码或MINA的异常。 The connection is closed, if its an IOException.连接关闭,如果它的一个IOException
          */ 
         @Override
         public void exceptionCaught(IoSession session, Throwable cause) {
            logger.error("ClientSessionHandler =%%%%%%%%%%%%%%%%%%%%%%%%%%%exceptionCaught ");
            session.close(true);
         }
}
服务端的业务逻辑处理器:

package cn.com.unutrip.java.opensource.mina.sumup;

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.com.unutrip.java.opensource.mina.sumup.message.AddMessage;
import cn.com.unutrip.java.opensource.mina.sumup.message.ResultMessage;
/**
 *  创建服务端的业务处理器
 * @author longgangbai
 *
 */
public class ServerSessionHandler extends IoHandlerAdapter{
    private static final String SUM_KEY="sum";
    private final static Logger logger=LoggerFactory.getLogger(ServerSessionHandler.class); 
    
    @Override
    public void sessionOpened(IoSession session){
 logger.error("ServerSessionHandler =%%%%%%%%%%%%%%%%%%%%%%%%%%%sessionOpened ");
 //设置Idle的时间为60秒
 session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 60);
 //初始化总的和为0 
 session.setAttribute(SUM_KEY,new Integer(0));
    }
    @Override
    public void sessionIdle(IoSession session,IdleStatus statis)
    {
 logger.error("ServerSessionHandler =%%%%%%%%%%%%%%%%%%%%%%%%%%%sessionIdle ");
 logger.info("Disconnecting the idle.");
 // disconnect an idle client
 session.close(true);

    }
    
     @Override
     public void exceptionCaught(IoSession session, Throwable cause) {
  logger.error("ServerSessionHandler =%%%%%%%%%%%%%%%%%%%%%%%%%%%exceptionCaught ");
         // close the connection on exceptional situation
          session.close(true);
      }

     @Override
    public void messageReceived(IoSession session ,Object message){
  logger.error("ServerSessionHandler =%%%%%%%%%%%%%%%%%%%%%%%%%%%messageReceived ");
  //客户端发送的对象必须住注册的对象一致
 AddMessage am=(AddMessage)message;
 //将客户端的发送的数据添加到当前总的金额中
 int sum=(Integer)session.getAttribute(SUM_KEY);
 int value=am.getValue();
 long expectedsum=(long)sum+value;
 
 if(expectedsum>Integer.MAX_VALUE||expectedsum<Integer.MIN_VALUE)
 {
     //
     ResultMessage rm=new ResultMessage();
     rm.setSequence(am.getSequence());
     rm.setOk(false);
     session.write(rm);
 }else{
      sum=(int)expectedsum;
      session.setAttribute(SUM_KEY,new Integer(sum));
      ResultMessage rm=new ResultMessage();
      rm.setSequence(am.getSequence());
      rm.setOk(true);
      rm.setValue(sum);
      session.write(rm);
 }
    }

}

 

 文章尚未写完,请关注下文。

分享到:
评论
1 楼 futrueboy 2011-10-27  
如果你发到网上来,请翻译的好点

相关推荐

    apache-mina-2.0.4架包及源码各pdf学习教程

    apache-mina-2.0.4 架包 源码 学习教程.apache mina是Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序...

    Apache MINA使用案例源代码

    Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的...

    Apache_Mina2.0学习笔记

    最近使用Mina开发一个Java的NIO服务端程序,因此也特意学习了Apache的这个Mina框架。 引言 1 一. Mina入门 2 第一步.下载使用的Jar包 2 第二步.工程创建配置 2 第三步.服务端程序 3 第四步.客户端程序 6 第五步.长...

    Apache Mina Server 2.0 参考手册

    Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能、高...

    Apache Mina Server 2.0 中文参考手册

    帮助你快速学习Mina框架,Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于 TCP/IP、UDP/IP协议栈的通信框架。Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用。

    Apache-Mina-Server-2.0中文参考手册V1.0.docx

    Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于 TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供 JAVA 对象的序列化服务、虚拟机管道通信服务等), Mina 可以帮助我们快速开发高性能、高...

    Apache_Mina2.0学习笔记(初版).doc

    Apache的Mina(Multipurpose Infrastructure Networked Applications)是一个网络应用框架,可以帮助用户开发高性能和高扩展性的网络应用程序;它提供了一个抽象的、事件驱动的异步API,使Java NIO在各种传输协议...

    Mina所需要的第三方jar

    学习Mina所需要的第三方jar。Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以...

    mina实例、资源包、学习文档

    最近使用Mina开发一个Java的NIO服务端程序,因此也特意学习了Apache的这个Mina框架。 首先,Mina是个什么东西?看下官方网站(http://mina.apache.org/)对它的解释: Apache的Mina(Multipurpose Infrastructure ...

    mina开发示例

    最近使用Mina开发一个Java的NIO服务端程序,因此也特意学习了Apache的这个Mina框架。 首先,Mina是个什么东西?看下官方网站(http://mina.apache.org/)对它的解释: Apache的Mina(Multipurpose Infrastructure ...

    mina2.0初学教程

    最近使用Mina开发一个Java的NIO服务端程序,因此也特意学习了Apache的这个Mina框架。 首先,Mina是个什么东西?看下官方网站(http://mina.apache.org/)对它的解释: Apache的Mina(Multipurpose Infrastructure ...

    Mina2.0学习笔记(完整版).doc

    Apache的Mina(Multipurpose Infrastructure Networked Applications)是一个网络应用框架,可以帮助用户开发高性能和高扩展性的网络应用程序;它提供了一个抽象的、事件驱动的异步API,使Java NIO在各种传输协议...

    mina带心跳长链接+socket长链接+线程池

    mina带心跳长链接,可实现服务间通信。socket长连接实现客户端与服务端的通信。对于通信技术学习是非常好的资料。改造后可实现企业应用

    neowal1:my_first_github_project

    阿帕奇骆驼 是一个强大的开源集成框架,它基于具有强大Bean集成的已知企业集成模式。... 无论使用哪种传输方式,Apache Camel都可以使您使用相同的API,因此,一旦学习了API,便可以与现成提供的所有组

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    根据仿人人客户端教程,编程实现Demo(四)---个人主页的实现(已完结)

    我的下个Demo准备仿照网上的QQ以及微信的DEmo,根据Apache-mina 开源Socket框架,实现一个简易的聊天交互软件。。。 特别注意:由于Demo里面用的是测试帐号,所以,如果要Demo成功运行,需要自己去人人开发者网站上面...

    JAVA上百实例源码以及开源项目

    笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此...

Global site tag (gtag.js) - Google Analytics