/* 一个连接断开后的回调方法 */ 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 (this *NodeManager) saveNode(findNode *FindNode, c engine.Controller) { //自己不是超级节点 if !nodeStore.Root.IsSuper { //代理节点查找的备用超级节点 // if findNode.WantId == "left" || findNode.WantId == "right" { // fmt.Println("添加备用节点:", nodeStore.ParseId(findNode.FindId)) // // store.AddNode(node) // // return // } //查找到的节点和自己的超级节点不一样,则连接新的超级节点 if nodeStore.SuperName != findNode.FindId { oldSuperName := nodeStore.SuperName session, _ := c.GetNet().AddClientConn(findNode.Addr, nodeStore.GetRootIdInfoString(), findNode.TcpPort, false) nodeStore.SuperName = session.GetName() if _, ok := c.GetNet().GetSession(nodeStore.SuperName); ok { } if session, ok := c.GetNet().GetSession(oldSuperName); ok { session.Close() } return } } findNodeIdInfo := new(nodeStore.IdInfo) json.Unmarshal([]byte(findNode.FindId), findNodeIdInfo) // nodeStore.Parse(findNode.FindId) // shouldNodeInt, _ := new(big.Int).SetString(findNode.FindId, nodeStore.IdStrBit) newNode := &nodeStore.Node{ IdInfo: *findNodeIdInfo, IsSuper: findNode.IsSuper, Addr: findNode.Addr, TcpPort: findNode.TcpPort, UdpPort: findNode.UdpPort, } //是否需要这个节点 if isNeed, replace := nodeStore.CheckNeedNode(findNodeIdInfo.GetId()); isNeed { //------------start-------------------------- //这一块只为打印一个日志,可以去掉 // ishave := false // for _, value := range nodeStore.GetAllNodes() { // if value.IdInfo.GetId() == findNodeIdInfo.GetId() { // ishave = true // break // } // } // if ishave { // fmt.Println("需要这个节点", findNodeIdInfo.GetId()) // } //------------end-------------------------- nodeStore.AddNode(newNode) //把替换的节点连接删除 if replace != "" { //是否要替换超级节点 if session, ok := c.GetNet().GetSession(nodeStore.SuperName); ok { if replace == session.GetName() { session.Close() session, _ := c.GetNet().AddClientConn(newNode.Addr, nodeStore.GetRootIdInfoString(), newNode.TcpPort, false) nodeStore.SuperName = session.GetName() introduceSelf(session) } } if session, ok := c.GetSession(replace); ok { session.Close() nodeStore.DelNode(replace) } } if nodeStore.Root.IsSuper { //自己不会连接自己 if nodeStore.GetRootIdInfoString() == string(newNode.IdInfo.Build()) { return } //检查这个session是否存在 if _, ok := c.GetNet().GetSession(string(newNode.IdInfo.Build())); !ok { session, err := c.GetNet().AddClientConn(newNode.Addr, nodeStore.GetRootIdInfoString(), newNode.TcpPort, false) if err != nil { fmt.Println(newNode) fmt.Println("连接客户端出错") } else { introduceSelf(session) } } } } }