mina TCP的主要接口<重要对象>(二)

mina重要对象介绍 :

IoService对象

       //IoService的常用方法
        //获取传输方式的元数据描述信息,也就是底层到底基于什么的实现,譬如:nio、apr 等。
        TransportMetadata transportMetadata = connector.getTransportMetadata();
        //增加删除一个监听器:监听IoService 的创建、活动、失效、空闲、销毁
        //参考IoServiceListener 接口中的方法,这为你参与IoService 的生命周期提供了机会
        connector.addListener(null);
        connector.removeListener(null);
        //获取IoService上管理的所有IoSession,Map的key是IoSession的id
        Map<Long ,IoSession> maps = connector.getManagedSessions();
        //获取IoSession的配置对象:读数据的缓存大小,多少秒进入空闲状态
        connector.getSessionConfig();

        //1.IoAcceptor 服务端的IoService 增加bind端口方法
        //2.IoConnector 客户端的IoService 增加connect与server建立连接

 IoSession对象

   //IoSession : 这个接口用于表示Server 端与Client 端的连接
    @Override
    public void sessionOpened(IoSession session) throws Exception {

        //这个方法用于写数据,该操作是异步的。
        session.write(values);
        //关闭IoSession,该操作也是异步的,参数指定true 表示立即关闭,否则就在所有的写操作都flush 之后再关闭。
        session.close();
        //向会话中添加一些属性,这样可以在会话过程中都可以使用,
        //类似于HttpSession 的setAttrbute()方法。IoSession 内部使用同步的HashMap 存储你添加的自定义属性。
        session.setAttribute("设置属性");
        //获取远端连接的套接字地址
        session.getRemoteAddress();
        //用于挂起写操作,那么有void resumeWrite()方法与之配对。对于read()方法同样适用。
        session.suspendWrite();
        //用于读取数据, 但默认是不能使用的, 你需要调用IoSessionConfig 的
        //setUseReadOperation(true)才可以使用这个异步读取的方法。一般我们不会用到这个方法,
        //因为这个方法的内部实现是将数据保存到一个BlockingQueue,假如是Server 端,因为大
        //量的Client 端发送的数据在Server 端都这么读取,那么可能会导致内存泄漏,但对于
        //Client,可能有的时候会比较便利。
//        session.read();
        //返回与当前会话对象关联的IoService 实例
        session.getService();

    }

关于TCP连接的关闭 :

无论在客户端还是服务端,IoSession 都用于表示底层的一个TCP 连接,那么你会发现无论是Server 端还是Client 端的IoSession 调用close()方法之后,TCP 连接虽然显示关闭, 但主线程仍然在运行,也就是JVM 并未退出,这是因为IoSession 的close()仅仅是关闭了TCP的连接通道,并没有关闭Server 端、Client 端的程序。你需要调用IoService 的dispose()方法停止Server 端、Client 端。

IoSessionConfig对象 :用于指定此次会话的配置

        //设置读取缓冲的字节数,但一般不需要调用这个方法,因为IoProcessor 会自动调
        //整缓冲的大小。你可以调用setMinReadBufferSize()、setMaxReadBufferSize()方法,这
        //样无论IoProcessor 无论如何自动调整,都会在你指定的区间。
        acceptor.getSessionConfig().setReadBufferSize(1000);
        //设置关联在通道上的读、写或者是读写事件在指定时间内未发生,该通道就进入空
        //闲状态。一旦调用这个方法,则每隔idleTime 都会回调过滤器、IoHandler 中的sessionIdle()
        //方法。
        acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
        //设置写操作的超时时间
        acceptor.getSessionConfig().setWriteTimeout(1000);
        //设置IoSession 的read()方法是否可用,默认是false。
        acceptor.getSessionConfig().setUseReadOperation(false);
        

IOHandler对象:编写业务逻辑的地方

读取数据、发送数据基本都在这个接口总完成,这个实例是绑定到IoService 上的,有且只有一个实例(没有给一个IoService 注入一个IoHandler 实例会抛出异常)

    /**
     * 接收到消息时调用的方法,也就是用于接收消息的方法,一般情况下,message 是一个 IoBuffer
     * 类,如果你使用了协议编解码器,那么可以强制转换为你需要的类型。通常我们 都是会使用协议编解码器的, 就像上面的例子, 因为协议编解码器是
     * TextLineCodecFactory,所以我们可以强制转message 为String 类型。
     */
    @Override
    public void messageReceived(IoSession session, Object message) throws Exception {
        String str = message.toString();
        // 简单打印客户端传过来的数据
        System.out.println("The message received is [" + str + "]");
        if (str.endsWith("quit")) {
            session.close(true);
            return;
        }
    }

    /**
     * 这个方法当一个Session 对象被创建的时候被调用。对于TCP 连接来说,连接被接受的时候 调用,但要注意此时TCP
     * 连接并未建立,此方法仅代表字面含义,也就是连接的对象 IoSession 被创建完毕的时候,回调这个方法。 对于UDP
     * 来说,当有数据包收到的时候回调这个方法,因为UDP 是无连接的。
     */
    @Override
    public void sessionCreated(IoSession session) throws Exception {
        System.out.println("session create");
    }

    /**
     * 在连接被打开时调用,它总是在sessionCreated()方法之后被调用。对于TCP 来
     * 说,它是在连接被建立之后调用,你可以在这里执行一些认证操作、发送数据等。 对于UDP
     * 来说,这个方法与sessionCreated()没什么区别,但是紧跟其后执行。如果你每
     * 隔一段时间,发送一些数据,那么sessionCreated()方法只会在第一次调用,但是 sessionOpened()方法每次都会调用。
     */
    @Override
    public void sessionOpened(IoSession session) throws Exception {
    }

    /**
     * 对于TCP 来说,连接被关闭时,调用这个方法。 对于UDP 来说,IoSession 的close()方法被调用时才会毁掉这个方法。
     */
    @Override
    public void sessionClosed(IoSession session) throws Exception {
        System.out.println("session closed");
    }

    /**
     * 这个方法在IoSession 的通道进入空闲状态时调用,对于UDP 协议来说,这个方法始终不会 被调用。
     */
    @Override
    public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
    }

    /**
     * 这个方法在你的程序、Mina 自身出现异常时回调,一般这里是关闭IoSession。
     */
    @Override
    public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
    }

    /**
     * 当发送消息成功时调用这个方法,注意这里的措辞,发送成功之后,也就是说发送消息是不 能用这个方法的。
     */
    @Override
    public void messageSent(IoSession session, Object message) throws Exception {
    }

 发送消息的时机:

发送消息应该在sessionOpened()、messageReceived()方法中调用IoSession.write()方法完成。因为在sessionOpened()方法中,TCP 连接已经真正打开,同样的在messageReceived()方法TCP 连接也是打开状态,只不过两者的时机不同。sessionOpened()方法是在TCP 连接建立之后,接收到数据之前发送;messageReceived()方法是在接收到数据之后发送,你可以完成依据收到的内容是什么样子,决定发送什么样的数据。

因为这个接口中的方法太多,因此通常使用适配器模式的IoHandlerAdapter,覆盖你所感兴趣的方法即可。

时间: 2024-09-29 23:06:11

mina TCP的主要接口<重要对象>(二)的相关文章

类和对象(二)

对象的自身引用是面向对象程序设计语言中特有的.十分重要的一种机制.在C++中,为这种机制设立了专门的表示:this指针变量. 在类的每一个成员函数的形参表中都有一个隐含的指针变量this,该指针变量的类型就是成员函数所属类的类型. 当程序中调用类的成员函数时,this指针变量被自动初始化为发出函数调用的对象的地址. 例如: 123456789101112131415161718 #include <iostream>using namespace std;class Sample{ int x

Delphi 与 VC 共享接口和对象

我经常会用 Delphi 写一些工具和应用,为了扩展方便,大部分都会做成插件形式. 迫于某些原因,我的插件不得不用其他开发工具来完成,比如 VC. 于是有个大问题需要解决:如何让 D 和 VC 互相通信.互相操作. 最普遍的做法,无非是定义一些方法,VC 写 Dll 导出这些方法,D 载入 Dll 调用. 但问题是稍大点规模的应用,这种方式非常麻烦,也不够直观. 于是花了点时间研究 D 和 VC 之间共享接口和对象的一些方法,现将要点共享发布出来,希望对大家有用. 基础事项: 在 D 和 VC

《图解tcp/ip》读书笔记(二)

<图解tcp/ip>读书笔记(二) 本周主要阅读的是本书的第三章--数据链路. 当然了,从某些角度讲,我认为这一章就是计算机网络的最基本的内容之一.整章讲述了数据链路层的作用和相关技术,主要描述了以太网.无线通信.ppp.公共网络以及其他的一些数据链路一些细节性的技术. 由于之前已经学习过相关计算机网络的课程,因此,就不再详细的记录整个阅读内容了,很多让我突破以前思维定式的一些知识,我挑一些列在下面. 其实这些知识花几分钟.几个小时,就可以得到,或者查阅互联网会得到比这本书更新的技术,但是,有

建议10:必须知道如何实现类比较器 接口实现对象排序

建议10:必须知道如何实现类比较器 所谓的比较器就只是一个接口,也只需要实现一个方法(public int CompareTo(object obj)).实现了比较器有什么用呢?除了顾名思义的可以比较两个实例的大小.还可以用来排序(比如是List集合,就直接调用.Sort()方法就可以 了.方便至极.定义Salay class: public class Salary : IComparable<Salary> { public int RMB { get; set; } public int

Swift是一个提供RESTful HTTP接口的对象存储系统

Swift是一个提供RESTful HTTP接口的对象存储系统,最初起源于Rackspace的Cloud Files,目的是为了提供一个和AWS S3竞争的服务. Swift于2010年开源,是OpenStack最初的两个项目之一.然而,在国内OpenStack圈里,不太能够听到关于Swift的声音,究其原因正如本系列的第一篇<文件系统vs对象存储——选型和趋势>)中所说的,RESTful HTTP接口的对象存储,主要为互联网应用服务,而OpenStack厂商最关心的传统行业的用户目前能够应用

Serializable接口实现对象序列化

对象序列化就是把一个对象变为二进制的数据量的一种方法,通过对象序列化可以方便地实现对象的传输或存储. class Person2 implements Serializable { private String name; // 声明name属性 private int age; // 声明age属性 public Person2(String name, int age) { // 通过构造设置内容 this.name = name; this.age = age; } public Stri

接口比对象更加抽象

接口比对象更加抽象

java 第十一天 面向对象(高级篇之接口、对象的多态性,instanceof)

接口的基本概念:接口的访问权限是public,关键字interface,子类通过implements关键字实现接口.一个子类可以同时实现多个接口. 对象的多态性: 两种体现形式:(1)方法的重载与覆写.(2)对象的多态性. 对象的多态性分两种: (1)向上转型:子类对象--→父类对象 (2)向下转型:父类对象--→子类对象 java中可以使用instanceof关键字判断对象到底是哪个类的实例 java 第十一天 面向对象(高级篇之接口.对象的多态性,instanceof),码迷,mamicod

element对象二

获取标签 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>element对象二</title> </head> <body> <ul id="ulid1"> <li>果子你要坚强</li> <li>一天不能完成的事