func SendMessage(msg *Message) { data, _ := json.Marshal(msg) pkg := engine.GetPacket{ MsgID: SendMessageNum, Size: uint32(len(data)), Date: data, } if IsSendToSelf(engine.GetController(), pkg) { handlerProcess(engine.GetController(), pkg) } }
/* 一个连接断开后的回调方法 */ func closeConnCallback(name string) { if name == nodeStore.SuperName { targetNode := nodeStore.Get(nodeStore.Root.IdInfo.GetId(), false, nodeStore.Root.IdInfo.GetId()) if targetNode == nil { return } if Init_role == C_role_client { nodeStore.SuperName = engine.AddClientConn(targetNode.Addr, targetNode.TcpPort, false) } else { session, _ := engine.GetController().GetSession(string(targetNode.IdInfo.Build())) nodeStore.SuperName = session.GetName() } return } // session, ok := engine.GetController().GetSession(name) // if err != nil { // fmt.Println("客户端离线,但找不到这个session") // } node := nodeStore.Get(nodeStore.ParseId(name), false, "") fmt.Println("节点下线", node) if node != nil && !node.IsSuper { fmt.Println("自己代理的节点下线:", nodeStore.ParseId(name)) } nodeStore.DelNode(nodeStore.ParseId(name)) }
//给所有客户端发送消息 func SendMsgForAll(message string) { messageSend := msgc.Message{ ProtoId: msgc.MSGID_Text, CreateTime: time.Now().Unix(), Content: []byte(message), } for idOne, nodeOne := range nodeStore.GetAllNodes() { if clientConn, ok := engine.GetController().GetSession(string(nodeOne.IdInfo.Build())); ok { messageSend.TargetId = idOne data, _ := json.Marshal(messageSend) clientConn.Send(msgc.SendMessageNum, &data) } } }
/* 连接超级节点后,向超级节点介绍自己 第一次连接超级节点,用代理方式查找离自己最近的节点 */ func introduceSelf() { session, _ := engine.GetController().GetSession(nodeStore.SuperName) //用代理方式查找最近的超级节点 nodeMsg := msg.FindNode{ NodeId: session.GetName(), WantId: nodeStore.ParseId(nodeStore.GetRootIdInfoString()), IsProxy: true, ProxyId: nodeStore.GetRootIdInfoString(), IsSuper: Init_IsSuperPeer, Addr: nodeStore.Root.Addr, TcpPort: nodeStore.Root.TcpPort, UdpPort: nodeStore.Root.UdpPort, } // resultBytes, _ := proto.Marshal(&nodeMsg) resultBytes, _ := json.Marshal(nodeMsg) session.Send(msg.FindNodeNum, &resultBytes) }
//保存一个键值对 func SaveData(key, value string) { clientConn, _ := engine.GetController().GetSession(nodeStore.SuperName) data := []byte(key + "!" + value) clientConn.Send(msgc.SaveKeyValueReqNum, &data) }
//处理查找节点的请求 //本节点定期查询已知节点是否在线,更新节点信息 func read() { for { nodeIdStr := <-nodeStore.OutFindNode session, ok := engine.GetController().GetSession(nodeStore.SuperName) //root节点刚启动就没有超级节点 if !ok { continue } findNodeOne := &msg.FindNode{ NodeId: nodeStore.GetRootIdInfoString(), IsProxy: false, ProxyId: nodeStore.GetRootIdInfoString(), WantId: nodeIdStr, } /* 当查找id等于自己的时候: 超级节点:查找邻居节点 普通节点:查找离自己最近的超级节点,查找邻居节点做备用超级节点 */ if nodeIdStr == nodeStore.ParseId(nodeStore.GetRootIdInfoString()) { //普通节点查找最近的超级节点 if !nodeStore.Root.IsSuper { findNodeOne.NodeId = session.GetName() findNodeOne.IsProxy = true // findNodeOne.WantId = nodeIdStr findNodeOne.IsSuper = nodeStore.Root.IsSuper findNodeOne.Addr = nodeStore.Root.Addr findNodeOne.TcpPort = nodeStore.Root.TcpPort findNodeOne.UdpPort = nodeStore.Root.UdpPort resultBytes, _ := json.Marshal(findNodeOne) session.Send(msg.FindNodeNum, &resultBytes) findNodeOne.WantId = "left" findNodeBytes, _ := json.Marshal(findNodeOne) err := session.Send(msg.FindNodeNum, &findNodeBytes) if err != nil { fmt.Println("manager发送数据出错:", err.Error()) } findNodeOne.WantId = "right" findNodeBytes, _ = json.Marshal(findNodeOne) err = session.Send(msg.FindNodeNum, &findNodeBytes) if err != nil { fmt.Println("manager发送数据出错:", err.Error()) } continue } //先发送左邻居节点查找请求 findNodeOne.WantId = "left" id := nodeStore.GetLeftNode(*nodeStore.Root.IdInfo.GetBigIntId(), 1) if id == nil { continue } findNodeBytes, _ := json.Marshal(findNodeOne) ok := false var clientConn engine.Session if nodeStore.Root.IsSuper { clientConn, ok = engine.GetController().GetSession(string(id[0].IdInfo.Build())) } else { clientConn, ok = engine.GetController().GetSession(nodeStore.SuperName) } if !ok { continue } err := clientConn.Send(msg.FindNodeNum, &findNodeBytes) if err != nil { fmt.Println("manager发送数据出错:", err.Error()) } //发送右邻居节点查找请求 findNodeOne.WantId = "right" id = nodeStore.GetRightNode(*nodeStore.Root.IdInfo.GetBigIntId(), 1) if id == nil { continue } findNodeBytes, _ = json.Marshal(findNodeOne) if nodeStore.Root.IsSuper { if clientConn, ok = engine.GetController().GetSession(string(id[0].IdInfo.Build())); !ok { continue } } err = clientConn.Send(msg.FindNodeNum, &findNodeBytes) if err != nil { fmt.Println("manager发送数据出错:", err.Error()) } continue } //自己不是超级节点,就不需要保存逻辑节点 // if !nodeStore.Root.IsSuper { // continue // } //-------------------------------------------- // 查找普通节点,只有超级节点才需要查找 //-------------------------------------------- //这里临时加上去 //去掉后有性能问题 findNodeBytes, _ := json.Marshal(findNodeOne) remote := nodeStore.Get(nodeIdStr, false, "") if remote == nil { continue } session, _ = engine.GetController().GetSession(string(remote.IdInfo.Build())) if session == nil { continue } err := session.Send(msg.FindNodeNum, &findNodeBytes) if err != nil { fmt.Println("manager发送数据出错:", err.Error()) } } }