Android之高仿手机QQ聊天

点我下载源码                           

转载请注明出处,谢谢!

         最终版已上传。优化下拉刷新、增加来消息声音提示、主界面改成ViewPager,实现左右滑动、新增群组、最近会话显示条数,开始上班了,不再修改了。谢谢!

        国庆这几天,闲着无聊,仿照QQ2012,做了一个基于socket的聊天工具,由于代码比较多,今天就不在文章中贴出代码,需要的朋友可以点击上面下载,谢谢,后续会详细贴出各模块代码,并解释,敬请期待,O(∩_∩)O,有什么问题或者bug,欢迎给我留言。

        首先说一下我的整体思路:整个聊天是通过服务器转发的,这样处理起来比较简单,但是服务器压力会特别大。建议在真正做项目的时候,服务器只处理用户注册、登录以及判断用户是否掉线等,至于聊天、传文件以及视频等就在用户之间单独建立连接,这样可以大大减少服务器的压力,我这里就没考虑这么多了。

        第一:我们定义一个超级消息对象(记得要序列化),它包含:消息类型、具体的消息对象、发送给谁以及来自谁。服务器和客户端就是通过发送这个超级消息对象来进行通讯的。

        第二:服务器,在接受用户连接之后,马上把socket丢入线程池中,这样可以支持多用户并发访问,然后根据用户的socket对象,分别建立一条读消息线程写消息线程在这里,写消息线程要先建立,我们需要传递给读消息线程,因为我们在读完消息之后会给用户回复消息)。在读消息线程里面根据消息类型处理超级消息对象,分别是:注册、登录、下线、转发消息、文件、刷新好友列表等。后台数据库处理的话,我们通过dao模式,这样很方便,而且会使代码显得简洁、明了、有条理,总之是各种好,哈哈。最后要注意一点:因为我们是转发消息,所以在用户登录成功后,我们需要把该用户的写消息线程根据用户的ID存入一个Map中,以便在转发消息的时候,可以根据用户ID取出对应的写消息线程,从而实现转发消息。

       第三:客户端,跟服务器类似,只是没有线程池,在用户连接上服务器之后,也是根据连接后的socket对象,分别建立一条读消息线程写消息线程然后在代码中哪里需要发消息,就通过get方法获取写消息线程,哪里需要读消息,就通过get方法获取读消息线程

        第四:关于写消息线程处理,因为服务器或者客户端,不可能时时需要写消息,因此我们如果用一个死循环去处理写线程,明显的是不明智的,因此我做了一个简单的处理,在写消息的死循环中先wait(),当我们调用写消息线程的setMessage方法后,就notify唤醒写线程,发送完消息之后,继续wait(),这里我贴出核心代码:

 public void setMsg(TranObject msg) {
this.msg = msg;
synchronized (this) {
notify();
}
}
@Override
public void run() {
try {
while (isStart) {
if (msg != null) {
oos.writeObject(msg);
oos.flush();
if (msg.getType() == TranObjectType.LOGOUT) {// 如果是发送下线的消息,就直接跳出循环
break;
}}
synchronized (this) {
wait();// 发送完消息后,线程进入等待状态
}
}
oos.close();// 循环结束后,关闭输出流和socket
if (socket != null)
socket.close();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}


        第五:具体手机客户端的处理,因为android有自己的特点,也有自己的优势,所以我们要充分利用它的优势,避开他的缺点来处理消息,我说一下我在这个小项目中处理消息的思路:我在用户启动程序的时候,开启一个获取消息的service,在该service中建立连接,然后通过一个接口去监听读消息线程收到的消息,在收到消息的同时,把该超级消息对象通过广播发送出去然后自定义一个抽象的MyActivity继承Activity,在MyActivity里面通过一个广播接收者接收service中发送过来的消息,并通过一个抽象方法传递给子Activity,我们的其他activity如果要处理收消息,就可以继承我们自定义的MyActivity,然后实现那个抽象方法,就可以了这样很好的处理了不同的activity接收消息的缺点,而且后台处理也很方便,我不知道腾讯QQ在这个方面是怎么处理的,这是我个人的想法而已。下面贴出MyActivity的代码:

/**
* 自定义一个抽象的MyActivity类,每个Activity都继承他,实现消息的接收(优化性能,减少代码重复)
* 
* @author way
* 
*/
public abstract class MyActivity extends Activity {
/**
* 广播接收者,接收GetMsgService发送过来的消息
*/
private BroadcastReceiver MsgReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
TranObject msg = (TranObject) intent
.getSerializableExtra(Constants.MSGKEY);
if (msg != null) {//如果不是空,说明是消息广播
// System.out.println("MyActivity:" + msg);
getMessage(msg);// 把收到的消息传递给子类
} else {//如果是空消息,说明是关闭应用的广播
close();
}
}
};
/**
* 抽象方法,用于子类处理消息,
* 
* @param msg
*            传递给子类的消息对象
*/
public abstract void getMessage(TranObject msg);
/**
* 子类直接调用这个方法关闭应用
*/
public void close() {
Intent i = new Intent();
i.setAction(Constants.ACTION);
sendBroadcast(i);
finish();
}
@Override
public void onStart() {// 在start方法中注册广播接收者
super.onStart();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Constants.ACTION);
registerReceiver(MsgReceiver, intentFilter);// 注册接受消息广播
}
@Override
protected void onStop() {// 在stop方法中注销广播接收者
super.onStop();
unregisterReceiver(MsgReceiver);// 注销接受消息广播
}
}

 

       好了,大概思路就是这样的,下面根据具体的测试截图,说说我的思路:

1.桌面快捷方式                                                                         2.欢迎界面

        

 

3.正在登陆                                                                                 4.登陆成功后的好友列表,通过ViewPager实现

       

 

5.好友列表是自定义的ExpandableListView,可以下拉刷新        6.群组聊天功能暂未实现

                  

 

7.聊天主界面,                                                                           8.ViewPager实现左右滑动

      

 

9.最近会话显示                                                                        10.未进入聊天界面时,来消息提醒,并保存数据库

       

 

11.后台运行来消息时提醒,有声音有振动,左图为收到新消息,右图为无新消息时状态,

  

 

12.后台数据库(上:user表,下:好友列表),密码通过MD5方式加密了,用户注册成功后,即生成一个以用户id命名的表,用来保存好友。

 

 

13.服务器运行提示

 

14.注册状态已经成功后的提示

 

 

最后来几张聊天截图,好了今天就到这里,后续会继续跟大家分享其他各个小模块的具体实现,先休息一下,玩两天,马上要上班了,吼吼....

 

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

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

相关文章

周董新歌搞崩QQ,抓取20W评论看看歌迷在说啥

9 月 16 日晚间,周董在朋友圈发布了最新单曲《说好不哭》 发布后,真的让一波人哭了 一群想抢鲜听的小伙伴直接泪奔 因为 QQ 音乐直接被搞崩了 没想到干翻 QQ 音乐的不是网易云音乐 也不是虾米音乐 而是周董! 周董成成功地凭一己之力干翻…

ChatGPT 可视化2D嵌入

我们将使用 t-SNE 将嵌入的维数从 1536 减少到 2。一旦嵌入减少到二维,我们就可以在二维散点图中绘制它们。 数据集在 Obtain_dataset Notebook 中创建。 1.降维 我们使用 t-SNE 分解将维度降为 2 维。 import pandas as pd from sklearn.manifold import TSNE i…

【基于Mediapipe与Unity的人体姿态捕捉系统】

基于Mediapipe与Unity的人体姿态捕捉系统 1. 工程整体介绍2. 基于Mediapipe的人体姿态估计2.1 环境搭建2.2 代码片段2.3 结果展示2.4 结果分析2.5 本章总结 3. 基于Unity的人体姿态展示3.1 Unity 人体骨骼动画3.2 Mediapipe坐标到Unity的映射 4. 从Mediapipe到Unity的数据传递4…

Hugging Face 模型下载方法一览。

huggingface可谓是深度学习里 最重要的社区之一了。 里面有无数个我们需要的模型和代码。近年来,知名的模型都会在huggingFace里先放一份代码和模型参数。 我们要做的就是下载这些模型。 以Bert为例。 bert-base-chinese at main 这是bert的网址。 截图可以看到有…

如何用3D软件做好人头建模?

一般头部建模有两种方法 1、用box调整出头部轮廓然后细调整; 2、用面片挤压,逐步挤压出整个面部,这里用第一种方法,直观感觉较快 形体初始准备阶段 1、 创建一个长方体 2、 将长方体改为长、宽、高都相同的正方体 3、 将正方…

3D软件开发工具HOOPS全套产品开发介绍 | HOOPS Exchange、HOOPS Communicator

一、概述HOOPS产品主要应用于3D模型的转换、显示、处理和发布,包括HOOPS Exchange、HOOPS Communicator、HOOPS Visualize和HOOPS Publish等4种产品,其中: HOOPS Exchange主要应用于模型的文件格式转换。HOOPS Communicator主要应用于WEB端模…

淘宝APP用户行为数据分析案例(附python代码及注释)

淘宝APP用户行为数据分析案例 一.分析背景与目的 1.1背景与数据限制 电商平台的最核心的功能就是为买卖双方提供高效和体验良好的交易服务。得益于算法技术的发展,淘宝APP给买方提供了搜索、推荐及广告等系统和功能,使用户能高效地触达感兴…

【Python爬虫+数据分析】采集电商平台数据信息,并做可视化演示

文章目录 前言一、准备工作二、分析目标网站1.商品信息 三、编写爬虫程序五、总结 前言 随着电商平台的兴起,越来越多的人开始在网上购物。而对于电商平台来说,商品信息、价格、评论等数据是非常重要的。因此,抓取电商平台的商品信息、价格、…

利用Python进行词频统计并生成词云——以京东商城iphone13购物评论为例

本文介绍一种快速生成关键词-词频统计-词云生成的办法,作为Python数据分析初级技能,除基本运行环境外无需其他软件或工具,且流程搭建成功后可重复利用,可极大提升相似事务的处理效率。 一、操作环境 1.1 搭建Python运行环境&#…

Python爬虫+可视化分析技术实现招聘网站岗位数据抓取与分析推荐系统

程序主要采用Python 爬虫flask框架htmljavascript实现岗位推荐分析可视化系统,实现工作岗位的实时发现,推荐检索,快速更新以及工作类型的区域分布效果,关键词占比分析等。 程序模块实现 工作范围分布 岗位区域分布 岗位技术情况…

API接口调用,获取淘宝天猫,拼多多,1688等平台商品详情,python采集爬虫数据

Python技术 爬虫(又称为网页蜘蛛,网络机器人,在 FOAF 社区中间,更经常的称为网页追逐者);它是一种按照一定的规则,自动地抓取网络信息的程序或者脚本。 如果我们把互联网比作一张大的蜘蛛网&a…

使用python爬取BOSS直聘岗位数据并做可视化(Boss直聘对网页做了一些修改,现在的代码已经不能用了)

使用python爬取BOSS直聘岗位数据并做可视化 结果展示首页岗位信息岗位详情薪资表学历需求公司排名岗位关键词福利关键词 代码展示爬虫代码一、导入库二、爬取数据1、爬取数据代码展示2、通过selenium打开浏览器(1)打开网页(2)找到…

用Python对淘宝用户行为数据的分析

目录 项目前言 一、分析目的 二、数据获取与理解 1.数据来源 2.理解数据 三、具体做法 1.导入并清洗数据 3.1.1.把时间戳改为datetime类型 3.1.2.查看是否存在重复的行数据 3.1.3.查看列中是否存在缺失数据 2.用户维度 3.2.1.一个月内每天pv、uv的变化 ​3.2.2.日A…

小白也可以开发闲鱼自动化工具(自动找爆款)

在闲鱼上,我们的课程里面教给大家,如何找爆款,主要是看数据,分析,那么这个分析过程,能否自动化下? 事实是可以的。这个是这几天写的一个,自动化分析电脑这个词下面的一些爆款&#x…

基于Python+网络爬虫的兼职招聘就业信息数据可视化分析

🔥作者:雨晨源码🔥 💖简介:java、微信小程序、安卓;定制开发,远程调试 代码讲解,文档指导,ppt制作💖 精彩专栏推荐订阅:在下方专栏👇&…

Python抓取电商平台数据 / 采集商品评论 / 可视化展示 词云图...

前言 大家早好、午好、晚好吖 ❤ ~ 我给大家准备了一些资料,包括: 2022最新Python视频教程、Python电子书10个G (涵盖基础、爬虫、数据分析、web开发、机器学习、人工智能、面试题)、Python学习路线图等等 直接在文末名片自取即可&#x…

chatgpt赋能python:Python简单数据采集教程:提高SEO排名的必要工具

Python简单数据采集教程:提高SEO排名的必要工具 在当前数字化时代下,数据已经成为商业流量和营销策略中至关重要的交易资源。因此,数据采集成为了提高SEO排名的必要手段之一。现在,Python由于其强大的数据处理能力被广泛应用于数…

利用 Python 爬虫采集 1688商品详情关键词数据-API

要利用 Python 爬虫采集 1688 商品详情数据,需要先了解 1688 网站的页面结构和数据请求方式。一般使用 requests 库请求网站的数据,使用 BeautifulSoup 库解析网页中的数据。 以下是一个简单的 Python 爬虫采集 1688 商品详情数据的示例代码&#xff1a…

英特尔淘汰迷你电脑,宣布放弃 NUC 业务!

整理 | 屠敏 出品 | CSDN(ID:CSDNnews) 相比造芯这件事,也许有很多人不知道全球知名半导体公司英特尔还在造电脑。 只是有些遗憾的是,据外媒 ServetheHome 报道,英特尔已经开始通知其生态系统的合作伙伴们&…

Web版和客户端哪种SQL工具更好?ChatGPT有话要说

2023年年初公司发布了一款Web版SQL工具,短期内就赢得了众多用户的喜爱和下载。不过,也有SQL用户在评论区中提出自己的观点,认为Web版工具都不可靠,甚至看见Web版工具就劝返… … 工具Web化逐渐成为一种趋势,比如&…