概述
Mina各组件介绍
上一篇文章已经系统的介绍了Mina的运行流程,Apache推出的Mina性能上很是高效,上章节我们知道内部有很多的类,各个类之间的依赖也是很多,他们之家都是相互依赖。
下面主要看看各个类中的方法。本篇就当是Mina的文档了。一下总结来源于网络:
IoService
- 这个接口是服务端IoAcceptor、客户端IoConnector 的抽象,提供IO 服务和管理IoSession的功能,它有如下几个常用的方法:
+ <font color="blue">TransportMetadata getTransportMetadata()</font>:
这个方法获取传输方式的元数据描述信息,也就是底层到底基于什么的实现,譬如:nio、apr 等。
+ <font color="blue">void addListener(IoServiceListener listener)</font>:
这个方法可以为IoService 增加一个监听器,用于监听IoService 的创建、活动、失效、空闲、销毁,具体可以参考IoServiceListener 接口中的方法,这为你参与IoService 的生命周期提供了机会。
+ <font color="blue">void removeListener(IoServiceListener listener)</font>:
这个方法用于移除上面的方法添加的监听器。
+ <font color="blue">void setHandler(IoHandler handler)</font>:
这个方法用于向IoService 注册IoHandler,同时有getHandler()方法获取Handler。
+ <font color="blue">Map<Long,IoSession> getManagedSessions()</font>:
这个方法获取IoService 上管理的所有IoSession,Map 的key 是IoSession 的id。
+ <font color="blue">IoSessionConfig getSessionConfig()</font>:
这个方法用于获取IoSession 的配置对象,通过IoSessionConfig 对象可以设置Socket 连接的一些选项。
IoAcceptor
- IoAcceptor主要就是bind方法。之前文章已经介绍过了。这里一带而过
IoConnector
- 这个接口是TCPClient 的接口, 主要增加了ConnectFuture connect(SocketAddressremoteAddress,SocketAddress localAddress)方法,用于与Server 端建立连接,第二个参数如果不传递则使用本地的一个随机端口访问Server 端。这个方法是异步执行的,同样的,也可以同时连接多个服务端。
IoSession
这个接口用于表示Server 端与Client 端的连接,IoAcceptor.accept()的时候返回实例。
WriteFuture write(Object message)
用于异步写数据
CloseFuture close(boolean immediately)
这个方法用于关闭IoSession,该操作也是异步的,参数指定true 表示立即关闭,否则就在所有的写操作都flush 之后再关闭
Object setAttribute(Object key,Object value)
这个方法用于给我们向会话中添加一些属性,这样可以在会话过程中都可以使用,类似于HttpSession 的setAttrbute()方法。IoSession 内部使用同步的HashMap 存储你添加的自
定义属性。SocketAddress getRemoteAddress()
这个方法获取远端连接的套接字地址
void suspendWrite()
这个方法用于挂起写操作,那么有void resumeWrite()方法与之配对。对于read()方法同样适用
ReadFuture read()
这个方法用于读取数据, 但默认是不能使用的, 你需要调用IoSessionConfig 的setUseReadOperation(true)才可以使用这个异步读取的方法。一般我们不会用到这个方法,因为这个方法的内部实现是将数据保存到一个BlockingQueue,假如是Server 端,因为大量的Client 端发送的数据在Server 端都这么读取,那么可能会导致内存泄漏,但对于Client,可能有的时候会比较便利
IoService getService()
这个方法返回与当前会话对象关联的IoService 实例.关于TCP连接的关闭:无论在客户端还是服务端,IoSession 都用于表示底层的一个TCP 连接,那么你会发现无论是Server 端还是Client 端的IoSession 调用close()方法之后,TCP 连接虽然显示关闭, 但主线程仍然在运行,也就是JVM 并未退出,这是因为IoSession 的close()仅仅是关闭了TCP的连接通道,并没有关闭Server 端、Client 端的程序。你需要调用IoService 的dispose()方法停止Server 端、Client 端
IoSessionConfig
这个方法用于指定此次会话的配置,它有如下常用的方法
void setReadBufferSize(int size)
这个方法设置读取缓冲的字节数,但一般不需要调用这个方法,因为IoProcessor 会自动调整缓冲的大小。你可以调用setMinReadBufferSize()、setMaxReadBufferSize()方法,这样无论IoProcessor 无论如何自动调整,都会在你指定的区间
void setIdleTime(IdleStatus status,int idleTime)
这个方法设置关联在通道上的读、写或者是读写事件在指定时间内未发生,该通道就进入空闲状态。一旦调用这个方法,则每隔idleTime 都会回调过滤器、IoHandler 中的sessionIdle()方法
void setWriteTimeout(int time)
这个方法设置写操作的超时时间
void setUseReadOperation(boolean useReadOperation)
这个方法设置IoSession 的read()方法是否可用,默认是false
IoHandler
这个接口是你编写业务逻辑的地方,从上面的示例代码可以看出,读取数据、发送数据基本都在这个接口总完成,这个实例是绑定到IoService 上的,有且只有一个实例(没有给一个IoService 注入一个IoHandler 实例会抛出异常)。它有如下几个方法
void sessionCreated(IoSession session)
这个方法当一个Session 对象被创建的时候被调用。对于TCP 连接来说,连接被接受的时候调用,但要注意此时TCP 连接并未建立,此方法仅代表字面含义,也就是连接的对象IoSession 被创建完毕的时候,回调这个方法。对于UDP 来说,当有数据包收到的时候回调这个方法,因为UDP 是无连接的
void sessionOpened(IoSession session)
这个方法在连接被打开时调用,它总是在sessionCreated()方法之后被调用。对于TCP 来说,它是在连接被建立之后调用,你可以在这里执行一些认证操作、发送数据等。对于UDP 来说,这个方法与sessionCreated()没什么区别,但是紧跟其后执行。如果你每隔一段时间,发送一些数据,那么sessionCreated()方法只会在第一次调用,但是sessionOpened()方法每次都会调用
void sessionClosed(IoSession session)
对于TCP 来说,连接被关闭时,调用这个方法。对于UDP 来说,IoSession 的close()方法被调用时才会毁掉这个方法
void sessionIdle(IoSession session, IdleStatus status)
这个方法在IoSession 的通道进入空闲状态时调用,对于UDP 协议来说,这个方法始终不会被调用
void exceptionCaught(IoSession session, Throwable cause)
这个方法在你的程序、Mina 自身出现异常时回调,一般这里是关闭IoSession
void messageReceived(IoSession session, Object message)
接收到消息时调用的方法,也就是用于接收消息的方法,一般情况下,message 是一个IoBuffer 类,如果你使用了协议编解码器,那么可以强制转换为你需要的类型。通常我们都是会使用协议编解码器的, 就像上面的例子, 因为协议编解码器是TextLineCodecFactory,所以我们可以强制转message 为String 类型
void messageSent(IoSession session, Object message)
当发送消息成功时调用这个方法,注意这里的措辞,发送成功之后,也就是说发送消息是不能用这个方法的。发送消息的时机:发送消息应该在sessionOpened()、messageReceived()方法中调用IoSession.write()方法完成。因为在sessionOpened()方法中,TCP 连接已经真正打开,同样的在messageReceived()方法TCP 连接也是打开状态,只不过两者的时机不同。sessionOpened()方法是在TCP 连接建立之后,接收到数据之前发送;messageReceived()方法是在接收到数据之后发送,你可以完成依据收到的内容是什么样子,决定发送什么样的数据。因为这个接口中的方法太多,因此通常使用适配器模式IoHandlerAdapter,覆盖你所感兴趣的方法即可
IoBuffer
这个接口是对JAVA NIO 的ByteBuffer 的封装,这主要是因为ByteBuffer 只提供了对基本数据类型的读写操作,没有提供对字符串等对象类型的读写方法,使用起来更为方便,另外,ByteBuffer 是定长的,如果想要可变,将很麻烦。IoBuffer 的可变长度的实现类似于StringBuffer。IoBuffer 与ByteBuffer 一样,都是非线程安全的。本节的一些内容如果不清楚,可以参考java.nio.ByteBuffer 接口。这个接口有如下常用的方法
static IoBuffer allocate(int capacity,boolean useDirectBuffer)
这个方法内部通过SimpleBufferAllocator 创建一个实例,第一个参数指定初始化容量,第二个参数指定使用直接缓冲区还是JAVA 内存堆的缓存区,默认为false
void free()
释放缓冲区,以便被一些IoBufferAllocator 的实现重用,一般没有必要调用这个方法,除非你想提升性能(但可能未必效果明显)
IoBuffer setAutoExpand(boolean autoExpand)
这个方法设置IoBuffer 为自动扩展容量,也就是前面所说的长度可变,那么可以看出长度可变这个特性默认是不开启的
IoBuffer setAutoShrink(boolean autoShrink)
这个方法设置IoBuffer为自动收缩,这样在compact()方法调用之后,可以裁减掉一些没有使用的空间。如果这个方法没有被调用或者设置为false,你也可以通过调用shrink()方法手动收缩空间
IoBuffer order(ByteOrder bo)
这个方法设置是Big Endian 还是Little Endian,JAVA 中默认是Big Endian,C++和其他语言一般是Little Endian
IoBuffer asReadOnlyBuffer()
这个方法设置IoBuffer 为只读的
Boolean prefixedDataAvailable(int prefixLength,int maxDataLength)
这个方法用于数据的最开始的1、2、4 个字节表示的是数据的长度的情况,prefixLentgh表示这段数据的前几个字节(只能是1、2、4 的其中一个),代表的是这段数据的长度,maxDataLength 表示最多要读取的字节数。返回结果依赖于等式remaining()-prefixLength>=maxDataLength,也就是总的数据-表示长度的字节,剩下的字节数要比打算读取的字节数大或者相等
String getPrefixedString(int prefixLength,CharsetDecoder decoder)
如果上面的方法返回true,那么这个方法将开始读取表示长度的字节之后的数据,注意要保持这两个方法的prefixLength 的值是一样的。G、H两个方法在后面讲到的PrefixedStringDecoder 中的内部实现使用。IoBuffer 剩余的方法与ByteBuffer 都是差不多的,额外增加了一些便利的操作方法,例如:IoBuffer putString(String value,CharsetEncoder encoder)可以方便的以指定的编码方式存储字符串、InputStream asInputStream()方法从IoBuffer 剩余的未读的数据中转为输入流等
IoFuture
在Mina的很多操作中,你会看到返回值是XXXFuture,实际上他们都是IoFuture的子类,看到这样的返回值,这个方法就说明是异步执行的,主要的子类有ConnectFuture、CloseFuture 、ReadFuture 、WriteFuture 。这个接口的大部分操作都和java.util.concurrent.Future接口是类似的,譬如:await()、awaitUninterruptibly()等,一般我们常用awaitUninterruptibly()方法可以等待异步执行的结果返回。这个接口有如下常用的方法
IoFuture addListener(IoFutureListener<?> listener)
这个方法用于添加一个监听器, 在异步执行的结果返回时监听器中的回调方法operationComplete(IoFuture future),也就是说,这是替代awaitUninterruptibly()方法另一种等待异步执行结果的方法,它的好处是不会产生阻塞
IoFuture removeListener(IoFutureListener<?> listener)
这个方法用于移除指定的监听器
IoSession getSession()
这个方法返回当前的IoSession。举个例子,我们在客户端调用connect()方法访问Server 端的时候,实际上这就是一个异步执行的方法,也就是调用connect()方法之后立即返回,执行下面的代码,而不管是否连接成功。那么如果我想在连接成功之后执行一些事情(譬如:获取连接成功后的IoSession对象),该怎么办呢?按照上面的说明,你有如下两种办法:
加入战队
# 加入战队
微信公众号
主题
加入战队
# 加入战队
微信公众号
转载于:https://www.cnblogs.com/zhangxinhua/p/11392450.html
最后
以上就是典雅小松鼠为你收集整理的Mina各组件介绍IoServiceIoAcceptorIoConnectorIoSessionIoSessionConfigIoHandlerIoBufferIoFuture# 加入战队主题# 加入战队的全部内容,希望文章能够帮你解决Mina各组件介绍IoServiceIoAcceptorIoConnectorIoSessionIoSessionConfigIoHandlerIoBufferIoFuture# 加入战队主题# 加入战队所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复