You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			73 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
		
		
			
		
	
	
			73 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
| 
											2 years ago
										 | package network | ||
| 
											2 years ago
										 | 
 | ||
|  | import ( | ||
| 
											2 years ago
										 | 	"app/tools" | ||
| 
											2 years ago
										 | 	"google.golang.org/protobuf/proto" | ||
|  | 	"google.golang.org/protobuf/reflect/protoreflect" | ||
|  | 	"google.golang.org/protobuf/reflect/protoregistry" | ||
| 
											2 years ago
										 | 	"reflect" | ||
|  | 	"sync" | ||
| 
											2 years ago
										 | ) | ||
|  | 
 | ||
| 
											2 years ago
										 | /* | ||
|  | 按消息/请求的数据类型注册回调 | ||
|  | 注意:不是区分具体类型的值 | ||
|  | */ | ||
|  | 
 | ||
|  | func NewMsgTypeHandler() *MsgTypeHandler { | ||
|  | 	return &MsgTypeHandler{msgMap: make(map[string]MsgFun)} | ||
|  | } | ||
|  | 
 | ||
|  | type MsgFun func(sourceId, msg interface{}) | ||
|  | 
 | ||
|  | type MsgTypeHandler struct { | ||
|  | 	msgMap map[string]MsgFun | ||
|  | } | ||
|  | 
 | ||
|  | // 注册消息回调
 | ||
|  | func (h *MsgTypeHandler) RegistMsg(msg interface{}, f MsgFun) { | ||
|  | 	msgName := MsgName(msg) | ||
|  | 	_, ok := h.msgMap[msgName] | ||
|  | 	tools.AssertTrue(!ok, "regist repeated msg=%v", msgName) | ||
|  | 	h.msgMap[msgName] = f | ||
|  | } | ||
|  | 
 | ||
|  | func (h *MsgTypeHandler) HandleMsg(sourceId, msg interface{}) bool { | ||
|  | 	msgName := MsgName(msg) | ||
|  | 	handler := h.msgMap[msgName] | ||
|  | 	tools.AssertTrue(handler != nil, "msg=%v not regist handler", msgName) | ||
|  | 	handler(sourceId, msg) | ||
|  | 	return true | ||
|  | } | ||
|  | 
 | ||
| 
											2 years ago
										 | var _msgName sync.Map //
 | ||
|  | func MsgName(msg interface{}) string { | ||
|  | 	if msg == nil { | ||
|  | 		return "nil" | ||
|  | 	} | ||
|  | 
 | ||
|  | 	if str, ok := msg.(string); ok { | ||
|  | 		return str | ||
|  | 	} | ||
|  | 
 | ||
|  | 	tp := reflect.TypeOf(msg) | ||
|  | 	//if msgName, ok := _msgName.Load(tp); ok {
 | ||
|  | 	//	return msgName.(string)
 | ||
|  | 	//}
 | ||
|  | 
 | ||
|  | 	var msgName string | ||
|  | 	if pb, ok := msg.(proto.Message); ok { | ||
|  | 		msgName = string(pb.ProtoReflect().Type().Descriptor().FullName()) | ||
|  | 	} else if tp.Kind() == reflect.Ptr { | ||
|  | 		msgName = tp.Elem().PkgPath() + "/" + tp.Elem().Name() | ||
|  | 	} else { | ||
|  | 		msgName = tp.PkgPath() + "/" + tp.Name() | ||
|  | 	} | ||
|  | 
 | ||
|  | 	_msgName.Store(tp, msgName) | ||
|  | 	return msgName | ||
|  | } | ||
|  | func FindMsgByName(msgName string) (protoreflect.MessageType, error) { | ||
|  | 	return protoregistry.GlobalTypes.FindMessageByName(protoreflect.FullName(msgName)) | ||
|  | } |