//初始化 func InitServer(port string) error { servers = make(map[string]*link.Session) asyncMsgs = list.New() db.Init() startSysDB() createRevGoroutines() listener, err := link.Serve("tcp", "0.0.0.0:"+port, packet.New( binary.SplitByUint32BE, 1024, 1024, 1024, )) if err != nil { return err } listener.Serve(func(session *link.Session) { for { var msg packet.RAW if err := session.Receive(&msg); err != nil { break } msgID := binary.GetUint16LE(msg[:2]) if systemProto.IsValidID(msgID) { //系统消息 dealReceiveSystemMsgC2S(session, msg) } else if dbProto.IsValidAsyncID(msgID) { //异步DB消息 asyncMsgs.PushBack(msg) } else { //同步DB消息 useObj := revSyncMsgGoroutines[revSyncMsgGoroutineIndex] useObj.revMsgChan <- goroutineMsg{msg, session} revSyncMsgGoroutineIndex++ if revSyncMsgGoroutineIndex == revSyncMsgGoroutineNum { revSyncMsgGoroutineIndex = 0 } } } }) return nil }
func (this Handle) DealMsg(session *link.Session, msg []byte) { msgID := binary.GetUint16LE(msg[:2]) var protoMsg protos.ProtoMsg if systemProto.IsValidID(msgID) || logProto.IsValidID(msgID) || gameProto.IsValidID(msgID) { protoMsg = protos.UnmarshalProtoMsg(msg) } else if dbProto.IsValidID(msgID) { protoMsg = dbProto.UnmarshalProtoMsg(msg) } if protoMsg == protos.NullProtoMsg { ERR("收到Proto未处理消息:", msgID) return } if f, exists := this[msgID]; exists { f(session, protoMsg) } else { ERR("收到Handle未处理消息:", msgID) } }
//处理接收到的消息 func dealReceiveMsgC2S(session *link.Session, msg packet.RAW) { if len(msg) < 2 { return } msgID := binary.GetUint16LE(msg[:2]) if systemProto.IsValidID(msgID) { dealReceiveSystemMsgC2S(session, msg) } else if gameProto.IsValidID(msgID) { if msgID%2 == 1 { //C2S消息,发送到GameServer或者LoginServer if gameProto.IsValidLoginID(msgID) { sendGameMsg("LoginServer", msg) } else { sendGameMsg("GameServer", msg) } } else { //S2C消息,发送到GateServer sendGameMsg("GateServer", msg) } } }