聊天负责私人聊天,群组聊天。私人聊天接受信息后保存至数据库再转发给目标用户。群组聊天当前没有离线消息保存,也就是用户登录后无法知道多少消息未读,而是直接拉取指定数量群聊天。当有成员发送后会将聊天信息存储数据库(没有缓存进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. vagrant 介绍,安装与使用
  2. SAP Basis 日常管理
  3. 全桥整流等效负载阻抗是多少?
  4. Android之自定义AlertDialog的实现方法(一)
  5. 一站式服务!图片+代码-构建移动版旅游网站页面
  6. linux那些事之 page translation(硬件篇)
  7. 负载均衡研究 基础
  8. Memcached在Windows下的安装
  9. 第1章 Ext JS快速入门示例[4/4]
  10. 处理一些常见的跨浏览器封装的函数
  11. DRL实战 : 强化学习在广告点击业务中的应用
  12. 计算机等级二级c语言考试真题,历年计算机等级考试二级C语言上机真题及答案..pdf...
  13. bom管理软件,支持版本控制,bom比对
  14. 利用Jenkins pipeline配置测试工具
  15. Day17:web前端开发面试题
  16. FFmpeg: 通过ffplay给视频加字幕
  17. MYSQL 知己知彼百战百胜 从MYSQL 8.019 说起
  18. C# .net微软OAuth身份验证在EWS中的应用
  19. [Python]处理压缩文件
  20. android手机联系人怎么备份软件,安卓手机怎么导入手机通讯录(转移通讯录的3种方法)...

热门文章

  1. E-R模型转换为关系模型
  2. 关于css hover动效边缘触发频繁闪动的解决方案
  3. rdkafka线程过多_kafka producer性能调优
  4. 道法自然一:初来乍到
  5. 单片机 + 4G模块7S1上有人云平台自己添加变量进行温度采集,将数据发送有人云平台
  6. Android bindService服务
  7. 一个源于地下龙的游戏创建角色程序
  8. Repeater控件嵌套Repeater控件
  9. 德鲁伊连接mysql数据库_Druid(德鲁伊)连接数据库
  10. 使用 C++11 智能指针时要避开的 10 大错误