`
Donald_Draper
  • 浏览: 984297 次
社区版块
存档分类
最新评论

Mina IoHandler接口定义

    博客分类:
  • Mina
阅读更多
Mina 过滤链抽象实现:http://donald-draper.iteye.com/blog/2376335
在上面这篇文章中,当IOService接收消息后,消息被过滤链上的过滤器过滤,从链头到链尾,过程如下:
//消息接收,从链头到链尾-》Iohanlder(这个过程handler处理相关事件)
public void fireMessageReceived(IoSession session, Object message) {
        Entry head = this.head;
        callNextMessageReceived(head, session, message);
}
private void callNextMessageReceived(Entry entry, IoSession session,
            Object message) {
        try {
            entry.getFilter().messageReceived(entry.getNextFilter(), session,
                    message);
        } catch (Throwable e) {
            fireExceptionCaught(session, e);
        }
}

 private static class TailFilter extends IoFilterAdapter {
   private static class TailFilter extends IoFilterAdapter {
       ...
        public void messageReceived(NextFilter nextFilter, IoSession session,
                Object message) throws Exception {
            try {
                session.getHandler().messageReceived(session, message);
            } finally {
	        //如果发送消息对象为ByteBuffer,则释放buffer
                ByteBufferUtil.releaseIfPossible(message);
            }
        }
        ...
}
}

从上可以看出IoService接收消息后,消息过滤链中的过滤器(协议解码器等)过滤后,最后交给会话handler处理,即IoHandler,今天我们来看一下IoHandler。

/**
 * Handles all I/O events fired by MINA.
 * 
 * @author The Apache MINA Project (dev@mina.apache.org)
 * @version $Rev$, $Date$
 * 
 * @see IoHandlerAdapter
 */
public interface IoHandler {
    /**
     * Invoked from an I/O processor thread when a new connection has been created.
     * Because this method is supposed to be called from the same thread that
     * handles I/O of multiple sessions, please implement this method to perform
     * tasks that consumes minimal amount of time such as socket parameter
     * and user-defined session attribute initialization.
     当一个新的连接创建时,有IO处理器线程调用此方法。由于此方法可以被相同的线程调用,
     处理多个会话IO,所以实现此方法时,执行任务时,尽量消耗尽少的时间,比如做一些Socket参数配置,
     用户自定义的会话属性
     */
    void sessionCreated(IoSession session) throws Exception;

    /**
     * Invoked when a connection has been opened.  This method is invoked after
     * {@link #sessionCreated(IoSession)}.  The biggest difference from
     * {@link #sessionCreated(IoSession)} is that it's invoked from other thread
     * than an I/O processor thread once thread modesl is configured properly.
     当一个连接打开时调用此方法。此方法在会话创建后调用。与会话创建方法不同的是,
     一旦线程模型配置,会话打开被其他线程调用,而不是IO处理器。
     */
    void sessionOpened(IoSession session) throws Exception;

    /**
     * Invoked when a connection is closed.当连接关闭时,调用。
     */
    void sessionClosed(IoSession session) throws Exception;

    /**
     * Invoked with the related {@link IdleStatus} when a connection becomes idle.
     * This method is not invoked if the transport type is UDP; it's a known bug,
     * and will be fixed in 2.0.
     当连接空闲时,sessionIdle方法被相关空闲状态调用。如果传输接口为UDP,此方法不会调用,
     这是一个已知的bug,在2.0版本修复
     */
    void sessionIdle(IoSession session, IdleStatus status) throws Exception;

    /**
     * Invoked when any exception is thrown by user {@link IoHandler}
     * implementation or by MINA.  If <code>cause</code> is instanceof
     * {@link IOException}, MINA will close the connection automatically.
     当用户的IO处理器抛出异常时,方法有mina调用。如果异常为IOException,mina将
     自动关闭连接。
     */
    void exceptionCaught(IoSession session, Throwable cause) throws Exception;

    /**
     * Invoked when a message is received.接收消息时,调用
     */
    void messageReceived(IoSession session, Object message) throws Exception;

    /**
     * Invoked when a message written by {@link IoSession#write(Object)} is
     * sent out.
     当消息被Io会话write方法发送出去后,调用
     */
    void messageSent(IoSession session, Object message) throws Exception;
}

//IoHandlerAdapter
/**
 * An abstract adapter class for {@link IoHandler}.  You can extend this
 * class and selectively override required event handler methods only.  All
 * methods do nothing by default. 
 * IoHandlerAdapter为IO处理器的简单实现。你可以扩展此类或重写需要关注的事件处理方法,
 默认所有方法什么都不做。
 * @author The Apache Directory Project (mina-dev@directory.apache.org)
 * @version $Rev$, $Date$
 */
public class IoHandlerAdapter implements IoHandler {
    public void sessionCreated(IoSession session) throws Exception {
        SessionUtil.initialize(session);
    }
    public void sessionOpened(IoSession session) throws Exception {
    }

    public void sessionClosed(IoSession session) throws Exception {
    }
    public void sessionIdle(IoSession session, IdleStatus status)
            throws Exception {
    }
    public void exceptionCaught(IoSession session, Throwable cause)
            throws Exception {
        if (SessionLog.isWarnEnabled(session)) {
            SessionLog.warn(session, "EXCEPTION, please implement "
                    + getClass().getName()
                    + ".exceptionCaught() for proper handling:", cause);
        }
    }
    public void messageReceived(IoSession session, Object message)
            throws Exception {
    }
    public void messageSent(IoSession session, Object message) throws Exception {
    }
}
0
0
分享到:
评论

相关推荐

    spring+mina实现http接口服务端通信客户端

    Mina的IoHandler接口需要实现,用于处理接收到的网络事件。 4. **编写IoHandler**:IoHandler是Mina的核心组件,负责处理网络连接的建立、数据的读写以及连接的关闭等事件。在这个项目中,IoHandler应该能够解析从...

    java-mina通信框架详解.docx

    IoFilter接口定义了一组拦截器,用于实现如日志、黑名单过滤和数据编码解码等功能。数据的编码和解码是使用Mina时最核心的部分,因为它涉及到数据在网络中的传输格式。 IoHandler接口是编写业务逻辑的地方,接收和...

    mina2学习笔记

    - 设计IoHandler接口的实现类,处理连接建立、关闭以及数据读写事件。 ##### 第四步:使用telnet命令测试服务端 - 通过telnet命令工具,向服务端发送数据并接收响应,验证服务端功能是否正常。 ##### 第五步:...

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

    IoHandler接口定义了服务器和客户端之间的通信回调方法,如onMessageReceived、onSessionCreated等。这些方法会在特定的网络事件发生时被调用,从而实现业务逻辑。 **5. 长连接与短连接** 在Mina中,开发者可以...

    apache-mina-2.0.4.rar_apache mina_mina

    3. **IoHandler**:IoHandler是处理网络事件的主要接口,如连接建立、数据接收、连接关闭等。你可以实现这个接口来定义你的业务逻辑。 4. **ProtocolCodec**:为了处理不同协议的数据编码和解码,Mina提供了...

    Mina官方教程_中文版.rar

    开发者可以通过实现IoHandler接口来定义这些事件的处理逻辑。 四、Mina的开发步骤 1. 创建IoAcceptor或IoConnector:根据需求创建服务器端的接受器或客户端的连接器。 2. 配置Filter链:设置过滤器,以处理数据传输...

    Mina2.0学习笔记(修订版)

    IoHandler接口定义了处理网络事件的方法集,如连接打开、关闭、异常处理和消息接收/发送。它是Mina框架中业务逻辑的核心载体。 #### 三、Mina与NIO的深度解析 **NIO分析** Mina充分利用了Java NIO技术,对比传统的...

    Mina 实例 包含jar包

    4. **Handler**: IoHandler接口定义了处理网络事件的方法,如连接建立、数据到达和断开连接等。 在压缩包中的"Mina例子",可能是以源码形式提供的一系列Mina应用场景,例如简单的Echo服务、文件传输服务等。通过...

    深入理解Apache Mina

    IoHandler接口定义了处理网络事件的方法,如sessionCreated、sessionOpened、messageReceived等。Mina还提供了一些基础的IoHandler实现,如AbstractIoHandler,开发者可以根据需求继承并扩展这些基础类。 这个...

    深入理解Mina

    Mina框架通过这些类和接口提供了一个清晰的I/O处理模型,其中IoHandler接口是处理接收到的数据的核心。开发者需要实现IoHandler接口中的方法,如messageReceived()和exceptionCaught(),以便处理各种I/O事件。 深入...

    Mina 1.1.7核心代码(apache.mina.core)

    3. **IoHandler**: IoHandler接口定义了服务端接收到数据后需要执行的方法,如消息的接收和发送。它是用户实现业务逻辑的地方。 4. **IoService**: 这是MINA的服务组件,它管理IoSession并负责创建、管理和关闭它们...

    mina框架的使用

    2. **创建Server**: 实现IoHandler接口,定义服务器端的处理器,处理接收到的连接和消息。 3. **配置Acceptor**: 使用NioServerSocketAcceptor配置监听端口,设置Filter Chain和Handler。 4. **启动Server**: 启动...

    Apache Mina 2 完全自学手册

    IoHandler接口** IoHandler是Mina中的另一个核心接口,负责处理网络连接上的事件,如连接打开、关闭、读取数据、写入数据等。它定义了如何响应这些事件,是应用逻辑与网络层交互的桥梁。 #### Mina实例 虽然原...

    Mina2.0入门

    1. **事件驱动模型**:Mina使用IoHandler接口来处理网络事件,如连接建立、数据读写和连接关闭等。当这些事件发生时,IoHandler的相应方法会被调用,从而实现业务逻辑。 2. **非阻塞I/O**:Mina使用NIO(非阻塞I/O...

    mina2 cs 客户端服务器通信 已经实现完整通信代码

    - 实现IoHandler接口,定义服务器接收到消息后的处理逻辑。 - 启动Acceptor,开始监听客户端连接。 2. **创建客户端**: - 初始化Connector,指定要连接的服务器地址和端口。 - 设置IoHandler,定义客户端发送...

    mina客户端简单代码示例

    4. **创建Handler**:编写一个实现了IoHandler接口的类,该接口包含一个sessionOpened()、messageReceived()和messageSent()方法。这些方法会在连接打开、接收到消息和发送消息时被调用。 5. **事件监听**:在...

    Mina客户端示例

    4. **设置事件处理器**: 你需要实现IoHandler接口,定义当接收到数据或发生其他网络事件时的行为。 5. **建立连接**: 调用IoConnector的connect方法,传入服务器的地址和你的IoHandler实例。 6. **发送和接收数据*...

    mina的Android端全套jar

    这个module通常包含了mina的核心组件,如ProtocolCodecFactory用于编码和解码网络数据,IoHandler接口定义了网络事件的处理逻辑,IoSession对象代表一个网络会话,存储了连接状态和传输数据。 3. **Mina在Android...

    Mina2源码分析

    IoHandler接口定义了所有I/O事件的处理逻辑,包括但不限于: - `sessionCreated()`:会话创建时触发。 - `sessionOpened()`:会话打开时触发,区别于`sessionCreated()`在于调用线程的不同。 - `sessionClosed()`:...

Global site tag (gtag.js) - Google Analytics