[置顶] 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开发之serviceManager分析
Android 开发之serviceManager分析 在Android系统中用到最多的通信机制就是Binder,Binder主要由Client.Server.ServiceManager和Binde ...
- [置顶] Android开发笔记(成长轨迹)
分类: 开发学习笔记2013-06-21 09:44 26043人阅读 评论(5) 收藏 Android开发笔记 1.控制台输出:called unimplemented OpenGL ES API ...
- [置顶]
Android逆向从未如此简单
哈,又标题党了..不过我一定竭尽所能,写一篇最亲民的入门文章. 本文仅供学习交流之用,切勿用于非法用途,读者若运用所学知识,进行非法任何商业目的或者非法牟利,一切责任由操作者自行承担,与本人无关.希望 ...
- [置顶] [Android源码分析]inquiry result引起的上层变化分析
在上一篇文章中,我们详细分析了android是如何解析蓝牙反馈上来的搜索到的设备信息,本文将会继续分析这些信息到了上层之后是如何处理. 8.inquiry result引起的上层变化 我们知道inqu ...
- [置顶] Android开发之ProcessState和IPCThreadState类分析
在Android中ProcessState是客户端和服务端公共的部分,作为Binder通信的基础,ProcessState是一个singleton类,每个 进程只有一个对象,这个对象负责打开Binde ...
- [置顶] Android安全机制分析
Android系统是基于Linux内核开发的,因此,Android系统不仅保留和继承了Linux操作系统的安全机制,而且其系统架构的各个层次都有独特的安全特性[2] . 1. Linux内核层安全机制 ...
- [置顶] Android资源文件分析
1)修改开机默认壁纸 Android开机默认资源文件为:frameworks/base/core/res/res/values/config.xml 我们找到wallpaper行: <strin ...
- [置顶] Android源码分析-点击事件派发机制
转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/17339857 概述 一直想写篇关于Android事件派发机制的文章,却一直没 ...
- [置顶] Android开发之Thread类分析
在我们Linux系统中创建线程函数为:pthread_create(),在Android中我们为线程封装了一个类Thread,实际调用的还是pthread_create() 当我们想创建线程的时候,只 ...
随机推荐
- Android中自定义属性的使用
做Android布局是件很享受的事,这得益于他良好的xml方式.使用xml可以快速有效的为软件定义界面.可是有时候我们总感觉官方定义的一些基本组件不够用,自定义组件就不可避免了.那么如何才能做到像官方 ...
- Linux搭建FTP
Linux FTP 服务器配置简单说明 转载:http://blog.csdn.net/tianlesoftware/article/details/6151317
- 腾讯出品的抓包工具Rythem
Mac下一直没有fiddler这样好用的抓包工具,Charles要收费,难免不爽,昨天调研国内项目的时候,看到腾讯开源了一款抓包工具Rythem,试用了一下,基本配置无问题,但是通配符方面不太搞的定. ...
- linux中时间函数
linux下常用时间类型有四种: time_t . struct tm. struct timeval . struct timespec 1.time_t 时间函数 time_t ...
- ajax异步服务器获取时间
1.创建ajax对象 <script type="text/javascript"> //创建AJAX异步对象 function createAJAX(){ var a ...
- C++类包含问题(重复包含和相互包含)
一.重复包含头文件 头文件重复包含,可能会导致的错误包括:变量重定义,类型重定义及其他一些莫名其妙的错误.C++提供两种解决方案,分别是#ifndef和#pragma once #ifndef _SO ...
- mysql修改用户名和密码
修改用户名 mysql> use mysql; 选择数据库Database changedmysql> update user set user="dns" wher ...
- mysql查询数据库中包含某字段(列名)的所有表
SELECT TABLE_NAME '表名',TABLE_SCHEMA '数据库名',ORDINAL_POSITION '顺序',COLUMN_NAME '字段',DATA_TYPE '类型' ,CH ...
- PhoneGap笔记-01 基本使用
1. 环境配置 1.1 常用框架 jQuery Backbone.js dojo bootstrap kendo UI Sencha jQuery Mobile PhoneJS AngularJS I ...
- [转] tomcat组成及工作原理
1 - Tomcat Server的组成部分 1.1 - Server A Server element represents the entire Catalina servlet containe ...