聊天负责私人聊天,群组聊天。私人聊天接受信息后保存至数据库再转发给目标用户。群组聊天当前没有离线消息保存,也就是用户登录后无法知道多少消息未读,而是直接拉取指定数量群聊天。当有成员发送后会将聊天信息存储数据库(没有缓存进redis,因为在线用户会直接发送,目前没有这个优化必要),从redis中检索所有群组在线用户并通过消息队列发送至对应网关。

大致代码如下:

// 处理群消息
func DealGroupMsg(delivery *amqp.Delivery, transfer1 *transfer) {now := time.Now()Userid := transfer1.Idvar mess SendMessageerr := mapstructure.Decode(transfer1.Data.Data, &mess)if err != nil {fmt.Println("DealGroupMsg json err :", err)return}if mess.UserId != Userid {fmt.Println("DealGroupMsg 发送者id不一致 ", mess.UserId, "--", Userid)//  delivery.Ack(true)return}ItemId := mess.Toif mess.MsgType != GroupMessage {fmt.Println("DealGroupMsg 信息类型不一致 ", mess.MsgType, "--", Userid)// delivery.Ack(true)return}// 判断用户是否为群成员r, err := IsGroupMember(Userid, ItemId)if err != nil {fmt.Println("DealGroupMsg json err :", err)return}if !r {fmt.Println("DealGroupMsg 不属于群成员 ", mess.To, "--", Userid)//   delivery.Ack(true)return}// 获取全局idid, err := redisconn.GetGlobalID()if err != nil {fmt.Println("DealGroupMsg json err :", err)return}//fmt.Println(id)//    time.Sleep(4 * time.Second)// 获取当前时间戳ti := time.Now().UnixNano() / 1e6Msgid1 := strconv.FormatInt(ti, 10) + fmt.Sprintf("%06d", id)mess.Id = Msgid1// 将id 发送给发信息者var sendmessagereply SendMessageReplysendmessagereply.Id = Msgid1sendmessagereply.MsgReplyID = mess.MsgReplyIDsendmessagereply.To = mess.Tosendmessagereply.MsgType = GroupMessagenowtime := time.Now().UnixNano() / 1e6// 如果发送时间差值小于2S 选用发送者时间 否则选择后台时间UserSendTime, err := strconv.ParseInt(mess.SendTime, 10, 64)if err != nil {fmt.Println("DealGroupMsg", err)return}var ReplyTime stringif Abs(UserSendTime-nowtime) < 1000*2 {ReplyTime = strconv.FormatInt(UserSendTime, 10)} else {ReplyTime = strconv.FormatInt(nowtime, 10)}sendmessagereply.ReplyTime = ReplyTimevar json = jsoniter.ConfigCompatibleWithStandardLibrarydata2, err := json.Marshal(sendmessagereply)if err != nil {fmt.Println("DealGroupMsg", err)return}time11 := time.Now()err = RabbitMqPublish(mq, data2, Userid, SendGroupMsgAckReply, transfer1.From)if err != nil {fmt.Println("DealGroupMsg", err)return}fmt.Println("RabbitMqPublish", time.Now().Sub(time11))// 查询群成员//    delivery.Ack(true)var rmsg ReceiveMessagermsg.Id = Msgid1rmsg.MsgData = mess.MsgDatarmsg.MsgDataType = mess.MsgDataTypermsg.MsgType = GroupMessagermsg.To = mess.Tormsg.UserId = mess.UserIdrmsg.SendTime = ReplyTime// 使用Mysql存储起来go InsertMessages(rmsg)// err = msql.InsertChatMessage(Msgid1, mess.UserId, mess.To, mess.MsgData, mess.MsgType, mess.MsgDataType, ReplyTime)// if err != nil {//   fmt.Println("DealGroupMsg e", Msgid1, err)//  return// }fmt.Println("DealGroupMsg", time.Now().Sub(now))go DealGroupMessage(ItemId, rmsg)
}// 群成员发送信息后后续处理
func DealGroupMessage(GroupId string, Msg ReceiveMessage) {now := time.Now()// 获取群成员 在线则发送members, err := GetGroupMemberListSimply(GroupId)if err != nil {fmt.Println("DealGroupMessage", err)return}data2, err := json.Marshal(Msg)if err != nil {fmt.Println("DealGroupMessage", err)return}for _, member := range members {// 获取用户信息u, err := redisconn.RedisGetUser(member.User.Userid)if err != nil {fmt.Println("DealGroupMessage", err)continue}//如果群成员在线则发送if u.Status == OnLine {//        fmt.Println("Send")err = RabbitMqPublish(mq, data2, u.Userid, ReceiveGroupMsg, u.GateWay)if err != nil {fmt.Println("AddUserDeal", err)return}}}fmt.Println("DealGroupMessage", time.Now().Sub(now))
}

简易聊天系统-聊天服务相关推荐

  1. Java基础 项目实例五 简易聊天系统

    项目实例五 简易聊天系统 一.前置知识 二.AWT的基础使用 三.实现cardPanel卡片布局----卡片切换 四.聊天界面实现前置知识 五.GuiChat简易聊天系统(一个成熟的聊天代码) 六.W ...

  2. 简单java socket_基于Java Socket实现一个简易在线聊天功能(一)

    最近做了一个项目,其中有一个在线网页交流的需求,好久没写代码了,手都生疏了,于是先写demo练练手,分享到脚本之家平台,以此做个记录,方便自己和大家使用. 先给大家说下实现步骤分这样几大步: 1.使用 ...

  3. socket接收的消息怎么更新到页面_利用socketio实现简易即时消息服务

    背景简介 以前开发HTTP服务器更多使用的是python语言中的Flask框架来完成,但是在最近的业务中涉及到在web页面中实时获取消息更新,这个时候我能想到的解决方案 1.写一个循环ajax请求,不 ...

  4. 基于WebServices简易网络聊天工具的设计与实现

    基于WebServices简易网络聊天工具的设计与实现 Copyright 朱向洋 Sunsea ALL Right Reserved 一.项目内容 本次课程实现一个类似QQ的网络聊天软件的功能:服务 ...

  5. 老雷socket编程之PHP利用socket扩展实现聊天服务

    老雷socket编程之PHP利用socket扩展实现聊天服务 socket聊天服务原理 PHP有两个socket的扩展 sockets和streams sockets socket_create(AF ...

  6. 基于Trtc的内贸站视频聊天服务

    基于Trtc的内贸站视频聊天服务分享 说到视频聊天,大家第一个想到的是啥,QQ! 其实最早的视频聊天工具应该是 : Netmeeting(我能找到的最早聊天工具) Netmeeting是Windows ...

  7. 聊天系统:服务端 + 客户端 + web端

    为什么先看最终效果?因为此刻代码已经撸完了.更重要的是我们带着感官的目标去进行后续的分析,可以更好地理解.标题中提到了,整个工程包含三个部分: 1.聊天服务器 聊天服务器的职责一句话解释:负责接收所有 ...

  8. D1net阅闻:亚马逊引入Biba的员工和专利,据称计划推出新的视频聊天服务

    亚马逊引入Biba的员工和专利,据称计划推出新的视频聊天服务 亚马逊收购Twitch和Elemental Technologies似乎只是公司战略的两个部分,计划通过收购进行更深入的视频服务.去年,亚 ...

  9. 使用Node+websocket实现简易1v1聊天室(前端+服务器)

    使用Node+websocket实现简易1v1聊天室(前端+服务器) 前提: 安装好node环境~~~ 可使用 node -v 和 npm -v 查看是否装好 实现逻辑: 用户A 用户B 服务器 用户 ...

最新文章

  1. 数据泄露频繁,背后原因之--数据的利益
  2. Nature撤稿!三年前微软在量子计算上的巨大胜利终究是个错误
  3. python mysql安装
  4. 数据结构源码笔记(C语言):希尔插入排序
  5. .NET-记一次架构优化实战与方案-梳理篇
  6. Python3输入输出
  7. Windows下一个可与其他数据集控件结合的通用的搜索框GUSIconEdit
  8. java获取服务端mask_Java代码获取服务器所装office版本
  9. window环境下创建Flask项目需要安装常见模块命令
  10. Python数据结构实战—栈(Stack)
  11. bzoj1079 [SCOI2008]着色方案
  12. IEtester不靠谱
  13. PHP 使用session实现购物车效果(点击按钮添加数据,根据数据生成列表,删除选中的商品,点击按钮时计算金额)
  14. 给大家推荐个vs里面的小插件,自动对齐代码
  15. 使用Source Insight查看Android Framework 源码
  16. java车牌识别字符分割_opencv 车牌字符分割 ANN网络识别字符
  17. 高斯消元法求矩阵的逆
  18. 关于组长、队长和团长
  19. 2009年以前四川微型计算机设备,『2009年四川省考行测真题』2009年四川省考行测真题资料大全_2009年公务员四川省考行测真题及答案-华图教育...
  20. 4天4夜渡劫成功,解决10月1项目上线遇到的一个Mysql大坑,导致项目无法正常访问

热门文章

  1. java获取输入和运用scanner
  2. unity text不能刷新_厦门泳池派对惊喜之Carta与Unity合作新单预告派对
  3. 不存在的泳池 【GCD水题】
  4. 计算机专业基础 -- 计算机密码学基础知识
  5. 高中生计算机报纸word,电子板报(word)_高中生学习报.doc
  6. Opencv实现纵横比保持的图像缩放
  7. android arrayadapter 构造函数,Android无法解析构造函数ArrayAdapter
  8. smali语言详解之类的声明
  9. Hadoop中的FileInputFormat切片机制、FileInputFormat切片大小的参数配置、TextInputFormat、CombineTextInputFormat切片机制
  10. java中onclick的用法_JavaScript onclick事件使用方法详解