Android 基于Socket的聊天应用实例(二)

 更新时间:2016年12月08日 09:54:52   作者:那瞬间  
本篇文章主要介绍了Android 基于Socket的聊天应用实例,具有一定的参考价值,有需要的可以了解一下。

前言

很久没写BLOG了,之前在写Android聊天室的时候答应过要写一个客户(好友)之间的聊天demo,Android 基于Socket的聊天室已经实现了通过Socket广播形式的通信功能。

以下是我写的一个类似现在多数聊天软件的冒泡聊天APP。全部功能都是自己的想法,对于现在市面上成功的例子是怎么实现的,我还不了解。所以读者可只做参考学习,也可以分享您的案例给我。

功能

  • 一对一聊天,非聊天室
  • 好友列表
  • 好友在线,离线状态(实时更新)
  • 冒泡实时聊天窗口
  • 发送离线信息

基本原理

之前的聊天室原理:每当客户端Socket连接到该ServerSocket之后,程序将对应Socket加入clients集合中保存,并为该Socket启动一条线程,该线程负责处理该Socket所有的通信任务,当服务器线程读到客户端数据之后,程序遍历clients集合,并将该数据向clients集合中的每个Socket发送一次

一对一的聊天:Server通过Map把Clients的Socket都储存起来,把Client用户ID作为Map的key,当A发送信息给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收到好友的在线状态然后修改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发出的信息,该条信息的头部带有一条服务器和客户端都会识别的特殊符号,通过字符处理,找出该条信息的用户信息;以此类推,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 向离线状态的Client B发送一条信息,Server会判断Client B是否在线,如果是离线状态,服务器则把该信息先保存在mySql里;当Client B上线时,服务器会查找它的离线信息,如果有未读信息,则会及时发送。Client B就能收到离线信息了  ( ̄ˇ ̄)   

客户端 Clients

关于聊天,为了能够实现同时与多个好友聊天(不同窗口线程),这里用了ContentProvider监视聊天数据的变化,使不在当前聊天窗口的Activity也能收到好友的信息拼打印。

 //监视聊天数据的变化
 getContentResolver().registerContentObserver(DataChangeProvider.CONTENT_URI,true, cob);

那后台是怎么样接收好友发来的信息的呢?上面Server里说过,有一个SocketMap的集合,而这个集合就是记录用户的通信Socket,当有信息的时候,客户端后台的WaitMsg()会接到发来的信息并做处理。

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

关于Online/Offline状态,好友列表Activity ReceiveMsg()会监视Server发送的好友状态信息,及时更新好友列表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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Flutter自定义Appbar搜索框效果

    Flutter自定义Appbar搜索框效果

    这篇文章主要为大家详细介绍了Flutter自定义Appbar搜索框,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • Android开发中获取View视图宽与高的常用方法小结

    Android开发中获取View视图宽与高的常用方法小结

    这篇文章主要介绍了Android开发中获取View视图宽与高的常用方法,结合实例形式总结分析了Android获取View视图宽与高的三种常用方法及使用场景,需要的朋友可以参考下
    2017-10-10
  • Android Handler 原理分析及实例代码

    Android Handler 原理分析及实例代码

    这篇文章主要介绍了Android Handler 原理分析及实例代码的相关资料,需要的朋友可以参考下
    2017-02-02
  • Android 如何查看Wifi密码

    Android 如何查看Wifi密码

    这篇文章主要介绍了Android 如何查看Wifi密码的相关资料,需要的朋友可以参考下
    2017-01-01
  • Android自定义控件仿ios下拉回弹效果

    Android自定义控件仿ios下拉回弹效果

    这篇文章主要为大家详细介绍了Android自定义控件仿ios下拉回弹效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • Android开发中的数据库事务用法分析

    Android开发中的数据库事务用法分析

    这篇文章主要介绍了Android开发中的数据库事务用法,分析了Android数据库事务的功能、使用方法与相关注意事项,需要的朋友可以参考下
    2016-06-06
  • php使用phpmailer发送邮件实例解析

    php使用phpmailer发送邮件实例解析

    这篇文章主要为大家详细解析了php使用phpmailer发送邮件实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • Android模仿美团顶部的滑动菜单实例代码

    Android模仿美团顶部的滑动菜单实例代码

    最近在工作遇到一个需要,要做一个滑动菜单,实现的效果类似美团顶部的滑动菜单,所以下面这篇文章主要给大家介绍了关于Android如何模仿美团顶部滑动菜单的相关资料,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-08-08
  • Flutter GridView显示随机单词效果

    Flutter GridView显示随机单词效果

    这篇文章主要为大家详细介绍了Flutter GridView显示随机单词效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • android递归压缩上传多张图片到七牛的实例代码

    android递归压缩上传多张图片到七牛的实例代码

    本篇文章主要介绍了android递归压缩上传多张图片到七牛的实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08

最新评论