package server import ( "fmt" "game/common/proto/pb" "game/test/client/config" "github.com/fox/fox/log" "github.com/fox/fox/processor" "github.com/fox/fox/ws" "github.com/golang/protobuf/proto" ) var Clients []*ClientService type ClientService struct { client *ws.Client processor *processor.Processor userId int64 username string password string lastServiceName string // 最近使用的服务的节点 } func Init() { for i := 0; i < config.Command.ServiceNum; i++ { sid := config.Command.ServiceId + i if srv := newClientService(sid); srv != nil { Clients = append(Clients, srv) } } } func Stop() { for _, s := range Clients { s.client.Stop() } } func newClientService(serviceId int) *ClientService { var err error s := new(ClientService) s.username = fmt.Sprintf("test%04d", serviceId) s.password = "123456" size := len(config.Cfg.Special.Address) addr := config.Cfg.Special.Address[serviceId%size] if s.client, err = ws.NewClient(fmt.Sprintf("ws://%v", addr), s); err != nil { return nil } s.processor = processor.NewProcessor() s.initProcessor() s.OnInit() return s } func (s *ClientService) OnInit() { s.client.Start() log.Debug("onInit") } func (s *ClientService) CanStop() bool { return true } // 处理其它服发送过来的消息 func (s *ClientService) OnMessage(data []byte) error { var cMsg = &pb.ClientMsg{} var err error if err = proto.Unmarshal(data, cMsg); err != nil { log.Error(err.Error()) return err } if req, err := s.processor.Unmarshal(cMsg.MsgId, cMsg.Data); err == nil { err = s.processor.Dispatch(cMsg.MsgId, cMsg, req) } //log.Debug(s.Log("on message:%v", string(cMsg))) return nil } // 向内部服务发送消息 func (s *ClientService) SendData(serviceTypeId pb.ServiceTypeId, msgId int32, data []byte) { msg := &pb.ClientMsg{ ServiceTid: serviceTypeId, ServiceName: s.lastServiceName, UserId: s.userId, MsgId: msgId, Data: data, } d, _ := proto.Marshal(msg) s.client.SendMsg(d) } // 向内部服务发送消息 func (s *ClientService) SendMsg(serviceTypeId pb.ServiceTypeId, msgId int32, msg proto.Message) { data, _ := proto.Marshal(msg) s.SendData(serviceTypeId, msgId, data) }