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 心跳包的分析相关推荐

  1. Android心跳包(一)——心跳机制

    转自:http://blog.csdn.net/rabbit_in_android/article/details/50119809 在写之前,我们首先了解一下为什么android维护长连接需要心跳机 ...

  2. android心跳包作用,Android开发Im总结-5:心跳包

    心跳包的作用: TCP长连接本质上不需要心跳包来维持, 大家可以试一试, 让两台电脑连上同一个wifi, 然后让其中一台做服务器, 另一台用一个普通的没有设置KeepAlive的Socket连上服务器 ...

  3. Flutter Android/iOS包大小分析

    作者:腾讯 - 小德(任晓帅 koudleren) 前言 Flutter几乎从一开始就被人诟病SDK的包太大,真的是这样子吗? 1. Flutter 构建产物分析 分析Flutter的构建产物,发现一 ...

  4. android 心跳包,android socket 发送心跳包

    在项目中,有如下需求:Android客户端向服务器发送数据,收到服务器返回的数据发送成功标识后,客户端即与服务器建立数据一来一往的心跳连接,若服务器端断开时,客户端接收到通知,关闭Service停止发 ...

  5. Android Socket连接(模拟心跳包,断线重连,发送数据等)

    首页 博客 学院 下载 GitChat TinyMind 论坛 问答 商城 VIP 活动 招聘 ITeye CSTO 写博客 发Chat 喻志强的博客 耐心 细心 用心 传播正能量 RSS订阅 原 A ...

  6. 百度知道APP心跳包分析-MD5字段(gzip + CRC32)

    百度知道app有个心跳包检测机制,看下这个接口 POST:https://kstj.baidu.com/ctj/iknow?v=737&i=0E046D49CA01C9B2177F109C17 ...

  7. Android Socket通信 发送心跳包 重连

    最近项目中,有使用Socket与后端进行通信,然后简单的了解了下Socket使用,大致流程是配置服务端的Ip.端口号,连接,监听数据和发送数据,数据的读取和发送都是以流的形式实现的,然后自己将项目中的 ...

  8. Android 蓝牙抓包和分析 (1) 启用蓝牙HCI信息收集日志

    蓝牙通信其实和http通信有点类似,http通过接口交互抓取数据包也很方便,但是到了蓝牙就没那么方便了,本文就是介绍如何实现蓝牙数据包的抓取. 怎么抓包 另一种更为简便的抓包方式请阅读Android ...

  9. 某网站心跳包参数加密的wasm分析

    某网站心跳包参数加密的wasm分析 js层动态分析 nodejs调用wasm与绕过dom环境检测 IDA分析与python算法还原 js层动态分析 网站地址:aHR0cHM6Ly9saXZlLmJpb ...

最新文章

  1. Java设计模式之结构型:适配器模式
  2. 浅谈tomcat中间件的优化【转】
  3. dart系列之:集合使用实践
  4. BZOJ3675 [APIO2014]序列分割
  5. esp mounter pro_对比 | 以大欺小?剑指宋Pro和哈弗H6,欧尚X7的黑马潜质从何而来?...
  6. 项目下创建文件_Linux 下创建和使用交换文件
  7. Struts1.x系列教程(1):用MyEclipse开发第一个Struts程序(二)
  8. OpenShift 4 - 用Debezium+Kafka实现MySQL数据库的CDC
  9. OpenCV实践笔记(1)----图像显示
  10. 魔百盒哪款型号配置高_砂石厂都在用哪种洗砂设备,哪款洗沙机效率更高?
  11. 卡巴斯基称发现美国中情局CIA 开发的新恶意软件
  12. 韩国遭 Lazarus Group 供应链攻击
  13. win访问linux NFS磁盘映射共享驱动器卡顿
  14. Android Camera setRecordingHint函数 在部分手机上的问题。
  15. adobe黑体std能商用_adobe黑体std字体下载
  16. EnvironmentPlugin 一款用来配置可动态切换App环境的Gradle插件
  17. 云计算核心技术剖析学习笔记_2
  18. Opencv python之车辆识别项目(附代码)
  19. CAD转图片,怎么转换成PNG图片?
  20. S32K1xx系列MCU的EEE(Emulated EEPROM)使用详解

热门文章

  1. Java多线程——ConcurrentMap、ConcurrentHashMap
  2. 综述论文包含哪些内容?
  3. 6个超赞的免费神器工具,拯救贫民窟的你!
  4. 狂欢,不过是一群人的孤单--来自人人
  5. Windows系统中电脑无法进入睡眠状态的解决办法
  6. 如何通过API方式集成金蝶ERP
  7. MVC 简介,MVC数据库
  8. 怎么装win7与linux双,装双系统win7和linux_win7与linux双系统
  9. 计算方法(五):数值微分与数值积分
  10. u盘加密软件linux,U盘加密工具: Wondershare USB Drive Encryption 介绍