慕课网视频地址:https://www.imooc.com/learn/686
1.长连接基本概念
与http短连接相反,通过某种方式与服务器一直保持连接就叫长连接
http短连接:每次与服务器通信,要先建立连接,通信,断开连接
长连接:一旦我们与服务器连接成功后,我们的连接一直保持存在,随时都可以和服务器进行通信
2.长连接的原理
底层都是基于TCP/IP协议
通过Socket,ServerSocket与服务器保持连接
服务端 一般使用ServerSocket来建立监听,监听客户端与之连接
客户端使用Socket,指定端口和IP地址,与服务端进行连接
3.长连接的意义
通过长连接,可以实现服务器主动向客户端推送消息
微信上的使用场景:微信朋友圈有新动态的时候,会用一个红点来提示,如果没有长连接,我们就会隔几秒向服务端发送一个请求,来判断是否有新的动态;我们有长连接的话,服务器可以主动给我们推送一个消息过来,这样的话我们客户端可以根据这个消息来更新我们UI即可,极大的减小了我们客户端和服务端两端的压力
通过长连接,可以减少客户端对服务器的轮询,减小服务器压力
通信效率要远高于http
http每次与服务器通信,要先建立连接,通信,断开连接,每次都要这样.即使我们效率比较高的Okhttp,他也是缓存好的一些connection对象,而我们的长连接,只要连接好,就可以随时的通信,不同频繁的请求和断开连接
4.mina相对于其他的通信框架的优势
非常适合于C/S架构的通信框架
因为我们的mina,它本身已经封装的非常好,我们在使用的时候,只需要在通信的时候调用mina的Api
完成通信,不需要关心底层的通信是如何实现的
apache出品的开源项目,值得信赖
官网上有详细的资料公开发者学习
使用起来非常的简单,降低我们的学习成本
5.mian框架整体讲解
项目工程结构如图:
通过这张图可以看出来我们的mina已经封装的特别好了,我的应用层只需要调用mina的api即可完成与服务端的通信,不需要了解内部的连接是如何的建立的
mina内部工作原理图:
这张图是双向的,我们从上往下看,首先 Remote peer代表我们的远程服务器,与我们的客户端通过IoService建立连接以后就会得到一个Session,然后我们的Session将我们的数据传递给IoFilterChain(过滤链)中,然后过滤链将数据过滤直到将符合条件的数据传递给Application layer里,我们的客户端要做的是在IoHandler中完成对数据的操作,更新UI/保存数据库
6.mina框架核心类讲解
IoService及其相关类
IoService是个接口
Responsibilities职责主要负责监听的管理,IoHandler的管理,IoSession的管理等等
IoService有一个子类AbstractIoService,它主要实现一些默认的一些方法和成员变量,他添加了默认的过滤链,默认handler,默认的线程池等等
服务器端IoAcceptor及其相关类
IoAcceptor继承IoService
SocketAcceptor 和 DatagramAcceptor继承IoAcceptor 两个接口分别一个支持UDP协议,一个支持TCP协议
NioDatagramAcceotor和NioSocketAcceptor分别是UDP和TCP协议的监听器
IoConnector及其相关类
IoConnector接口也是继承IoService接口,
DatagramConnector和SocketConnector两个接口继承IoConnector,一个支持TCP协议,一个支持UDP协议
Filter及其相关类
LoggingFilter记录mina所有日志
ProtocolCodecFilter数据转化过滤器
CompressionFilter数据压缩过滤器
SSLFilter 数据加密过滤器
通过继承IoFilterAdapter来实现自己的过滤器
IOSession类
通过IOSession类可以read() writen() close()
receive buffer size 设置接受数据缓存区大小
sending buffer size 设置数据发送缓存区大小
Idel time 设置状态恢复时间
write timeout设置写数据超时时间
Handler类讲解(我们应用层比较重要的类)
Session监听 SessionCreated/SessionOpen/sessionClosed
消息监听 messageReceived/messageSend
异常监听 exceptionCaught