Mina TCP传输下主要接口介绍

1IoService 

这个接口是服务端IoAcceptor客户端IoConnector的抽象,提供 IO服务和管理 IoSession的功能,它有如下几个常用的方法: 

1void addListener(IoServiceListenerlistener) 

这个方法可以为 IoService增加一个监听器,用于监听 IoService的创建、活动、失效、空闲、销毁。 

2void removeListener(IoServiceListenerlistener)这个方法用于移除上面的方法添加的监听器。 

3void setHandler( IoHandler handler) 

这个方法用于向 IoService注册 IoHandler,同时有 getHandler()方法获取 Handler 

4Map<Long,IoSession> getManagedSessions() 

这个方法获取 IoService上管理的所有 IoSessionMap key IoSession id 

5IoSessionConfig getSessionConfig () 

这个方法用于获取 IoSession的配置对象,通过IoSessionConfig对象可以设置 Socket连接的一些选项

2IoAcceptor

这个接口是 TCPServer的接口,主要增加了 voidbind()监听端口、void unbind()解除对,套接字的监听等方法。这里与传统的 JAVA中的 ServerSocket不同的是 IoAcceptor可以多次调用 bind()方法(或者在一个方法中传几个SocketAddress参数)同时监听多个端口。

3IoConnector 

这个接口是 TCPClient的接口,ConnectFutureconnect(SocketAddress remoteAddress,SocketAddresslocalAddress)方法,用于与Server端建立连接,第二个参数如果不传递则使用本地的一个随机端口访问Server端。这个方法是异步执行的,同样的,也可以同时连接多个服务端。

4,IoSession 

这个接口用于表示 Server端与 Client端的连接,IoAcceptor.accept()的时候返回实例。,这个接口有如下常用的方法: 

1WriteFuture write(Object message) 

这个方法用于写数据,该操作是异步的。 

2CloseFuture close(booleanimmediately) 

这个方法用于关闭 IoSession,该操作也是异步的,参数指定 true表示立即关闭,否则就在所有的写操作都 flush之后再关闭。 

3Object setAttribute( Objectkey,Object value) 

这个方法用于给我们向会话中添加一些属性,这样可以在会话过程中都可以使用,类似于HttpSession setAttrbute()方法。 I IoSession 内部使用同步的 HashMap存储你添加的自定义属性。 

4SocketAddress getRemoteAddress() 

这个方法获取远端连接的套接字地址。 

5void suspendWrite()

这个方法用于挂起写操作,那么有 voidresumeWrite()方法与之配对。对于 read()方法同样适用。


5IoSessionConfig

这个方法用于指定此次会话的配置,它有如下常用的方法

1void setReadBufferSize(int size)

这个方法设置读取缓冲的字节数,但一般不需要调用这个方法,因为IoProcessor会自动调整缓冲的大小。你可以调用setMinReadBufferSize()setMaxReadBufferSize()方法,这样无论 IoProcessor 无论如何自动调整,都会在你指定的区间。

2void setIdleTime(IdleStatus status,int idleTime) 

这个方法设置关联在通道上的读、写或者是读写事件在指定时间内未发生,该通道就进入空闲状态。一旦调用这个方法,则每隔idleTime都会回调过滤器、 IoHandler中的sessionIdle()方法。

3void setWriteTimeout(int time) 

这个方法设置写操作的超时时间。

4void setUseReadOperation(booleanuseReadOperation) 

这个方法设置 IoSession read()方法是否可用,默认是 false


6IoHandler

这个接口是你编写业务逻辑的地方,从上面的示例代码可以看出,读取数据、发送数据基本都在这个接口总完成,这个实例是绑定到 IoService上的,有且只有一个实例(没有给一个IoService注入一个 IoHandler实例会抛出异常)。它有如下几个方法

1void sessionCreated (IoSession session 

这个方法当一个 Session对象被创建的时候被调用。对于 TCP连接来说,连接被接受的时候调用,但要注意此时 TCP连接并未建立,此方法仅代表字面含义,也就是连接的对象IoSession被创建完毕的时候,回调这个方法。对于 UDP来说,当有数据包收到的时候回调这个方法,因为 UDP是无连接的。

2void sessionOpened( IoSessionsession) 

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

3void sessionClosed( IoSessionsession) 

对于TCP来说,连接被关闭时,调用这个方法。对于UDP来说,IoSession close()方法被调用时才会毁掉这个方法。

4void sessionIdle( IoSession session,, IdleS tatus status) 

这个方法在 IoSession的通道进入空闲状态时调用,对于 UDP协议来说,这个方法始终不会被调用。

5void exceptionCaught( IoSessionsession, Throwable cause) 

这个方法在你的程序、Mina自身出现异常时回调,一般这里是关闭 IoSession

6void messageReceived( IoSessionsession, Object message) 

接收到消息时调用的方法,也就是用于接收消息的方法,一般情况下,message是一个IoBuffer类,如果你使用了协议编解码器,那么可以强制转换为你需要的类型。通常我们都使TextLineCodecFactory,所以我们可以强制转 message String类型。

7void messageSent( ( IoSessionsession, Object message) ) 

当发送消息成功时调用这个方法,注意这里的措辞,发送成功之后,也就是说发送消息是不能用这个方法的。发送消息的时机:发送消息应该在 sessionOpened() messageReceived()方法中调用 IoSession.write()方法完成。因为只有在sessionOpened()方法中, TCP连接已经真正打开,同样的在messageReceived()方法 TCP连接也是打开状态,只不过两者的时机不同。sessionOpened()方法是在 TCP连接建立之后,接收到数据之前发送;messageReceived()方法是在接收到数据之后发送,你可以成依据收到的内容是什么样子,决定发送什么样的数据。因为这个接口中的方法太多了,因此通常使用适配器模式的oHandlerAdapter,覆盖你所感兴趣的方法即可。

7IoBuffer

这个接口是对 JAVA NIO ByteBuffer的封装,这主要是因为 ByteBuffer只提供了对基本数据类型的读写操作,没有提供对字符串等对象类型的读写方法,使用起来更为方便,另外,ByteBuffer是定长的,如果想要可变,将变得非常之麻烦。IoBuffer的可变长度的实现类似于StringBufferIoBuffer ByteBuffer一样,都是非线程安全的。本节的一些内容如果不清楚,可以参考 java.nio.ByteBuffer接口。这个接口有如下常用的方法

1static IoBuffer allocate( intcapacity ,boolean useDirectBuffer) 

这个方法内部通过SimpleBufferAllocator创建一个实例,第一个参数指定初始化容量,第二个参数指定使用直接缓冲区还是 JAVA内存堆的缓存区,默认为 false 

2void free()

释放缓冲区,以便被IoBufferAllcator的实现重用,一般没有必要调用这个方法,除非你想提升性能。

3IoBuffer setAutoExpand(booleanautoExpand) 

这个方法设置 IoBuffer为自动扩展容量,也就是前面所说的长度可变,那么可以看出长度可变这个特性默认是不开启的。 

4IoBuffer setAutoShrink(booleanautoShrink) 

这个方法设置 IoBuffer为自动收缩,这样在 compact()方法调用之后,可以裁减掉一些没有使用的空间。如果这个方法没有被调用或者设置为 false,你也可以通过调用 shrink()方法手动收缩空间。 

5IoBuffer order(ByteOrder bo) 

这个方法设置是Big Endian还是Little EndianJAVA中默认是Big EndianC++和其他语言一般是LittleEndian 

6IoBuffer asReadOnlyBuffer() 

这个方法设置 IoBuffer为只读的。 

7Boolean pr efixedDataAvailable( intprefixLength,int maxDataLength) 

这个方法用于数据的最开始的 124个字节表示的是数据的长度的情况,prefixLentgh表示这段数据的前面几个字节(只能是124的其中一个)的代表的是这段数据的长度,maxDataLength示最多要读取的字节数。返回结果依赖于等remaining()-prefixLength>=maxDataLength,也就是总的数据-表示长度的字节,剩下的字节数要比打算读取的字节数大或者相等。 

8String getPrefixedString(intprefixLength,CharsetDecoder decoder) 

如果上面的方法返回 true,那么这个方法将开始读取表示长度的字节之后的数据,注意要保持这两个方法的prefixLength的值是一样的。

注:本文参考mina api 2.0中文参考手册

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值