处理单聊消息的是PeerClient
,它继承自Connection
。
type PeerClient struct {
*Connection
}
PeerClient只处理三种类型的消息:
func (client *PeerClient) HandleMessage(msg *Message) {
switch msg.cmd {
case MSG_IM:
client.HandleIMMessage(msg)
case MSG_RT:
client.HandleRTMessage(msg)
case MSG_UNREAD_COUNT:
client.HandleUnreadCount(msg.body.(*MessageUnreadCount))
case MSG_SYNC:
client.HandleSync(msg.body.(*SyncKey))
case MSG_SYNC_KEY:
client.HandleSyncKey(msg.body.(*SyncKey))
}
}
处理实时消息,直接将消息通过SendMessage发送到指定目的终端。
func (client *PeerClient) HandleRTMessage(msg *Message) {
rt := msg.body.(*RTMessage)
if rt.sender != client.uid {
//校验uid
return
}
//使用SendMessage直接发送消息,不进行消息的持久化
m := &Message{cmd:MSG_RT, body:rt}
client.SendMessage(rt.receiver, m)
atomic.AddInt64(&server_summary.in_message_count, 1)
}
终端会通过MSG_UNREAD_COUNT消息来设置未读消息数量,最终会保存到Redis Hash里(KEY:users_appid_uid,HASH-KEY:unread)。
TODO 为何需要终端来设置这个值呢?
根据终端提供的lastId(如果终端没有提供,那么取Redis中保存的值)去IMS存储服务器取最新未读取的消息列表,读取之后直接返回到此终端。
返回的数据流为:
终端会通过MSG_SYNC_KEY消息来设置用户最近消息ID,最终会保存到Redis Hash里(KEY:users_#{appid}_#{uid},HASH-KEY:sync_key)。