欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android 基于Socket的聊天應用實例(二)

 更新時間:2016年12月08日 09:54:52   作者:那瞬間  
本篇文章主要介紹了Android 基于Socket的聊天應用實例,具有一定的參考價值,有需要的可以了解一下。

前言

很久沒寫B(tài)LOG了,之前在寫Android聊天室的時候答應過要寫一個客戶(好友)之間的聊天demo,Android 基于Socket的聊天室已經實現了通過Socket廣播形式的通信功能。

以下是我寫的一個類似現在多數聊天軟件的冒泡聊天APP。全部功能都是自己的想法,對于現在市面上成功的例子是怎么實現的,我還不了解。所以讀者可只做參考學習,也可以分享您的案例給我。

功能

  • 一對一聊天,非聊天室
  • 好友列表
  • 好友在線,離線狀態(tài)(實時更新)
  • 冒泡實時聊天窗口
  • 發(fā)送離線信息

基本原理

之前的聊天室原理:每當客戶端Socket連接到該ServerSocket之后,程序將對應Socket加入clients集合中保存,并為該Socket啟動一條線程,該線程負責處理該Socket所有的通信任務,當服務器線程讀到客戶端數據之后,程序遍歷clients集合,并將該數據向clients集合中的每個Socket發(fā)送一次

一對一的聊天:Server通過Map把Clients的Socket都儲存起來,把Client用戶ID作為Map的key,當A發(fā)送信息給B時,服務器搜索出B的Socket,建立他們的通信通道。

服務器Server

這次我在服務器加入了2個Socket集合,一個用來處理用戶Online/Offline,另一個則專門用于處理用戶之間的通信信息傳遞

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

Clients 上線,下線動作,Server都會經過篩選然后通知其在線的好友,Clients收到好友的在線狀態(tài)然后修改Friends List。

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

關于聊天,我是通過一個自定義加密符來給每個Client做標志的,例如:Client A發(fā)出的信息,該條信息的頭部帶有一條服務器和客戶端都會識別的特殊符號,通過字符處理,找出該條信息的用戶信息;以此類推,Client A的通信對象也是用這個方法

我們找到ClientA的目標對象后,找出這個Socket通道,他們就可以一對一的對話了

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

關于離線信息,這個主要是服務器承擔的功能,我是使用mySql保存數據的。Client A 向離線狀態(tài)的Client B發(fā)送一條信息,Server會判斷Client B是否在線,如果是離線狀態(tài),服務器則把該信息先保存在mySql里;當Client B上線時,服務器會查找它的離線信息,如果有未讀信息,則會及時發(fā)送。Client B就能收到離線信息了  ( ̄ˇ ̄)   

客戶端 Clients

關于聊天,為了能夠實現同時與多個好友聊天(不同窗口線程),這里用了ContentProvider監(jiān)視聊天數據的變化,使不在當前聊天窗口的Activity也能收到好友的信息拼打印。

 //監(jiān)視聊天數據的變化
 getContentResolver().registerContentObserver(DataChangeProvider.CONTENT_URI,true, cob);

那后臺是怎么樣接收好友發(fā)來的信息的呢?上面Server里說過,有一個SocketMap的集合,而這個集合就是記錄用戶的通信Socket,當有信息的時候,客戶端后臺的WaitMsg()會接到發(fā)來的信息并做處理。

 private Runnable waitThread = new Runnable() {
 public void run() {
 System.out.println("wait running!");
 WaitMsg();
 }
 };

關于Online/Offline狀態(tài),好友列表Activity ReceiveMsg()會監(jiān)視Server發(fā)送的好友狀態(tài)信息,及時更新好友列表ListActivity。

 //更新好友數據庫
 fanDS.updateData(reMsg,name);
 //獲取好友列表
 fansArray = fanDS.getFans();
 
 friends = new Friends(fansArray,reMsg,name);
 friendList = friends.getFriends();

總結

相對聊天室而言,一對一的聊天主要是對每個Client的Socket都標志記錄起來,讓每個通訊動作有了目標對象;Server作為信使把兩者的Socket對接,使兩者可以通信聊天。

這是在 TCP/IP協議下的 C/S 模式通信方式,還有UDP協議,P2P模式下的通信方式的值得再去學習。

現在把代碼直接放上博客園,Download:demo

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • android獲取當前運行Activity名字的方法

    android獲取當前運行Activity名字的方法

    這篇文章主要介紹了android獲取當前運行Activity名字的方法,對比分析了兩種實現方法供大家選擇,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • Android利用SAX對XML進行增刪改查操作詳解

    Android利用SAX對XML進行增刪改查操作詳解

    在項目中會遇到對于XML的增刪改查,下面這篇文章主要給大家介紹了關于Android利用SAX對XML進行增刪改查操作的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-01-01
  • Android實現在屏幕上移動圖片的方法

    Android實現在屏幕上移動圖片的方法

    這篇文章主要介紹了Android實現在屏幕上移動圖片的方法,實例分析了Android操作圖片的相關技巧,需要的朋友可以參考下
    2015-06-06
  • 使用RecyclerView實現瀑布流高度自適應

    使用RecyclerView實現瀑布流高度自適應

    這篇文章主要為大家詳細介紹了使用RecyclerView實現瀑布流高度自適應,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Android實現一周時間早中晚排班表

    Android實現一周時間早中晚排班表

    項目需求需要實現一個動態(tài)添加,修改一周早中晚時間排班表,文章給大家提供了實現代碼,需要的朋友參考下吧
    2018-07-07
  • Android中判斷手機是否聯網實例

    Android中判斷手機是否聯網實例

    這篇文章主要介紹了Android中判斷手機是否聯網實例,包括xml配置文件及功能代碼的實現,需要的朋友可以參考下
    2014-10-10
  • 理解Android硬件加速原理(小白文)

    理解Android硬件加速原理(小白文)

    這篇文章主要介紹了理解Android硬件加速原理(小白文),詳細的介紹了硬件加速的概念和原理,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Android組件TabHost實現頁面中多個選項卡切換效果

    Android組件TabHost實現頁面中多個選項卡切換效果

    這篇文章主要為大家詳細介紹了Android組件TabHost實現頁面中多個選項卡切換效果的相關資料,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Android仿高德首頁三段式滑動效果的示例代碼

    Android仿高德首頁三段式滑動效果的示例代碼

    很多app都會使用三段式滑動,比如說高德的首頁和某寶等物流信息都是使用的三段式滑動方式。本文將介紹如何實現這一效果,感興趣的可以學習一下
    2022-01-01
  • android使用多線程更新ui示例分享

    android使用多線程更新ui示例分享

    在Android平臺中多線程應用很廣泛,在UI更新、游戲開發(fā)和耗時處理(網絡通信等)等方面都需要多線程,下面是一個在線程中更新UI的代碼
    2014-01-01

最新評論