diff --git a/common/rpc/rpc.go b/common/rpc/rpc.go index 7dd48b83..ea661aca 100644 --- a/common/rpc/rpc.go +++ b/common/rpc/rpc.go @@ -9,6 +9,8 @@ import ( "log" "net/http" + blservice "blazing/modules/blazing/service" + "github.com/filecoin-project/go-jsonrpc" "github.com/gogf/gf/v2/util/gconv" ) @@ -16,10 +18,7 @@ import ( var rpcport = gconv.String(cool.Config.RPC) var clientmap = make(map[uint16]*ClientHandler) //客户端map -var clientidmap = make(map[uint16]uint16) //客户端map -//var usermap = make(map[int]int) //用户->客户端的map -// Define the client handler interface type ClientHandler struct { KickPerson func(uint32) error //踢人,这里是返回具体的logic QuitSelf func(int) error //关闭服务器进程 @@ -34,7 +33,7 @@ func (h *ServerHandler) Kick(ctx context.Context, userid uint32) error { useid1, err := share.ShareManager.GetUserOnline(userid) if err != nil { - return fmt.Errorf("user not found") + return fmt.Errorf("user not found", err) } cl, ok := clientmap[useid1] if ok { @@ -50,15 +49,13 @@ func (h *ServerHandler) RegisterLogic(ctx context.Context, id, port uint16) erro if !ok { return fmt.Errorf("no reverse client") } - - aa, ok := clientidmap[id] + blservice.NewLoginServiceService().GetServerID(id) + aa, ok := clientmap[port] if ok { //如果已经存在且这个端口已经被存过 - - t := clientmap[aa] - t.QuitSelf(0) + aa.QuitSelf(0) } clientmap[port] = &revClient - clientidmap[id] = port + return nil } diff --git a/common/socket/ServerEvent.go b/common/socket/ServerEvent.go index f20902f3..6bec1733 100644 --- a/common/socket/ServerEvent.go +++ b/common/socket/ServerEvent.go @@ -138,45 +138,40 @@ func (s *Server) OnTraffic(c gnet.Conn) (action gnet.Action) { s.parser(c, msg.Payload) }) } - if c.InboundBuffered() > 0 { - if err := c.Wake(nil); err != nil { // wake up the connection manually to avoid missing the leftover data - logging.Errorf("failed to wake up the connection, %v", err) - return gnet.Close - } - } + return gnet.None } func (s *Server) handleTcp(conn gnet.Conn) (action gnet.Action) { - for { - if s.discorse { - handle(conn) + if s.discorse { + handle(conn) + } + data, err := s.codec.Decode(conn) + if err != nil { + if conn.Context().(*player.ClientData).ERROR_CONNUT > 5 { + action = gnet.Close } - data, err := s.codec.Decode(conn) - if err != nil { - if conn.Context().(*player.ClientData).ERROR_CONNUT > 5 { - action = gnet.Close - } - conn.Context().(*player.ClientData).ERROR_CONNUT += 1 - break - } - - //client := conn.RemoteAddr().String() - _ = s.workerPool.Submit(func() { //TODO 这里可能存在顺序执行问题,待修复 - s.parser(conn, data) - }) + conn.Context().(*player.ClientData).ERROR_CONNUT += 1 } + //client := conn.RemoteAddr().String() + _ = s.workerPool.Submit(func() { //TODO 这里可能存在顺序执行问题,待修复 + s.parser(conn, data) + }) + if conn.InboundBuffered() > 0 { + + t, _ := conn.Peek(conn.InboundBuffered()) + fmt.Println("剩余数据", conn.InboundBuffered(), string(t)) if err := conn.Wake(nil); err != nil { // wake up the connection manually to avoid missing the leftover data logging.Errorf("failed to wake up the connection, %v", err) return gnet.Close } } - return gnet.None + return action } @@ -202,7 +197,7 @@ func handle(c gnet.Conn) { // 读取数据并检查是否为跨域请求 data, err := c.Peek(len(TEXT)) if err != nil { - //log.Printf("Error reading cross-domain request: %v", err) + log.Printf("Error reading cross-domain request: %v", err) return } diff --git a/logic/controller/controller.go b/logic/controller/controller.go index 1d6c505b..e9875779 100644 --- a/logic/controller/controller.go +++ b/logic/controller/controller.go @@ -133,7 +133,7 @@ func Recv(c gnet.Conn, data player.TomeeHeader) { cmdlister, ok := cool.CmdCache.Load(data.CMD) if !ok { - glog.Error(context.Background(), data.CMD, "cmd未注册") + glog.Debug(context.Background(), data.CMD, "cmd未注册") return //TODO 待实现cmd未注册 } diff --git a/logic/controller/login.go b/logic/controller/login.go index 163d673e..a48cbb1d 100644 --- a/logic/controller/login.go +++ b/logic/controller/login.go @@ -2,6 +2,7 @@ package controller import ( "blazing/common/data/share" + "fmt" "blazing/common/socket/errorcode" @@ -34,8 +35,11 @@ func IsToday(t time.Time) bool { func (h *Controller) Login(data *user.MAIN_LOGIN_IN, c gnet.Conn) (result *user.LoginMSInfo, err errorcode.ErrorCode) { //这个时候player应该是空的 if tt := data.CheakSession(); tt { //说明sid正确 - h.RPCClient.Kick(data.Head.UserID) //先踢人 - + err := h.RPCClient.Kick(data.Head.UserID) //先踢人 + if err != nil { + fmt.Println("踢人失败", err) + } + share.ShareManager.SetUserOnline(data.Head.UserID, h.Port) //设置用户登录服务器 t := player.GetPlayer(c, data.Head.UserID) t.Service = blservice.NewUserService(data.Head.UserID) t.Info = t.Service.Person(data.Head.UserID) @@ -43,8 +47,6 @@ func (h *Controller) Login(data *user.MAIN_LOGIN_IN, c gnet.Conn) (result *user. t.Onlinetime = uint32(time.Now().Unix()) //保存时间戳 t.Changemap = true - share.ShareManager.SetUserOnline(data.Head.UserID, h.Port) //设置用户登录服务器 - if !IsToday(t.Info.LastResetTime) { //判断是否是今天 t.Info.LastResetTime = time.Now() //每天login时候检查重置时间,然后把电池,任务,挖矿重置 diff --git a/logic/server.go b/logic/server.go index 2fc1adf6..66cec9d3 100644 --- a/logic/server.go +++ b/logic/server.go @@ -93,7 +93,7 @@ func Start(serverid uint16) { controller.Maincontroller.RPCClient = *t //将RPC赋值Start controller.Maincontroller.Port = uint16(port) //赋值服务器ID - blservice.NewLoginServiceService().SetServerID(serverid, gconv.Uint16(port), t) + blservice.NewLoginServiceService().SetServerID(serverid, gconv.Uint16(port)) ser.Boot() } else { diff --git a/modules/blazing/service/login.go b/modules/blazing/service/login.go index f0e222c8..dbe2cc2b 100644 --- a/modules/blazing/service/login.go +++ b/modules/blazing/service/login.go @@ -5,6 +5,7 @@ import ( "blazing/modules/blazing/model" "encoding/binary" "encoding/hex" + "fmt" "math/rand" "strings" "time" @@ -51,11 +52,7 @@ func (s *LoginService) GetSessionId(accountID uint) (string, string, error) { // /t1. // 以上过程只需全局一次,且应在生成ID之前完成。 } -func (s *LoginService) SetServerID(OnlineID uint16, Port uint16, t *struct { - Kick func(uint32) error - - RegisterLogic func(uint16, uint16) error -}) error { +func (s *LoginService) SetServerID(OnlineID uint16, Port uint16) error { m := cool.DBM(s.Model).Where("online_id", OnlineID) @@ -78,3 +75,22 @@ func (s *LoginService) SetServerID(OnlineID uint16, Port uint16, t *struct { return nil } +func (s *LoginService) GetServerID(OnlineID uint16) (uint16, error) { + + m := cool.DBM(s.Model).Where("online_id", OnlineID) + + record, err := m.One() + if err != nil { + return 0, err + } + if record == nil { + //说明是新的服务器 + + return 0, fmt.Errorf("未找到服务器") + } + var tttt model.ServerList + record.Struct(&tttt) + + return tttt.Port, nil + +}