http://blog.csdn.net/zeo112140/article/details/7675195

使用TCPdump工具,抓TCP数据包。
将数据包上传到PC,通过Wireshark查看数据包

常用命令:

*  上传 tcpdump 到 目录 /data/local/tcpdump

adb push d:\tcpdump /data/local/tcpdump

*  设置权限

adb shell chmod 6755 /data/local/tcpdump

* 启动监听程序并将监听的数据包存放在/sdcard/capture.pcap

adb shell /data/local/tcpdump/tcpdump -p -vv -s 0 -w /sdcard/capture.pcap

*  下载监听的数据包capture.pcap到PC的当前目录   
adb pull /sdcard/capture.pcap   .

很久没写BLOG了,之前在写Android聊天室的时候答应过要写一个客户(好友)之间的聊天demo,Android 基于Socket的聊天室已经实现了通过Socket广播形式的通信功能。

以下是我写的一个类似现在多数聊天软件的冒泡聊天APP。全部功能都是自己的想法,对于现在市面上成功的例子是怎么实现的,我还不了解。所以读者可只做参考学习,也可以分享您的案例给我。

功能

  • 一对一聊天,非聊天室
  • 好友列表
  • 好友在线,离线状态(实时更新)
  • 冒泡实时聊天窗口
  • 发送离线信息

基本原理

之前的聊天室原理:每当客户端Socket连接到该ServerSocket之后,程序将对应Socket加入clients集合中保存,并为该Socket启动一条线程,该线程负责处理该Socket所有的通信任务,当服务器线程读到客户端数据之后,程序遍历clients集合,并将该数据向clients集合中的每个 Socket发送一次

一对一的聊天:Server通过Map把Clients的Socket都储存起来,把Client用户ID作为Map的key,当A发送信息给B时,服务器搜索出B的Socket,建立他们的通信通道。

服务器Server

这次我在服务器加入了2个Socket集合,一个用来处理用户Online/Offline,另一个则专门用于处理用户之间的通信信息传递

1 static Map<String, Socket> socketMap = new HashMap<String, Socket>();
2 static Map<String, Socket> onlineMap = new HashMap<String, Socket>();

复制代码

Clients 上线,下线动作,Server都会经过筛选然后通知其在线的好友,Clients收到好友的在线状态然后修改Friends List。

1 // save client's name ,online
2 //...
3 getnameString = str.substring(config.PROTOCOL_KEY.length()+config.PROTOCOL_ONLINE.length());
4 Server.onlineMap.put(getnameString, s);
5 // ...
6 //update online friends
7 DataOutputStream onlineDOS = new DataOutputStream (Server.onlineMap.get(clientKey).getOutputStream());
8 onlineDOS.writeUTF(config.PROTOCOL_FRIENDS_START+onlineString+config.PROTOCOL_FRIENDS_END);
9 onlineDOS.flush();

复制代码

关于聊天,我是通过一个自定义加密符来给每个Client做标志的,例如:Client A发出的信息,该条信息的头部带有一条服务器和客户端都会识别的特殊符号,通过字符处理,找出该条信息的用户信息;以此类推,Client A的通信对象也是用这个方法

我们找到ClientA的目标对象后,找出这个Socket通道,他们就可以一对一的对话了

1 //send msg to friend
2 DataOutputStream ndos = new DataOutputStream (Server.socketMap.get(forname).getOutputStream());
3 ndos.writeUTF(fromname+date+"\n"+forchat);
4 ndos.flush();

复制代码

关于离线信息,这个主要是服务器承担的功能,我是使用mySql保存数据的。Client A 向离线状态的Client B发送一条信息,Server会判断Client B是否在线,如果是离线状态,服务器则把该信息先保存在mySql里;当Client B上线时,服务器会查找它的离线信息,如果有未读信息,则会及时发送。Client B就能收到离线信息了  ( ̄ˇ ̄) 

客户端 Clients

        

关于聊天,为了能够实现同时与多个好友聊天(不同窗口线程),这里用了ContentProvider监视聊天数据的变化,使不在当前聊天窗口的Activity也能收到好友的信息拼打印。

1 //监视聊天数据的变化
2 getContentResolver().registerContentObserver(DataChangeProvider.CONTENT_URI,true, cob);

复制代码

那后台是怎么样接收好友发来的信息的呢?上面Server里说过,有一个SocketMap的集合,而这个集合就是记录用户的通信Socket,当有信息的时候,客户端后台的WaitMsg()会接到发来的信息并做处理。

1 private Runnable waitThread = new Runnable() {
2 public void run() {
3 System.out.println("wait running!");
4 WaitMsg();
5 }
6 };

复制代码

关于Online/Offline状态,好友列表Activity ReceiveMsg()会监视Server发送的好友状态信息,及时更新好友列表ListActivity。

1 //更新好友数据库
2 fanDS.updateData(reMsg,name);
3 //获取好友列表
4 fansArray = fanDS.getFans();
5
6 friends = new Friends(fansArray,reMsg,name);
7 friendList = friends.getFriends();

复制代码

总结

相对聊天室而言,一对一的聊天主要是对每个Client的Socket都标志记录起来,让每个通讯动作有了目标对象;Server作为信使把两者的Socket对接,使两者可以通信聊天。

这是在 TCP/IP协议下的 C/S 模式通信方式,还有UDP协议,P2P模式下的通信方式的值得再去学习。

转载于:https://www.cnblogs.com/shuiyun/archive/2012/10/18/2730115.html

Android的抓包方法介绍和Socket聊天应用实现方法相关推荐

  1. 抓包工具介绍、手机抓包、wireshark使用技巧

    抓包工具介绍 (1).网页抓包工具 Chrome浏览器插件 FireBug 插件 HttpWatch Fiddler 在浏览器chrome和firefox中可以使用插件抓取网络包,httpwatch会 ...

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

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

  3. Win7虚拟无线AP以及Android手机抓包

    设备要求 Windows7操作系统 装有无线网卡的笔记本或台式机 无线网卡必须支持"承载网络" 查看无线网卡是否支持"承载" 方法一: 开始菜单→所有程序→附件 ...

  4. [转] Android实时抓包分析 : 善用adb调试桥

    Android实时抓包分析 : 善用adb调试桥 谈到android网络抓包,很多人都能想到牛逼轰轰的神器tcpdump.方法就是在android机器上面安装tcpdump,然后通过-w参数把抓包记录 ...

  5. Android 手机抓包

    目录 一.防抓包机制 1.1 HTTPS单向验证 1.2 HTTPS双向认证 1.3 SSL pinning 1.3.1 证书锁定(Certificate Pinning) 1.3.2 公钥锁定( P ...

  6. Charles最新破解版苹果iphone安卓android手机抓包分析教程笔记

    Charles最新破解版苹果iphone安卓android手机抓包分析教程笔记 中间遇到各种问题导致最终没法看到抓包信息,一个坑一个坑的埋,终于成功抓包小程序. 梳理了下可以尽量减少栽坑的安装过程,如 ...

  7. 几种常见网络抓包方式介绍

    几种常见网络抓包方式介绍 一.网络分流器(TAP) 二.有网管功能的小交换机 三.用两块网卡的Linux方案 四.总结 无论作为网络运维人员,还是安全渗透工程师,在工作中都会无可避免地碰到网络抓包的需 ...

  8. fiddler手机抓包教程及电脑断网的配置方法

    fiddler手机抓包教程及电脑断网的配置方法 fiddler手机抓包原理 前提条件: 设置fiddler 1.打开安装好的的fiddler,打开Tools-Options 2.HTTPS设置如下图 ...

  9. android 非root抓包,未root的Android手机抓包方法(非tcpdump)

    但是有个限制,就是抓包的机器必须获取了root权限. 所以,遇到未root的手机,tcpdump就无能为力了. 那如何抓未root的手机的包呢? 方法就是:手机连路由,抓路由的包,过滤出手机的包(好吧 ...

最新文章

  1. SVG.js 笔记 (一)
  2. win10修改mac地址
  3. 函数加上简单用户名密码认证
  4. win32创建控件的一些问题
  5. 使用Adobe Lifecycle ES将若干个word合并成一个PDF
  6. D - Yet Another Problem On a Subsequence CodeForces - 1000D (DP,组合数学)
  7. ANSI,ASCII,Unicode的区别与联系!
  8. HTML5协议的,HTML5新增协议:WebSocket协议的实例
  9. web mysql数据库的持久连接_JavaWeb连接数据库MySQL的操作技巧
  10. poj japan 数状数组解决逆序数
  11. PHP连数据库生成数据字典
  12. 服务器控制台网页登录,云服务器管理控制台登录网站
  13. USB协议详解第29讲(USB设备状态及数据交互条件)
  14. php容器下安装gd库
  15. 逻辑回归实现文本分类
  16. 数据结构(排序)2021-06-13
  17. appium远程连接---逍遥模拟器
  18. MATLAB 棋盘格图片校准
  19. 计算机老师中专教学论文,职业中专计算机教学思考论文
  20. 实战:使用Pytorch搭建分类网络(肺结节假阳性剔除)

热门文章

  1. 立创开源(基于亚特联的二路电量统计插板)
  2. WAIC 2022 | 洞见科技CTO何浩:隐私计算统一底座赋能金融数字化转型
  3. Sketchup 获取选中的模型的面数
  4. html5 网页便利贴,【实例】html5中使用localStorage实现简易的便利贴网页
  5. 便利贴--22{Avue表格自定义以及适应高度}
  6. Android Camera2相机预览画面放大缩小(数码变焦DigitalZoom)功能实现
  7. matlab 男女声识别+源码
  8. 堰流实验报告思考题_宽顶堰流实验.doc
  9. Python绘图初体验
  10. Java中的tiles_Spring mvc整合tiles框架的简单入门教程(maven)