android netty导入_Android Netty框架的使用

public abstract class BaseClientMgr extends Subject implementsIClientConnect {protected boolean isRunning; //当前是否正在连接

protected boolean isSending; //是否正在发送 线程是否被占用

private int mPort; //连接服务器的端口号

private int mCommunication; //通讯类型

private int heartTimeOutCount = 0; //记录心跳超时次数

protected int function = 1200; //关闭连接功能号

public static final int RESPONSE_SUCCESS = 0x401;public static final int RESPONSE_FAIL = 0x402;public static final int RESPONSE_TIMEOUT = 0x403;public static final int REQUEST_HEARTBEAT_TIMEOUT = 0x410; //心跳超时

public static final int NOT_LOGIN = 0x411; //用户未登录

private String mConnectKey = "BasicServicesMgr";private String mHost; //连接服务器的IP地址

protected ArrayList mEntityMsg = null; //待发送消息集合

protected Context mContext; //Context对象

protected CommunicationThreadManager mManager; //该通讯层管理器

protected ParseByteThread mParseByteThread = null; //数据解析线程

protected ExecutorService executor; //线程连接池

protected BaseClientMgr(String host, intport, String key) {

init(host, port, key);

}//初始化

private void init(String host, intport, String key) {this.mContext =MeiApp.mContext;

isRunning= false;

isSending= false;

mHost=host;

mPort=port;

mConnectKey=key;

mEntityMsg= new ArrayList();

executor= Executors.newFixedThreadPool(10);

mParseByteThread= new ParseByteThread(this);

executor.execute(mParseByteThread);

}protected Handler basicHandler = newHandler() {

@Overridepublic voidhandleMessage(Message msg) {super.handleMessage(msg);switch(msg.what) {caseClientConstants.REQUEST://发送请求 连接占用

if (mEntityMsg != null && mEntityMsg.size() > 0) {

isSending= true;//清除handler的消息

basicHandler.removeMessages(ClientConstants.REQUEST);

basicHandler.removeMessages(ClientConstants.REQUEST_CREATE_CONNECT);

basicHandler.removeMessages(ClientConstants.REQUEST_SEND_MESSAGE);//请求类型 当为网络请求时判断网络状态 建立连接//检查连接是否可用

if(isRunning) {//直接发送消息

basicHandler.removeMessages(ClientConstants.REQUEST_SEND_MESSAGE);

basicHandler.sendEmptyMessage(ClientConstants.REQUEST_SEND_MESSAGE);

}else{//建立连接

basicHandler.removeMessages(ClientConstants.REQUEST_CREATE_CONNECT);

Message msgCreate=Message.obtain();

msgCreate.what=ClientConstants.REQUEST_CREATE_CONNECT;

msgCreate.arg1= 0;

basicHandler.sendMessage(msgCreate);

}

}break;caseClientConstants.REQUEST_CREATE_CONNECT://建立连接

Log.i("mbk", "建立连接!");

isConnect("netty");break;caseClientConstants.REQUEST_SEND_MESSAGE://发送消息

Log.i("mbk", "发送消息!");if(isRunning) {if (mEntityMsg.size() > 0) {

Log.i("mbk", "发送数据!");

sendData(mEntityMsg.get(0));

basicHandler.removeMessages(ClientConstants.REQUEST_TIMEOUT);//设置请求超时

basicHandler.sendEmptyMessageDelayed(ClientConstants.REQUEST_TIMEOUT, 3000);

}else{

Log.i("mbk", "数据发送完成!");

isSending= false;

}

}else{//重新建立连接

basicHandler.removeMessages(ClientConstants.REQUEST_CREATE_CONNECT);

basicHandler.sendEmptyMessage(ClientConstants.REQUEST_CREATE_CONNECT);

}break;caseClientConstants.REQUEST_SEND_HEARTBEAT:

Log.i("mbk", "发送心跳!");

mManager.sendHeart(function);

heartTimeOutCount++;

Log.i("lzy02", "heartTimeOutCount---------------" +heartTimeOutCount);if (heartTimeOutCount >= 3) {//大于等于3则认为与云棒无连接

callBack(null, null, "心跳超时!", REQUEST_HEARTBEAT_TIMEOUT);

}// //发送心跳

basicHandler.removeMessages(ClientConstants.REQUEST_SEND_HEARTBEAT);

basicHandler.sendEmptyMessageDelayed(ClientConstants.REQUEST_SEND_HEARTBEAT,3000);break;case ClientConstants.REQUEST_TIMEOUT://请求超时

Log.i("mbk", "请求超时!");

isRunning= false;

callBack(null, null, "请求超时!", RESPONSE_TIMEOUT);break;

}

}

};public void sendHeartbeat(intfunction) {this.function =function;

}public voidsendData(IEntity entity) {

sendByte(ClientSocketUtils.sendDatas(mEntityMsg.get(0)));

}//建立连接

@Overridepublic voidisConnect(String netType) {

UdpEntity udpEntity= null;int type =CommunicationThreadManager.MBK_COMMUNICATION_NETTY;if (netType.equals("netty")) {//建立一个netty连接

type =CommunicationThreadManager.MBK_COMMUNICATION_NETTY;

mManager= new CommunicationThreadManager(mContext, null, mConnectKey, "192.168.31.241", mPort, type, mCommunicationCallBack);

Log.i("mbk", "发送地址---" + "192.168.31.241");

Log.i("mbk", "发送端口号---" +mPort);/** if (udpEntity != null) { Log.i("lzy02",

* "udpEntity---209----------udpEntity=="+udpEntity.getYunbangIp());

* mManager = new CommunicationThreadManager(mContext, null, mConnectKey,

* "192.168.31.241", mPort, type, mCommunicationCallBack);

* //Toast.makeText(mContext, "已通过Netty发送 ", Toast.LENGTH_SHORT).show();

* Log.i("mbk","netty发送云棒IP号---" + udpEntity.getYunbangIp()); } else {

* Log.i("lzy02", "udpEntity---211----------udpEntity == null");

* callBack(null, null, "无法连接netty!", RESPONSE_FAIL); }*/

//使用netty是时候 清理p2p

P2pClearUp();

}else{

}

Log.i("mbk", "初始化 连接服务器!" +netType);

}

@Overridepublic void sendByte(byte[] b) {try{if (mManager != null) {

mManager.sendDataToServer(newSendData(b));

}else{

isClose();

}

}catch(InterruptedException e) {

isClose();

}

}//服务端回调

private CommunicationCallBack mCommunicationCallBack = newCommunicationCallBack() {

@Overridepublic voidexceptionCaught(ChannelHandlerContext ctx, Throwable cause) {

Log.i("mbk", "--------------------------请求异常--------------------------" +mCommunication);

isRunning= false;

callBack(null, null, "请求异常!", RESPONSE_FAIL);

}

@Overridepublic voidconnected(ChannelHandlerContext ctx) {

Log.i("mbk", "--------------------------连接成功--------------------------" +mCommunication);//mChx = ctx;

isRunning = true;

sendAgain();

}

@Overridepublic voidconnectFailure(Exception e) {

Log.i("mbk", "--------------------------连接服务器失败--------------------------" +mCommunication);

isRunning= false;

callBack(null, null, "连接服务器失败!", RESPONSE_FAIL);

}

@Overridepublic void channelRead(ChannelHandlerContext ctx, byte[] msg) {

Log.i("mbk", "--------------------------服务端返回--------------------------" +mCommunication);if (mParseByteThread != null) {

mParseByteThread.sendParseByte(msg);

}

}

@Overridepublic voidcommunicationOutTime() {

Log.i("mbk", "--------------------------连接超时--------------------------" +mCommunication);

isRunning= false;

callBack(null, null, "连接超时!", RESPONSE_TIMEOUT);

}

@Overridepublic voidquestTimeOut() {

Log.i("mbk", "--------------------------请求超时--------------------------" +mCommunication);

isRunning= false;

callBack(null, null, "请求超时!", RESPONSE_TIMEOUT);

}

};

@Overridepublic voidsendAgain() {//连接成功 发起请求

Log.i("mbk", "连接成功,数据重新发送!");//basicHandler.sendEmptyMessage(ClientConstants.REQUEST_SEND_MESSAGE);

basicHandler.sendEmptyMessageDelayed(ClientConstants.REQUEST_SEND_MESSAGE, 500);

}//接收需要发送的实体

@Overridepublic voidsendEntity(IEntity entity) {if (mEntityMsg != null && entity != null) {

mEntityMsg.add(entity);if (!isSending) {//启动一个发送

Log.i("mbk", "发起请求!REQUEST_NET");

basicHandler.sendEmptyMessage(ClientConstants.REQUEST);

}

}//if (mEntityMsg != null && mEntityMsg.size() == 2) {//mEntityMsg.remove(1);//}

}

@Overridepublic void callBack(PackageHeader header, byte[] data, String desc, inttype) {

basicHandler.removeMessages(ClientConstants.REQUEST_SEND_HEARTBEAT);switch(type) {caseRESPONSE_SUCCESS:

heartTimeOutCount= 0;

basicHandler.sendEmptyMessageDelayed(ClientConstants.REQUEST_SEND_HEARTBEAT,20000);switch(header.getFunction()) {case 9998:

Log.i("mbk", "服务端关闭!");

isClose();break;case 9999:

Log.i("mbk", "成功返回一个心跳!");break;case 999:

Log.i("mbk", "未知错误!");

callBack(null, null, "未知错误", RESPONSE_FAIL);break;default:

responseSuccess(header, data, desc, type);break;

}break;case REQUEST_HEARTBEAT_TIMEOUT://心跳超时3次认为与云棒无连接

/** Intent m2Intent = new Intent(MeiConfigs.NETWORK_PROMPT);

* m2Intent.putExtra("islogin", "3003");

* MeiApp.mContext.sendBroadcast(m2Intent);*/

break;caseRESPONSE_FAIL:

responseFail(header, data, desc, type);break;caseRESPONSE_TIMEOUT:

responseFail(header, data, desc, type);break;

}

}//请求成功

public void responseSuccess(PackageHeader header, byte[] data, String desc, inttype) {try{if (mEntityMsg.size() > 0 && mEntityMsg.get(0).getHandler() != null) {

IEntity entity= mEntityMsg.get(0);if (data != null && data.length > 0) {

entity.onDecode(new String(data, "utf-8"));//Log.i("mbk","云棒返回---" + "---" + new String(data, "utf-8"));//请求成功

Log.i("lzy02", "1--------------" +entity.getCode());

Log.i("mbk", "返回一条数据!");

Message msg=Message.obtain();

msg.obj=entity;

msg.arg1=header.getFunction();

msg.what=type;

entity.getHandler().sendMessage(msg);

}

}

}catch(Exception e) {

e.printStackTrace();

isClose();

}if (mEntityMsg != null && mEntityMsg.size() > 0) {

mEntityMsg.remove(0);

}

basicHandler.removeMessages(ClientConstants.REQUEST_TIMEOUT);

isSending= false;if (mEntityMsg.size() > 0) {

basicHandler.sendEmptyMessage(ClientConstants.REQUEST);

}

}//请求失败

public void responseFail(PackageHeader header, byte[] data, String desc, inttype) {

Log.i("mbk", "请求失败! " +desc);

Message msg=Message.obtain();

msg.obj=desc;

msg.arg1= 0;

msg.what=type;if (mEntityMsg.size() > 0 && mEntityMsg.get(0).getHandler() != null) {

mEntityMsg.get(0).getHandler().sendMessage(msg);

}

isClose();

}//请求本地缓存返回

@Overridepublic voidcallBack(IEntity entity, String desc) {

Log.i("mbk", "回一返个缓存数据! ");if ("cache".equals(desc)) {if (entity != null && entity.getHandler() != null) {

Message msg=Message.obtain();

msg.obj=entity;

msg.what=RESPONSE_SUCCESS;

entity.getHandler().sendMessage(msg);

}

}

}public voidP2pClearUp() {if (mManager != null) {

mManager.p2pCleanup();

}

}

@Overridepublic voidisClose() {

Log.i("mbk", "关闭连接!" +isRunning);if (mManager != null) {if(isRunning) {try{

mManager.sendDataToServer(newSendData(ClientSocketUtils.sendExit(function)));

}catch(InterruptedException e) {

}

}else{

mManager.closeTheadManager();

mManager= null;

}

}if (mParseByteThread != null)

mParseByteThread.closeThread();if (mEntityMsg != null) {

mEntityMsg.clear();

}

P2pClearUp();

basicHandler.removeMessages(ClientConstants.REQUEST_SEND_HEARTBEAT);

basicHandler.removeMessages(ClientConstants.REQUEST_TIMEOUT);

isRunning= false;

isSending= false;

}

@Overridepublic void sendMsgFail(String netType, byte[] msg) {

}

@Overridepublic voidconnectFail(String netType) {

}

@Overridepublic voidisClearMsg() {if (mEntityMsg != null) {

mEntityMsg.clear();

}

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507388.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python自动化办公实例展示_python自动化办公?学这些就够用了

知乎上有人提问:用python进行办公自动化都需要学习什么知识呢?这可能是很多非IT职场人士面临的困惑,想把python用到工作中,却不知如何下手? python在自动化办公领域越来越受欢迎,批量处理简直是加班族的福音…

Linux编程基础 8.3:I/O多路转接服务器

1 简介 为进一步提升服务器效率,人们提出了一种被称为I/O多路转接的模型。其中“多路”指代连接到服务器的多个客户端程序,而“转接”则是指在服务器主线与各分支之间设置一个“岗位”,由该岗位实现监控多路连接中数据状态的功能&#xff0c…

handler原子锁_多线程编程之原子锁

在《多线程编程之数据访问互斥》一文中简单介绍了原子锁,这里再详细说一下原子锁的概念和用途。(1)简单数据操作如果在一个多线程环境下对某个变量进行简单数学运算或者逻辑运算,那么就应该使用原子锁操作。因为,使用临界区、互斥量等线程互斥…

python统计中文字符的个数_python统计中文字符数量的两种方法

方法一: def str_count(str): 找出字符串中的中英文、空格、数字、标点符号个数 count_en count_dg count_sp count_zh count_pu 0 for s in str: # 英文 if s in string.ascii_letters: count_en 1 # 数字 elif s.isdigit(): count_dg 1 # 空格 elif s.issp…

测井储层参数预测+人工智能方法

1 问题描述 测井储层参数预测 地层泥质含量;地层孔隙度(POR);含水饱和度(SW);渗透率(PERM)。 输入:声波时差(AC)、补偿中子&#x…

php spry文本域_Spry框架及验证构件

图9-71Spry框架原理虽然这些文件存放在服务器上,但实际上是被加载到浏览器中运行的。框架的用户将所有需要的文件链接到HTML文档中,以使用不同的组件,来获得更丰富的用户体验。Spry框架是和设计人员紧密相关的,因此框架中的每个元…

网络系统安全课程--目录

本系列教程以《网络与系统安全》为基础,希望在大家的帮助下,逐步完善网络与系统安全研究生课程。 1 经典攻击分析 1.1 中间人攻击 1.2 源替换攻击 1.3 消息重放攻击 1.4 平行会话攻击 1.5 反射攻击 1.6 交错攻击 1.7 类型缺陷攻击 1.8 身份标识省略导致…

windows 安装openssh服务端_Git神器| SourceTree安装使用教程

SourceTree 是 Windows 和Mac OS X 下免费的Git客户端管理工具。支持创建、克隆、提交、push、pull 和合并等操作。一、sourcetree的安装1. 下载sourcetree下载链接:Sourcetree | Free Git GUI for Mac and Windows2. 安装sourcetree点击安装,第一个创建…

c语言小学生四则运算出题_软件工程第一次作业,小学生四则运算的出题程序...

一、背景阿超有个儿子上小学二年级,老师每天让家长给孩子出30道加减法题,虽然不多,但是每天都做也算是个负担,阿超作为一个老牌程序员当然想用计算机来解决这个小问题,目前对于这个问题对于任何语言都不是问题&#xf…

中国大学生计算机设计大赛--软件应用与开发类--经验总结

1 大赛介绍 中国大学生计算机设计大赛是我国高校面向本科生最早的赛事之一,自2008年开赛至2019年,一直由教育部高校与计算机相关教指委等或独立或联合主办。此赛目前是全国普通高校大学生竞赛排行榜榜单赛事之一。 我们参加了很多届大赛,在2…

python如何使用ppip安装xlwt_Python-xlwt库的基本使用

安装xlwt库 pip install xlwt 基本使用 ①创建工作簿 wa xlwt.Workbook() ②添加工作表 添加“class”工作表 b wa.add_sheet(class) ③向工作表写入数据 注释:(0,0,姓名)(行、列、内容)第0行的第0个也就是excel中的A1,(0,1)就是B1..... b.write(0,0,姓…

网络与系统安全1.1 中间人攻击

1 Diffie-Hellman密钥交换过程 2 中间人攻击过程

tomcat启动占了12g_tomcat服务为何报内存相关错误??

本帖最后由 linux_love 于 2014-9-19 11:46 编辑多谢各位英雄支持,这个问题困扰我N久了,昨天终于让我给拿下了,在Linux下有个CommitLimit 用于限制系统应用使用的内存资源,#grep -i commit /proc/meminfoCommitLimit: 20389524…

python调用键盘_使用 Python 控制自己的电脑和键盘是一种什么样的体验?

可能有时候你需要在电脑做一些重复的点击或者提交表单等操作,如果能通过 Python 预先写好相关的操作指令,让它帮你操作,然后你自己爱干嘛干嘛去,有点 “按键精灵” 的意思,是不是感觉有点爽呢? 那么如何使用…

网络与系统安全4.1 基于随机搜索的黑盒对抗攻击方法

1 摘要 神经网络模型容易受到对抗样本的攻击,根据攻击者是否能获取到模型内部参数可以把攻击类型分为白盒攻击和黑盒攻击。 白盒攻击比较常见,但其对目标模型的威胁程度要远低于黑盒攻击。传统黑盒攻击往往都是基于梯度实现的,并且具有查询…

mybatis 二级缓存失效_二级缓存updateBatchById失效

### 当前使用版本(必须填写清楚,否则不予处理)3.3.0### 该问题是怎么引起的?**([最新版](https://search.maven.org/search?qg:com.baomidou%20a:mybatis-*)上已修复的会直接**close**掉)**### 重现步骤**字典mapper**CacheNamespacepublic interface D…

centos 安装jdk_centos7配置jdk

一、查看centos7是否有自带jdk查看是否安装过java rpm -qa | grep java 如果是centos 一般会自带两个openjdk rpm -e --nodeps 要卸载的包 (包通过上面的指令可以获取到)] 将显示java的包全都卸载 命令: rpm -e --nodeps 要卸载的包二、创建/opt/app目录,用于安装JD…

隐私计算 1 隐私计算的定义与背景

1 隐私计算的定义 隐私计算:在保证数据提供方不泄露原始数据的前提下,对数据进行分析计算的一系列技术,保障数据在流通和融合过程中“可用不可见”。 隐私计算涉及到的学科: 密码学;统计学;计算机体系结…

php object 对象不存在。增加对象_PHP核心

1、单例模式单例模式三要素&#xff1a;拥有一个构造函数&#xff0c;并且为private拥有一个静态成员变量来保持类的实例拥有一个访问这个实例的静态方法<?php //Instan.php 单例类class Instan{static public $instance null;private function __construct(){var_dump(…

数据库查询求小于_SQL学习笔记(二)简单查询

本篇主要学习如何通过简单查询获取想要的数据。从零学会SQL&#xff1a;简单查询​www.zhihu.com基本的查询语句从数据库中查找数据时要使用select子句&#xff0c;select子句是sql中使用最多、最基本的子句。子句是sql语句的组成要素&#xff0c;是以某一个关键字作为开始的语…