123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- package servers
- import (
- "leafstalk/conf"
- msg "leafstalk/covenant/pbfmsg"
- "sync"
- "time"
- "leafstalk/log"
- "leafstalk/network/cluster"
- )
- type OfflineServer struct {
- Id int64
- Tick int64
- }
- var DisconnectMutex sync.Mutex
- var DisconnectServers map[int64]*OfflineServer
- // rpcNewClusterAgent 有新的服务器链接,添加服务器
- func OnRpcNewClusterAgent(args []interface{}, conf *conf.Config) {
- a := args[0].(*cluster.ServerAgent)
- isListenServer := args[1].(bool)
- log.Infof("rpcNewClusterAgent %v", a.RemoteAddr())
- //加入认证列表,等待认证
- server := NewServer(a)
- a.SetUserData(server)
- AddWaitAuthServer(server, isListenServer)
- if isListenServer {
- IntroduceServerSelf(server, conf)
- }
- //认证过程可能比较慢,需要等待对方响应
- //主动连接方需要主动发认证消息
- //连接断开时,就不需要认证了
- }
- // rpcCloseClusterAgent 服务器断开链接
- func OnRpcCloseClusterAgent(args []interface{}) {
- a := args[0].(*cluster.ServerAgent)
- log.Infof("rpcCloseClusterAgent %v", a.RemoteAddr())
- if server := ResolveServerAgent(a); server != nil {
- if server.ID > 0 {
- AddDisconnectServer(server.ID)
- }
- RemoveServer(server)
- RemoveAuthServer(server)
- } else {
- log.Errorf("RemoveServer but userData is nil")
- }
- //与服务器断开连接,
- //如果对方是游戏服务器的话,是否删除所有在线玩家,需要看是否无状态
- }
- // IntroduceServerSelf 服务器之间进行认证
- func IntroduceServerSelf(server *Server, conf *conf.Config) {
- log.Infof("IntroduceServerSelf %v", server)
- //发送登录消息
- id := conf.GetInt64("cluster.id")
- serverType := conf.GetString("cluster.servertype")
- lines := conf.GetIntSlice("cluster.lines")
- addr := conf.GetString("gate.toclient.wsaddr")
- msg1 := msg.ServerLogin{
- ID: id,
- Type: serverType,
- GateAddr: addr,
- }
- for _, v := range lines {
- msg1.Lines = append(msg1.Lines, int32(v))
- }
- server.Agent.WriteMsg(&msg1)
- }
- func AuthAllServer(conf *conf.Config) {
- RangeListenServer(func(server *Server) {
- IntroduceServerSelf(server, conf)
- })
- }
- func HandleServerLogin(args []interface{}, conf *conf.Config) {
- a := args[1].(*cluster.ServerAgent)
- request := args[0].(*msg.ServerLogin)
- if request.ID == 0 {
- log.Warnf("handleServerLogin faild, id can not be 0, %v %v", request.Type, request.GateAddr)
- return
- }
- log.Infof("handleServerLogin, id=%v, type=%v", request.ID, request.Type)
- if server := ResolveServerAgent(a); server != nil {
- server.ID = request.ID
- server.Type = request.Type
- server.Addr = request.GateAddr
- for _, v := range request.Lines {
- server.Lines = append(server.Lines, int(v))
- }
- RemoveDisconnectServer(server.ID)
- RemoveAuthServer(server)
- AddServer(server)
- //回应
- id := conf.GetInt64("cluster.id")
- serverType := conf.GetString("cluster.servertype")
- lines := conf.GetIntSlice("cluster.lines")
- addr := conf.GetString("gate.toclient.wsaddr")
- msg1 := msg.ResponseServerLogin{
- ID: id,
- Type: serverType,
- GateAddr: addr,
- // Lines: int32(group),
- }
- for _, v := range lines {
- msg1.Lines = append(msg1.Lines, int32(v))
- }
- a.WriteMsg(&msg1)
- }
- }
- func HandleResponseServerLogin(args []interface{}) {
- a := args[1].(*cluster.ServerAgent)
- request := args[0].(*msg.ResponseServerLogin)
- if request.ID == 0 {
- log.Warnf("handleResponseServerLogin faild, id can not be 0, %v %v", request.Type, request.GateAddr)
- return
- }
- log.Infof("handleResponseServerLogin, id=%v, type=%v", request.ID, request.Type)
- if a.UserData() != nil {
- if server, ok := a.UserData().(*Server); ok {
- server.ID = request.ID
- server.Type = request.Type
- server.Addr = request.GateAddr
- // server.Group = int(request.Group)
- for _, v := range request.Lines {
- server.Lines = append(server.Lines, int(v))
- }
- RemoveDisconnectServer(server.ID)
- RemoveAuthServer(server)
- AddServer(server)
- }
- }
- }
- func ResolveServerAgent(agent *cluster.ServerAgent) *Server {
- if agent == nil {
- return nil
- }
- userData := agent.UserData()
- if userData == nil {
- return nil
- }
- switch v := userData.(type) {
- case int64:
- return nil
- case *Server:
- return v
- }
- return nil
- }
- // 添加离线服务器
- func AddDisconnectServer(id int64) {
- if id <= 0 {
- return
- }
- DisconnectMutex.Lock()
- defer DisconnectMutex.Unlock()
- if DisconnectServers == nil {
- DisconnectServers = make(map[int64]*OfflineServer)
- }
- for _, v := range DisconnectServers {
- if v.Id == id {
- return
- }
- }
- s := new(OfflineServer)
- s.Id = id
- s.Tick = time.Now().Unix()
- DisconnectServers[id] = s
- }
- func RemoveDisconnectServer(id int64) {
- DisconnectMutex.Lock()
- defer DisconnectMutex.Unlock()
- delete(DisconnectServers, id)
- }
- // 检查离线时长
- func CheckOfflineTimeLong(id int64) int64 {
- DisconnectMutex.Lock()
- defer DisconnectMutex.Unlock()
- var tl int64 = -1
- for _, v := range DisconnectServers {
- if v.Id == id {
- c := time.Now().Unix()
- tl = c - v.Tick
- if tl < 0 {
- v.Tick = c
- tl = 0
- }
- break
- }
- }
- return tl
- }
- // 获取离线超时服务器 S
- func GetOfflineServer(timeOut int64) []int64 {
- DisconnectMutex.Lock()
- defer DisconnectMutex.Unlock()
- var lst []int64
- c := time.Now().Unix()
- for _, v := range DisconnectServers {
- if c-v.Tick > timeOut {
- lst = append(lst, v.Id)
- }
- }
- return lst
- }
- // func IsDisconnectServer(id int) bool {
- // for _, v := range DisconnectServers {
- // if v.Id == id {
- // return true
- // }
- // }
- // return false
- // }
|