公司最近做的自助售货机的项目,为提高出货效率,需要用到长连接。
实现长连接的三种方式,以及他们的优缺点。
- 使用第三方的长连接服务;
- 通过NIO等方案实现长连接服务;
- 通过MINA等第三方框架实现长连接;
- 使用第三方的长连接服务
介绍:这是最简单的方式,我们可以通过接入极光推送,百度推送,友盟等第三方服务实现长连接,通过接入第三方的API我们可以很方便的接入第三方的长连接,推送服务,但是这种方式定制化程度不太好,如果对长连接服务不是要求特别高,对定制化要求不是很高的话基本可以考虑这种方式(目前主流的App都是使用第三方的长连接服务)
优势:简单,方便
劣势:定制化程度不高 - 使用NIO等方案实现长连接服务
介绍:通过NIO的方式实现长连接,这种方式对技术要求程度比较高,基本都是通过java API实现长连接,实现心跳包,实现异常情况的容错等操作,可以说通过NIO实现长连接对技术要求很高,一般如果没有成行的技术方案比建议这么做,就算实现了长连接,后期连接的维护,对电量,流量的损耗等都需要持续的优化。
优势:定制化比较高
劣势:技术要求高,需要持续的维护 - 使用MINA等第三方框架实现长连接
介绍:MINA是一个第三方的NIO框架,该框架实现了一整套的长连接机制,包括长连接的建立,心跳包的实现,异常机制的容错等。使用MINA实现长连接可以定制化的实现一些特有的功能,并且比NIO方案较为简单,因为其已经封装了一些长连接的特有机制,比如心跳包,容错等。
优势:可定制,较NIO方法简单
劣势:也需要一定的技术储备
接下来就是实践:
添加依赖
// 基于Mina封装的Socket长连接库
implementation('com.github.Jeromeer:MinaSocket:1.0') {
exclude group: 'com.android.support'
}
初始化
private static final String HOST = "192.168.0.54";
private static final int PORT = 8080;
private void initMinaSocket() {
// 初始化长连接
SocketConfig socketConfig = new SocketConfig.Builder(getApplicationContext())
.setIp(HOST)//ip
.setPort(PORT)//端口
.setReadBufferSize(10240)//readBuffer
.setIdleTimeOut(30)//客户端空闲时间,客户端在超过此时间内不向服务器发送数据,则视为idle状态,则进入心跳状态
.setTimeOutCheckInterval(10)//客户端连接超时时间,超过此时间则视为连接超时
.setRequestInterval(10)//请求超时间隔时间
.setHeartbeatRequest("发送" + "\n")//与服务端约定的发送过去的心跳包
.setHeartbeatResponse("接受" + "\n") //与服务端约定的接收到的心跳包
.builder();
ContentServiceHelper.bindService(this, socketConfig);
SessionManager.getInstance().setReceivedResponseListener(this);
}
实现监听
public class MainActivity extends AppCompatActivity implements View.OnClickListener, SocketResponseListener {
开始调用
ContentServiceHelper.sendClientMsg(mMJsonString + "\n");