Ejemplo n.º 1
0
/*
	一个连接断开后的回调方法
*/
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))
}
Ejemplo n.º 2
0
/*
	自己保存这个节点,只能保存超级节点
*/
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)
				}
			}
		}
	}
}