热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

javamina长连接_MINA实现TCP长连接(一)——客户端实现

###前言之前已经讲过了Netty实现的UDP通讯。大家感兴趣的可以参考以下文章:[Netty实现UDP客户端](http:www.demodashi.comdemo

### 前言

之前已经讲过了`Netty`实现的`UDP`通讯。大家感兴趣的可以参考以下文章:

[Netty实现UDP客户端](http://www.demodashi.com/demo/17159.html)

[Netty实现UDP服务端](http://www.demodashi.com/demo/17160.html)

那么今天给大家介绍一个新的通讯框架——`MINA`,之所以要介绍`mina`,是因为它在通讯`长连接`方面有比较大的优势。今天就让我们来了解下`mina`利用`tcp`实现`长连接客户端`吧。

今天涉及以下内容:

1. mina官网及实现客户端需要的jar包

2. mina客户端的几个类

3. TmClientManager在activity中的使用

4. 通讯前提及需要注意的问题

5. 效果图和项目结构图

先来波效果图

![效果图.gif](/contentImages/image/20200623/cR0vcxzpG4oyZaqeo9l.gif)

#### 一. 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.csdn.net/download/Burn_yourself/12542994)

大家将以上jar下载下来,然后导入到自己的项目中。

#### 二.mina客户端的几个类

实现`mina`长连接客户端我写了几个类,这几个类分工处理通讯的各个环节,下面对它们进行一个简单的介绍:

- SessionManager:客户端用于收发消息的`session`,此类单例,利用它可以向服务端发送消息

- TmClientHandler:客户端实际接收消息类,服务端返回消息及客户端发送的消息均要经过此类

- TmClientManager:客户端连接操作对象,封装tcp连接的`建立连接`、`断开连接`方法

- TmClientConfig:客户端连接配置类。主要用于设置连接参数,然后接收服务端返回数据

其中`SessionManager`采用单例模式实现,`TmClientConfig`采用建造者模式

#### 三.TmClientManager在activity中的使用

`mina`客户端的使用流程大致如下:

```

//声明tcp客户端操作对象和配置对象

private TmClientConfig mConfig;

private TmClientManager mTmClientManager;

/**初始化数据**/

private void initData(){

//初始化tcp配置

mConfig=new TmClientConfig.Builder(TempActivity.this)

.setIp("192.168.50.152")//设置服务端ip

.setPort(9124)//设置端口(0-65535)之间

// .setConnectTimeOut(30000)//设置连接超时时间,单位毫秒,默认30000,即30秒

// .setCharsetName("UTF-8")//设置字符集,默认为 “UTF-8”

// .setReadBufferSize(2048)//设置接收数据缓存区,默认2048

//设置mina客户端接收数据监听

.setCmrListener(new TmClientHandler.OnMessageReceivedListener() {

@Override

public void messageReceived(IoSession session, Object message) {

//接收服务端消息

//......

LogUtil.i("======我是服务端返回消息==message="+message.toString());

}

}).build();

//初始化操作对象

mTmClientManager=new TmClientManager(mConfig);

}

//给服务端发送消息

SessionManager.getInstance().writeToServer("abc");

//断开连接

mTmClientManager.disConnect();

```

下面来看看`activity`中的使用示例吧:

```

/**

* 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.50.152")//设置服务端ip

.setPort(9124)//设置端口(0-65535)之间

// .setConnectTimeOut(30000)//设置连接超时时间,单位毫秒,默认30000,即30秒

// .setCharsetName("UTF-8")//设置字符集,默认为 “UTF-8”

// .setReadBufferSize(2048)//设置接收数据缓存区,默认2048

//设置mina客户端接收数据监听

.setCmrListener(new TmClientHandler.OnMessageReceivedListener() {

@Override

public void messageReceived(IoSession session, Object message) {

//接收服务端消息

//......

LogUtil.i("======我是服务端返回消息==message="+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

//给服务端发送消息

SessionManager.getInstance().writeToServer("abc");

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();

}

}

```

#### 四.通讯前提及需要注意的问题

需要注意的问题主要有:

- 项目的`manifast.xml`中要加网络权限,若涉及到其他权限的话,也要注意添加

- 服务端与客户端要使用相同的`字符集编码`,防止通讯过程中出现发送和接收数据乱码

- 客户端与服务端通讯不通的话,可以考虑从以下几个方面排查(包括单不限于):

```

1. mina_tcp客户端与服务端链接地址(ip)不一致

2. mina_tcp客户端与服务端链接端口(port)不一致

3. mina_tcp服务端未开启

4. mina_tcp客户端未联网或未开联网权限

5. mina_tcp客户端与服务端不在一个网段

```

#### 五. 效果图和项目结构图

![效果图.gif](/contentImages/image/20200623/cR0vcxzpG4oyZaqeo9l.gif)

项目结构图如下:

![image.png](/contentImages/image/20200623/r8FU9McIm7jHrM6y4iL.png)

ok,今天的内容就到这里了,谢谢大家。



推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • Jmeter对RabbitMQ压力测试
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Jmeter对RabbitMQ压力测试相关的知识,希望对你有一定的参考价值。Jm ... [详细]
  • android ... [详细]
  • 开发笔记:SpringBoot学习开发web应用
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了SpringBoot学习开发web应用相关的知识,希望对你有一定的参考价值。SpringBoot ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • Jboss的EJB部署描述符standardjaws.xml配置步骤详解
    本文详细介绍了Jboss的EJB部署描述符standardjaws.xml的配置步骤,包括映射CMP实体EJB、数据源连接池的获取以及数据库配置等内容。 ... [详细]
  • 使用freemaker生成Java代码的步骤及示例代码
    本文介绍了使用freemaker这个jar包生成Java代码的步骤,通过提前编辑好的模板,可以避免写重复代码。首先需要在springboot的pom.xml文件中加入freemaker的依赖包。然后编写模板,定义要生成的Java类的属性和方法。最后编写生成代码的类,通过加载模板文件和数据模型,生成Java代码文件。本文提供了示例代码,并展示了文件目录结构。 ... [详细]
  • 在工作中,遇到需要将excel表中的特定数据提取出来,并将数据以键值对的形式存储到map集合中。因为我用的是maven管理的jar包,所 ... [详细]
  • 吃透Netty源码系列四之NioEventLoop
    吃透Netty源码系列四之NioEventLoop新启动的线程的作用执行NioEventLoop的run方法执行任务一(通道注册register0)doRegisterpipeli ... [详细]
author-avatar
可乐加冰2502937787
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有