Android 即时通信(三)仿微信的私聊和群聊APP

一、简介
智能手机时代,微信异军突起,只需耗费少数流量即可发送丰富的图文消息,由此打败了短信、彩信、飞信,成为人们最常用的社交App。所以设计并实现手机上的即时通信App,还是很有成就感的。
二、需求分析
聊天属于微信的基础功能,包括单人聊天和多人聊天,其中单人聊天简称私聊,多人聊天简称群聊。打开微信App,它的底部标签栏如图【微信底部导航栏】所示,点击第一个微信标签,上面的主界面切换到聊天列表页;点击第二个通讯录标签,主界面切换到通讯录列表页。


微信底部导航栏.jpg

点击某个通讯录好友,准备给他发消息,此时打开私聊界面,可见聊天界面既能发送文本消息,也能发送图片消息,并且对方消息靠左对齐,我方消息靠右对齐。再切到聊天列表,进入某个群聊,如图【微信的群聊界面】所示,发现顶部群聊名称的右侧显示总人数,并且大伙都能在群聊界面畅所欲言。


微信群聊界面.jpg

私聊的时候,聊天消息只发给对方;群聊的时候,该群的所有成员都会收到群消息。
三、功能分析
即时通信(Instant Message,IM)有两个意思:第一个是通信,也就是传输消息,至少支持包含文字与图片在内的图文消息;第二个是即时,也叫实时,发出来的消息要马上送到对方那里,一刻都不能耽搁。即时通信的特性决定了它没法采用基于短连接的HTTP协议,而必须采用基于长连接的网络协议,比如Socket、MQTT、IMPP、XMPP等,其中又以Socket最为基础。
即时通信工具首先是一个工具,由于它面向最终用户,因此要求方便易用,符合人们的使用习惯才行。从用户界面到后台服务,即时通信工具主要集成了如下App技术:
(1)底部导航栏:主界面底部的一排标签按钮,用于控制切换到哪个页面,该标签栏可结合RadioGroup与ViewPager自定义实现。

(2)列表控件:无论是好友列表还是群聊列表,都从上到下依次排列,可采用列表视图ListView或者基于线性布局管理器的循环视图RecyclerView。
(3)输入对话框:个人信息页面修改用户昵称,需要在弹窗中填入新昵称,而在对话框中输入文字信息,用到了第4章介绍的InputDialog。
(4)圆角矩形:好友列表与聊天界面中的用户头像,经过了圆角矩形裁剪,看起来更亲切更柔和。
(5)Socket通信:聊天消息实时传给对方,需要采取Socket通信与后端服务器交互,为降低编码复杂程度,客户端与服务端均需集成第三方的SocketIO库。
(6)移动数据格式JSON:传输聊天内容时,需要把图文消息封装为JSON格式,以便数据解析与结构扩展。
(7)仿微信聊天还需要与之配合的Socket服务器,所以需要实现Socket服务器。
四、仿微信聊天的Socket通信,因为涉及客户端与服务端的交互,所以通信流程有些复杂,主要划分为下列4个功能:
1、服务端的Socket连接管理
Socket服务器对各个客户端的管理操作主要包括如下3类:
(1)人员上线、人员下线。人员上线时,需要把该人员保存至人员映射表(即对应表);人员下线时,需要从人员映射表删除该人员。
(2)人员入群、人员退群。人员入群时,需要把该人员添加至群成员映射表;人员退群时,需要从群成员映射表删除该人员。
(3)发送文本消息、发送图片消息。对于私聊消息,只要把文本或图片转发给目标人员即可;对于群聊消息,则需把文本或图片转发给当前群的所有成员(消息发送者除外)。
按照上面管理操作的描述,首先声明几个映射对象,用于保存相关的实体数据,声明代码如下所示:

 // 客户端映射表
 private static Map<String, SocketIOClient> clientMap = new HashMap<>();
 // 人员名字映射表
 private static Map<String, String> nameMap = new HashMap<>();
 // 群名称与群成员映射表
 private static Map<String, Map<String, String>> groupMap = new HashMap<>();

接着给服务端的main方法补充以上管理操作对应的事件监听器,这些监听器的注册示例代码:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,271评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,725评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,252评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,634评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,549评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,985评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,471评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,128评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,257评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,233评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,235评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,940评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,528评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,623评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,858评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,245评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,790评论 2 339

推荐阅读更多精彩内容