android 心跳包的分析
android 心跳的分析
最近在做一个项目中用到了心跳包的机制,其实就是传统的长连接。或许有的人知道消息推送的机制,消息推送也是一种长连接 ,是将数据有服务器端推送到客户端这边从而改变传统的“拉”的请求方式。下面我来介绍一下安卓和客户端两个数据请求的方式
1、push 这个也就是有服务器推送到客户端这边 现在有第三方技术 比如极光推送。
2、pull 这种方式就是客户端向服务器发送请求数据(http请求)
接下来 我就给大家介绍 Socket tcp心跳包的机制 虽然这块不是很难,找一些网上的资料不是很全面 这个模块参照一个朋友的功能模块 自己也受益匪浅,现在分享给大家。
一、首先服务器和客户端有一次“握手”
public void connect()
{
LogUtil.e(TAG, "准备链接...");
InetAddress serverAddr;
try {
socket = new Socket(Config.Host, Config.SockectPort);
_connect = true;
mReceiveThread = new ReceiveThread();
receiveStop = false;
mReceiveThread.start();
LogUtil.e(TAG, "链接成功.");
} catch (Exception e) {
LogUtil.e(TAG, "链接出错." + e.getMessage().toString());
e.printStackTrace();
}
}
二、下面就要开启一个线程 去不断读取服务器那边传过来的数据 采用Thread去实现
private class ReceiveThread extends Thread {
private byte[] buf;
private String str = null;
@Override
public void run() {
while (true) {
try {
// LogUtil.e(TAG, "监听中...:"+socket.isConnected());
if (socket!=null && socket.isConnected()) {
if (!socket.isInputShutdown()) {
BufferedReader inStream = new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
String content = inStream.readLine();
if (content == null)
continue;
LogUtil.e(TAG, "收到信息:" + content);
LogUtil.e(TAG, "信息长度:"+content.length());
if (!content.startsWith("CMD:"))
continue;
int spacePos = content.indexOf(" ");
if (spacePos == -1)
continue;
String cmd = content.substring(4, spacePos);
// String body = StringUtil.DecodeBase64(content
// .substring(spacePos));
String body = content.substring(spacePos).trim();
LogUtil.e(TAG, "收到信息(CMD):" + cmd);
LogUtil.e(TAG, "收到信息(BODY):" + body);
if (cmd.equals("LOGIN"))
{
// 登录
ReceiveLogin(body);
continue;
}
if (cmd.equals("KEEPLIVE")) {
if (!body.equals("1")) {
Log.e(TAG, "心跳时检测到异常,重新登录!");
socket = null;
KeepAlive();
} else {
Date now = Calendar.getInstance().getTime();
lastKeepAliveOkTime = now;
}
continue;
}
}
} else {
if(socket!=null)
LogUtil.e(TAG, "链接状态:" + socket.isConnected());
}
} catch (Exception e) {
LogUtil.e(TAG, "监听出错:" + e.toString());
e.printStackTrace();
}
}
}
三 、 Socket 是否断开了 断开了 需要重新去连接
public void KeepAlive()
{
// 判断socket是否已断开,断开就重连
if (lastKeepAliveOkTime != null) {
LogUtil.e(
TAG,
"上次心跳成功时间:"
+ DateTimeUtil.dateFormat(lastKeepAliveOkTime,
"yyyy-MM-dd HH:mm:ss"));
Date now = Calendar.getInstance().getTime();
long between = (now.getTime() - lastKeepAliveOkTime.getTime());// 得到两者的毫秒数
if (between > 60 * 1000) {
LogUtil.e(TAG, "心跳异常超过1分钟,重新连接:");
lastKeepAliveOkTime = null;
socket = null;
}
} else {
lastKeepAliveOkTime = Calendar.getInstance().getTime();
}
if (!checkIsAlive()) {
LogUtil.e(TAG, "链接已断开,重新连接.");
connect();
if (loginPara != null)
Login(loginPara);
}
//此方法是检测是否连接
boolean checkIsAlive() {
if (socket == null)
return false;
try {
socket.sendUrgentData(0xFF);
} catch (IOException e) {
return false;
}
return true;
}
//然后发送数据的方法
public void sendmessage(String msg) {
if (!checkIsAlive())
return;
LogUtil.e(TAG, "准备发送消息:" + msg);
try {
if (socket != null && socket.isConnected()) {
if (!socket.isOutputShutdown()) {
PrintWriter outStream = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())),
true);
outStream.print(msg + (char) 13 + (char) 10);
outStream.flush();
}
}
LogUtil.e(TAG, "发送成功!");
} catch (Exception e) {
e.printStackTrace();
}
}
有什么问题欢迎大家一起讨论和学习 接下来自己准备研究手机流媒体这块 欢迎大家一起学习共同进步!
源码下载地址:http://download.csdn.net/detail/wangliang198901/6567561
android 心跳包的分析相关推荐
- Android心跳包(一)——心跳机制
转自:http://blog.csdn.net/rabbit_in_android/article/details/50119809 在写之前,我们首先了解一下为什么android维护长连接需要心跳机 ...
- android心跳包作用,Android开发Im总结-5:心跳包
心跳包的作用: TCP长连接本质上不需要心跳包来维持, 大家可以试一试, 让两台电脑连上同一个wifi, 然后让其中一台做服务器, 另一台用一个普通的没有设置KeepAlive的Socket连上服务器 ...
- Flutter Android/iOS包大小分析
作者:腾讯 - 小德(任晓帅 koudleren) 前言 Flutter几乎从一开始就被人诟病SDK的包太大,真的是这样子吗? 1. Flutter 构建产物分析 分析Flutter的构建产物,发现一 ...
- android 心跳包,android socket 发送心跳包
在项目中,有如下需求:Android客户端向服务器发送数据,收到服务器返回的数据发送成功标识后,客户端即与服务器建立数据一来一往的心跳连接,若服务器端断开时,客户端接收到通知,关闭Service停止发 ...
- Android Socket连接(模拟心跳包,断线重连,发送数据等)
首页 博客 学院 下载 GitChat TinyMind 论坛 问答 商城 VIP 活动 招聘 ITeye CSTO 写博客 发Chat 喻志强的博客 耐心 细心 用心 传播正能量 RSS订阅 原 A ...
- 百度知道APP心跳包分析-MD5字段(gzip + CRC32)
百度知道app有个心跳包检测机制,看下这个接口 POST:https://kstj.baidu.com/ctj/iknow?v=737&i=0E046D49CA01C9B2177F109C17 ...
- Android Socket通信 发送心跳包 重连
最近项目中,有使用Socket与后端进行通信,然后简单的了解了下Socket使用,大致流程是配置服务端的Ip.端口号,连接,监听数据和发送数据,数据的读取和发送都是以流的形式实现的,然后自己将项目中的 ...
- Android 蓝牙抓包和分析 (1) 启用蓝牙HCI信息收集日志
蓝牙通信其实和http通信有点类似,http通过接口交互抓取数据包也很方便,但是到了蓝牙就没那么方便了,本文就是介绍如何实现蓝牙数据包的抓取. 怎么抓包 另一种更为简便的抓包方式请阅读Android ...
- 某网站心跳包参数加密的wasm分析
某网站心跳包参数加密的wasm分析 js层动态分析 nodejs调用wasm与绕过dom环境检测 IDA分析与python算法还原 js层动态分析 网站地址:aHR0cHM6Ly9saXZlLmJpb ...
最新文章
- Java设计模式之结构型:适配器模式
- 浅谈tomcat中间件的优化【转】
- dart系列之:集合使用实践
- BZOJ3675 [APIO2014]序列分割
- esp mounter pro_对比 | 以大欺小?剑指宋Pro和哈弗H6,欧尚X7的黑马潜质从何而来?...
- 项目下创建文件_Linux 下创建和使用交换文件
- Struts1.x系列教程(1):用MyEclipse开发第一个Struts程序(二)
- OpenShift 4 - 用Debezium+Kafka实现MySQL数据库的CDC
- OpenCV实践笔记(1)----图像显示
- 魔百盒哪款型号配置高_砂石厂都在用哪种洗砂设备,哪款洗沙机效率更高?
- 卡巴斯基称发现美国中情局CIA 开发的新恶意软件
- 韩国遭 Lazarus Group 供应链攻击
- win访问linux NFS磁盘映射共享驱动器卡顿
- Android Camera setRecordingHint函数 在部分手机上的问题。
- adobe黑体std能商用_adobe黑体std字体下载
- EnvironmentPlugin 一款用来配置可动态切换App环境的Gradle插件
- 云计算核心技术剖析学习笔记_2
- Opencv python之车辆识别项目(附代码)
- CAD转图片,怎么转换成PNG图片?
- S32K1xx系列MCU的EEE(Emulated EEPROM)使用详解