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

一看杭、簡介
智能手機時代,微信異軍突起挟伙,只需耗費少數(shù)流量即可發(fā)送豐富的圖文消息楼雹,由此打敗了短信、彩信尖阔、飛信贮缅,成為人們最常用的社交App。所以設計并實現(xiàn)手機上的即時通信App介却,還是很有成就感的谴供。
二、需求分析
聊天屬于微信的基礎功能筷笨,包括單人聊天和多人聊天憔鬼,其中單人聊天簡稱私聊龟劲,多人聊天簡稱群聊。打開微信App轴或,它的底部標簽欄如圖【微信底部導航欄】所示昌跌,點擊第一個微信標簽,上面的主界面切換到聊天列表頁照雁;點擊第二個通訊錄標簽蚕愤,主界面切換到通訊錄列表頁。


微信底部導航欄.jpg

點擊某個通訊錄好友饺蚊,準備給他發(fā)消息萍诱,此時打開私聊界面,可見聊天界面既能發(fā)送文本消息污呼,也能發(fā)送圖片消息裕坊,并且對方消息靠左對齊,我方消息靠右對齊燕酷。再切到聊天列表籍凝,進入某個群聊,如圖【微信的群聊界面】所示苗缩,發(fā)現(xiàn)頂部群聊名稱的右側顯示總人數(shù)饵蒂,并且大伙都能在群聊界面暢所欲言。


微信群聊界面.jpg

私聊的時候酱讶,聊天消息只發(fā)給對方退盯;群聊的時候,該群的所有成員都會收到群消息泻肯。
三渊迁、功能分析
即時通信(Instant Message,IM)有兩個意思:第一個是通信软免,也就是傳輸消息宫纬,至少支持包含文字與圖片在內的圖文消息焚挠;第二個是即時膏萧,也叫實時,發(fā)出來的消息要馬上送到對方那里蝌衔,一刻都不能耽擱榛泛。即時通信的特性決定了它沒法采用基于短連接的HTTP協(xié)議,而必須采用基于長連接的網絡協(xié)議噩斟,比如Socket曹锨、MQTT、IMPP剃允、XMPP等沛简,其中又以Socket最為基礎齐鲤。
即時通信工具首先是一個工具,由于它面向最終用戶椒楣,因此要求方便易用给郊,符合人們的使用習慣才行。從用戶界面到后臺服務捧灰,即時通信工具主要集成了如下App技術:
(1)底部導航欄:主界面底部的一排標簽按鈕淆九,用于控制切換到哪個頁面,該標簽欄可結合RadioGroup與ViewPager自定義實現(xiàn)毛俏。

(2)列表控件:無論是好友列表還是群聊列表炭庙,都從上到下依次排列,可采用列表視圖ListView或者基于線性布局管理器的循環(huán)視圖RecyclerView煌寇。
(3)輸入對話框:個人信息頁面修改用戶昵稱焕蹄,需要在彈窗中填入新昵稱,而在對話框中輸入文字信息阀溶,用到了第4章介紹的InputDialog擦盾。
(4)圓角矩形:好友列表與聊天界面中的用戶頭像,經過了圓角矩形裁剪淌哟,看起來更親切更柔和迹卢。
(5)Socket通信:聊天消息實時傳給對方,需要采取Socket通信與后端服務器交互徒仓,為降低編碼復雜程度腐碱,客戶端與服務端均需集成第三方的SocketIO庫。
(6)移動數(shù)據(jù)格式JSON:傳輸聊天內容時掉弛,需要把圖文消息封裝為JSON格式症见,以便數(shù)據(jù)解析與結構擴展。
(7)仿微信聊天還需要與之配合的Socket服務器殃饿,所以需要實現(xiàn)Socket服務器谋作。
四、仿微信聊天的Socket通信乎芳,因為涉及客戶端與服務端的交互遵蚜,所以通信流程有些復雜,主要劃分為下列4個功能:
1?服務端的Socket連接管理
Socket服務器對各個客戶端的管理操作主要包括如下3類:
(1)人員上線奈惑、人員下線吭净。人員上線時,需要把該人員保存至人員映射表(即對應表)肴甸;人員下線時寂殉,需要從人員映射表刪除該人員。
(2)人員入群原在、人員退群友扰。人員入群時彤叉,需要把該人員添加至群成員映射表;人員退群時村怪,需要從群成員映射表刪除該人員姆坚。
(3)發(fā)送文本消息、發(fā)送圖片消息实愚。對于私聊消息兼呵,只要把文本或圖片轉發(fā)給目標人員即可;對于群聊消息腊敲,則需把文本或圖片轉發(fā)給當前群的所有成員(消息發(fā)送者除外)击喂。
按照上面管理操作的描述,首先聲明幾個映射對象碰辅,用于保存相關的實體數(shù)據(jù)懂昂,聲明代碼如下所示:

 // 客戶端映射表
 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方法補充以上管理操作對應的事件監(jiān)聽器,這些監(jiān)聽器的注冊示例代碼:

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末没宾,一起剝皮案震驚了整個濱河市凌彬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌循衰,老刑警劉巖铲敛,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異会钝,居然都是意外死亡伐蒋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門迁酸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來先鱼,“玉大人,你說我怎么就攤上這事奸鬓”号希” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵串远,是天一觀的道長宏多。 經常有香客問我,道長抑淫,這世上最難降的妖魔是什么绷落? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮始苇,結果婚禮上,老公的妹妹穿的比我還像新娘筐喳。我一直安慰自己催式,他們只是感情好函喉,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荣月,像睡著了一般管呵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上哺窄,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天捐下,我揣著相機與錄音,去河邊找鬼萌业。 笑死坷襟,一個胖子當著我的面吹牛,可吹牛的內容都是我干的生年。 我是一名探鬼主播婴程,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼抱婉!你這毒婦竟也來了档叔?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蒸绩,失蹤者是張志新(化名)和其女友劉穎衙四,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體患亿,經...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡届搁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了窍育。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卡睦。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖漱抓,靈堂內的尸體忽然破棺而出表锻,到底是詐尸還是另有隱情,我是刑警寧澤乞娄,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布瞬逊,位于F島的核電站,受9級特大地震影響仪或,放射性物質發(fā)生泄漏确镊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一范删、第九天 我趴在偏房一處隱蔽的房頂上張望蕾域。 院中可真熱鬧,春花似錦、人聲如沸旨巷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽采呐。三九已至若锁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間斧吐,已是汗流浹背又固。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留煤率,地道東北人仰冠。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像涕侈,于是被迫代替她去往敵國和親沪停。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內容