一看杭、簡介
智能手機時代,微信異軍突起挟伙,只需耗費少數(shù)流量即可發(fā)送豐富的圖文消息楼雹,由此打敗了短信、彩信尖阔、飛信贮缅,成為人們最常用的社交App。所以設計并實現(xiàn)手機上的即時通信App介却,還是很有成就感的谴供。
二、需求分析
聊天屬于微信的基礎功能筷笨,包括單人聊天和多人聊天憔鬼,其中單人聊天簡稱私聊龟劲,多人聊天簡稱群聊。打開微信App轴或,它的底部標簽欄如圖【微信底部導航欄】所示昌跌,點擊第一個微信標簽,上面的主界面切換到聊天列表頁照雁;點擊第二個通訊錄標簽蚕愤,主界面切換到通訊錄列表頁。
點擊某個通訊錄好友饺蚊,準備給他發(fā)消息萍诱,此時打開私聊界面,可見聊天界面既能發(fā)送文本消息污呼,也能發(fā)送圖片消息裕坊,并且對方消息靠左對齊,我方消息靠右對齊燕酷。再切到聊天列表籍凝,進入某個群聊,如圖【微信的群聊界面】所示苗缩,發(fā)現(xiàn)頂部群聊名稱的右側顯示總人數(shù)饵蒂,并且大伙都能在群聊界面暢所欲言。
私聊的時候酱讶,聊天消息只發(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)聽器的注冊示例代碼: