### 前言
之前已经对`mina`实现`tcp长连接`做了些相关讲解了,大家有兴趣的话,可以参看以下链接
[MINA实现TCP长连接(一)——客户端实现](http://www.demodashi.com/demo/17198.html)
[MINA实现TCP长连接(二)——服务端实现](http://www.demodashi.com/demo/17207.html)
[MINA实现TCP长连接(三)——数据断包粘包问题](http://www.demodashi.com/demo/17208.html)
这节就让我们来了解下客户端的`断开重连`机制吧
今天涉及以下内容:
1. mina官网及实现客户端需要的jar包
2. 客户端实现重连接涉及到的几个类
3. 重连接在Activity中的使用
4. 效果图和项目结构图
先来波效果图


#### 一.mina官网及实现客户端需要的jar包
`mina`是一个通讯长连接框架,其官网如下:
[mina官网](http://mina.apache.org/)
利用`mina`实现`tcp长连接客户端`需要以下`jar`包:
```
mina-core-2.0.16.jar
slf4j-android-1.7.21.jar
slf4j-api-1.7.21.jar
```
下载地址:[mina_tcp客户端jar.zip](https://download.youkuaiyun.com/download/Burn_yourself/12542994)
大家将以上jar下载下来,然后导入到自己的项目中。
#### 二.客户端实现重连接涉及到的几个类
客户端重连的话主要涉及两个类:
- ClientReConnectListener:实现IoServiceListener接口,主要用于监听链接断开状态
- TmClientManager:其中提供断开重连的具体逻辑
#### 三.重连接在Activity中的使用
下面来看看`TmClientManager`,`TmClientConfig`等类在`Activity`中实现的断开重连通讯功能,下面贴出`TempActivity`代码:
```
/**
* Title:测试界面
* description:
* autor:pei
* created on 2020/6/2
*/
public class TempActivity extends AppCompatActivity implements View.OnClickListener{
private TextView mTv;
private Button mBtn1;
private Button mBtn2;
//声明tcp客户端操作对象和配置对象
private TmClientConfig mConfig;
private TmClientManager mTmClientManager;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_temp);
//初始化控件
initView();
//初始化数据
initData();
//设置监听
setListener();
}
/**初始化控件**/
private void initView(){
mTv=findViewById(R.id.tv);
mBtn1=findViewById(R.id.btn1);
mBtn2=findViewById(R.id.btn2);
}
/**初始化数据**/
private void initData() {
//初始化tcp配置
mConfig = new TmClientConfig.Builder(TempActivity.this)
.setIp("192.168.9.104")//设置服务端ip
.setPort(9124)//设置端口(0-65535)之间
// .setConnectTimeOut(30000)//设置连接超时时间,单位毫秒,默认30000,即30秒
// .setCharsetName("UTF-8")//设置字符集,默认为 “UTF-8”
// .setReadBufferSize(2048)//设置接收数据缓存区,默认2048
.setReconnect(true)//是否开启断开重连,默认false,即关闭
.setRcDelayTime(3000)//设置重连时间间隔,默认3秒(开启断开重连后生效)
//设置mina客户端接收数据监听
.setCmrListener(new TmClientHandler.OnMessageReceivedListener() {
@Override
public void messageReceived(IoSession session, Object message) {
//接收服务端消息
//......
LogUtil.i("======我是服务端返回消息==message=" + message.toString());
runOnUiThread(new Runnable() {
@Override
public void run() {
mTv.setText(message.toString());
}
});
}
}).build();
//初始化操作对象
mTmClientManager = new TmClientManager(mConfig);
}
/**设置监听**/
private void setListener(){
mBtn1.setOnClickListener(this);
mBtn2.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn1://测试1
LogUtil.i("=======测试====1===");
test();
break;
case R.id.btn2://测试2
String result="我是中国人啊你是谁,我是亚瑟,你知道么,大家好一切都号";
String result1="abc";
//给服务端发送消息
SessionManager.getInstance().writeToServer(result1);
break;
default:
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
//断开连接
mTmClientManager.disConnect();
}
/**测试**/
private void test(){
ToastUtil.shortShow("准备连接啊");
new Thread(new Runnable() {
@Override
public void run() {
//连接服务端
mTmClientManager.connect();
}
}).start();
}
}
```
主要是
```
.setReconnect(true)//是否开启断开重连,默认false,即关闭
.setRcDelayTime(3000)//设置重连时间间隔,默认3秒(开启断开重连后生效)
```
两个参数设置实现断开重连机制。具体处理已经封装到`TmClientManager`类中了。
ok,今天的内容就介绍到这里了,谢谢大家。