简易聊天系统-聊天服务

14 篇文章 1 订阅
9 篇文章 2 订阅

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

大致代码如下:

// 处理群消息
func DealGroupMsg(delivery *amqp.Delivery, transfer1 *transfer) {
	now := time.Now()

	Userid := transfer1.Id
	var mess SendMessage
	err := 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.To
	if 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
	}
	// 获取全局id
	id, 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() / 1e6
	Msgid1 := strconv.FormatInt(ti, 10) + fmt.Sprintf("%06d", id)
	mess.Id = Msgid1
	// 将id 发送给发信息者
	var sendmessagereply SendMessageReply
	sendmessagereply.Id = Msgid1
	sendmessagereply.MsgReplyID = mess.MsgReplyID
	sendmessagereply.To = mess.To
	sendmessagereply.MsgType = GroupMessage
	nowtime := time.Now().UnixNano() / 1e6
	// 如果发送时间差值小于2S 选用发送者时间 否则选择后台时间
	UserSendTime, err := strconv.ParseInt(mess.SendTime, 10, 64)
	if err != nil {
		fmt.Println("DealGroupMsg", err)
		return
	}
	var ReplyTime string
	if Abs(UserSendTime-nowtime) < 1000*2 {
		ReplyTime = strconv.FormatInt(UserSendTime, 10)
	} else {
		ReplyTime = strconv.FormatInt(nowtime, 10)
	}
	sendmessagereply.ReplyTime = ReplyTime
	var json = jsoniter.ConfigCompatibleWithStandardLibrary
	data2, 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 ReceiveMessage
	rmsg.Id = Msgid1
	rmsg.MsgData = mess.MsgData
	rmsg.MsgDataType = mess.MsgDataType
	rmsg.MsgType = GroupMessage
	rmsg.To = mess.To
	rmsg.UserId = mess.UserId
	rmsg.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))
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux简易多人聊天可以通过使用Socket编程实现。首先需要创建一个服务器程序,用于接收客户端的连接请求,并将其加入到聊天室中。然后,客户端程序可以连接到服务器,并发送消息给其他客户端。服务器程序可以将接收到的消息广播给所有连接到服务器的客户端。这样,多个客户端就可以在同一个聊天室中进行实时聊天了。 ### 回答2: Linux简易多人聊天是指在Linux操作系统上实现多个用户之间进行即时通信的功能。 要实现多人聊天功能,可以使用Socket编程。首先,需要建立一个聊天服务器,用户可以连接到服务器并与其他用户进行交流。用户可以发送消息给服务器,服务器收到消息后将其传递给其他已连接的用户。 在服务器端,可以使用套接字编程来监听来自用户的连接请求,并在连接成功后创建一个新的线程来处理该用户的消息。服务器端还需要维护一个用户列表,以及收集和分发用户发送的消息。 在客户端,用户可以通过套接字建立与服务器的连接,并发送和接收消息。客户端可以显示其他用户发送的消息,并可以通过输入框发送消息给服务器。 为了实现简易多人聊天功能,需要考虑以下几点: 1. 用户身份验证:可以要求用户在连接服务器之前进行身份验证,以确保只有合法用户可以参与聊天。 2. 用户列表维护:服务器必须跟踪已连接的用户,并将新用户添加到列表中,同时在用户断开连接后将其移除。 3. 消息广播:服务器必须将接收到的消息广播给其他已连接的用户,以实现多人聊天的效果。 4. 编码解码:需要定义一种协议来对消息进行编码和解码,以确保消息能够在服务器和客户端之间正确传递。 总而言之,Linux简易多人聊天需要在服务器端实现用户连接与消息分发,并在客户端实现与服务器的通信和消息展示。通过使用Socket编程和合适的协议,可以实现一个简单的多人聊天系统。 ### 回答3: 在Linux上实现简易多人聊天可以使用Socket编程。首先,需要创建一个服务器程序和多个客户端程序。 服务器程序的主要功能是接收来自客户端的连接请求,然后将收到的消息广播给其他所有已连接的客户端。服务器程序通过监听一个指定的端口,接收来自客户端的连接。一旦有新的连接请求到来,服务器接受该连接,并为该连接创建一个新的进程或线程来处理与之通信的任务。 客户端程序的主要功能是向服务器发送消息,并接收服务器广播的消息。客户端程序首先需要连接到服务器指定的IP地址和端口号,然后通过套接字向服务器发送消息。当有新的消息从服务器传输过来时,客户端程序接收并显示该消息。 通过Linux的socket编程实现简易多人聊天涉及到以下主要步骤: 1. 创建服务器端程序:首先,需要创建一个服务器程序,包括创建套接字、绑定IP地址和端口号以及监听连接请求等操作。 2. 创建客户端程序:接下来,创建多个客户端程序,包括创建套接字、连接到服务器以及发送和接收消息等操作。 3. 服务器程序处理连接请求:服务器程序通过accept函数接受连接请求,并调用fork函数创建子进程或者pthread_create函数创建线程来处理与客户端的通信。 4. 服务器程序广播消息:当服务器接收到来自某个客户端的消息时,服务器将该消息广播给所有其他连接的客户端。 5. 客户端发送和接收消息:客户端程序通过套接字向服务器发送消息,并通过套接字接收服务器广播的消息。 以上是一个简易多人聊天系统的主要实现步骤,可以根据实际需求进行进一步的功能扩展和定制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值