客户端与服务端长连接Mina框架讲解

推送的实现方式:

一:客户端不断的查询服务器,检索新内容,也就是所谓的pull 或者轮询方式。太慢可能导致某些消息的延迟,如果太快,则会大量消耗网络带宽和电池。

二:服务器又新内容时,发送一条类似短信的信令给客户端,客户端收到后从服务器中下载新内容,也就是SMS的推送方式。问题是这个方案的成本相对比较高。

三:客户端和服务器之间维持一个TCP/IP长连接,服务器向客户端push

mina这个框架的优点:

异步
无阻塞
事件驱动
支持TCP, UDP, APR, 串口
通过 过滤器(Filters)实现扩展性
同时提供协议框架

 

一、在我们工程中使用了mina框架之后,我们的工程结构可分为三层:

首先是我们的最上层 应用层User Application

然后我们应用层要和服务器进行通信的时候,调用我们的mina模块,然后我们的mina模块会根据我们的配置来去选择走tcp协议还是udp协议,还是我们的串口协议。

 

二、Mina内部工作原理:

 

远程服务器与我们的客户端通过IOService建立连接以后就会得到一个session,然后远程服务器就会发数据到我们的session,然后我们的session会将我们的数据发送到我们的ioFilterChain,也就是我们的过滤链中,过滤链会对我们的数据进行过滤,直到将符合条件的数据传到application layer应用层里,然后我们的客户端要做的是在ioHandler中完成对数据的操作,比如说我们要更新我们的UI,或者要保存数据库等等。

从这里可以看到我们客户端与服务器进行通信的时候只要经历3个步骤,

首先服务器将数据发送到session

Session将数据发送到过滤链中

过滤链将数据过滤以后,最后才将它发送到我们的客户端中。

 

 

三、Mina核心类:

 

1、ioService及其相关类:

 

其实它是一个接口

它的职责:监听的管理、ioHandler的管理、ioSession的管理等等。

它有一个子类:AbstractIoService:这个子类主要实现一些默认的方法,或者一些默认的成员变量。比如添加默认的过滤链、以及默认的handler,以及默认的线程池等等。

2、服务端最重要的一个类ioAcceptor

 

ioAcceptorioAcceptor首先继承了ioService,然后又有两个接口继承ioAcceptor,分别是SocketAcceptorDateGramAcceptor,两个接口分别支持TCPUDP协议,而最终实现他们的是NIOSocketAcceptorNIODategramAcceptor,这两个是我们编程中经常要用到的,一个呢就是真正TCP协议的监听器,另一个就是真正UDP协议的监听器。

3、IoConnector及其相关子类:

 

IoConnector也是继承了ioService接口,然后同样也是两个接口实现了IoConnector,分别是DategramConnectorSocketConnector。两个也是一个支持TCP协议,一个支持UDP协议。最终的实现类也是NIOSocketConnectorNIODategramConnector。分别与服务器进行连接。

4、Filter及其相关子类

下面介绍几个比较重要的Filter:

1) LoggingFilter记录mina所有日志。包括我们与服务器连接、断开;消息的发送和接收,等等所有的日志。

2) protocolCodecFilter数据转化过滤器。比如定义我们与服务器通信是哪一种类型的数据,如果我们是对象类型的,那么基本类型的就会被过滤掉,进而节省我们数据的传递。

3) CompressionFilter数据压缩过滤器。我们都知道我们的HTTP协议是支持 压缩的,而我们的mina也支持我们的数据压缩,可以提高数据的传输效率。

4) SSLFilter数据加密过滤器。大家知道我们的HTTPS之所以支持加密传输,就是因为它在HTTP协议和tcp协议中间增加了一层SSL协议,这层协议主要负责加密和解密数据,而我们的mina也支持通过我们的SSL协议对数据进行加密和解密。

 

5、IoSeeion类:

 

IoSeeion类与通信密切相关,它是一个状态机。首先我们与服务器进行连接的时候,如果状态变为connected连接建立,mina就会为我们返回一个ioSeeion类的对象,通过我们的ioSession类我们就可以writeread数据到我们的服务器;如果我们不想读写的时候,我们也可以close掉我们的ioSession

ioSession还有的一些功能,比如:

1)receive buffer size设置接收数据缓存区的大小。主要是防止内存溢出。

2)Sending buffer size设置数据发送缓存区的大小。主要是防止内存溢出。

3)Idel time设置状态恢复时间。在经过过久时间不读也不写的时候,我们的session会自动进入空闲状态。

4)Write timeout设置写数据超时时间。

 

 

6、Handler

Handler是应用层比较重要的一个类,我们所有的业务逻辑都要在handler中完成,handler中主要负责监听 sessionCreated/sessionOpen/sessionClosed事件的监听,以及messageReceived/messageSend事件的监听,以及异常exceptionCaught事件的监听。

 

 

发布了36 篇原创文章 · 获赞 19 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/j18874964028sss/article/details/78360506