Android客户端socket长连接通信总结

版权声明:本文为楠之枫雪的原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014614038/article/details/82421104

转载注明:https://blog.csdn.net/u014614038/article/details/82421104
最近有三个项目是做校园物联网相关的,已经完成了两个,之前的校园设备管控也是长连接通信项目,对客户端长连接通信还是有了一定的经验与心得,自此做些总结笔记之类,不讲代码里面的东西。

第一个基于socket长连接的项目是设备管控项目,刚开始并没有使用socket长连接,而是采用了定时刷新数据的方式,后面就改用socket长连接。这个项目其实是有两个服务器端,socket服务器端是直接控制教室设备的,pc的客户端也是与该服务器保持长连接通信,所以可以共用,通信数据是xml格式。后面两个项目的socket服务器设计结合了之前项目的缺点,采用的是json格式传递数据。

自己直接使用socket写通信框架,那一时间估计不大现实,所以我第一时间是看第三方的socket长连接通信的框架。第一个项目采用的是mina,后面的项目采用的是netty。

我个人对这两个通信框架并没有很深入的了解,只能讲一下我使用的大概的感受,mina应该是比较老的了,怎么说,用起来比较简单点,但是断开后没有自动重连机制,代码结构没有那么清晰,也可能是我初次长连接使用,考虑的不是很周全。netty比较新,功能更强大些,带有自动断开重连,通过添加ChannelHandler添加想要的模块,代码结构更清晰点,想数据编码解码等可以使用或者继承已有的,更加方便些,个人还是比较推荐使用netty。

下面记录下我遇到的一些问题的以及处理方式:

1.如何保持长连接通信。
通过定时发送心跳包即可,发送频率与服务器协调好,超时多久就认为断开连接,然后执行重连吧。

2.网络断开重连问题
也有可能是网络波动导致网络忽然断开或者超时了,这时检测到需要重连。重连有两种,第一在原来连接上执行重连,netty的自动重连就是在原连接上进行重连的,第二是重新建立起新的连接,我一般做法是在原来连接上尝试连接,连接超过一定次数比如20次,就执行建立新的连接。

3.传递大量数据的问题
这个需要服务器考虑进行分包,在消息头进行标识是否还有别的消息包。

4.粘包的问题
需要服务器对每个消息报进行标记,可以有两种处理方式,1.每个完整的消息报带有一个消息结束符 2.在每个消息头标识当前消息包的数据长度,根据数据长度截取。

5.熄屏后服务挂起的问题
其实不只是服务挂起,cpu都可能挂起,如果是原生系统可能还好点,这里提供我的两个解决方案:1.提供唤醒锁定把cpu保持唤醒,但是比较耗电 2.提供闹钟定时唤醒cpu,并保持短时间唤醒cpu如何执行发送心跳等操作。

6.线程切换引起的问题
我使用netty,如果不切换回主线程更新界面,会导致抛异常,服务断开,接着不断执行重连。

猜你喜欢

转载自blog.csdn.net/u014614038/article/details/82421104