mirror of
https://github.com/duanhf2012/origin.git
synced 2026-02-04 06:54:45 +08:00
176 lines
4.4 KiB
Go
176 lines
4.4 KiB
Go
package sysservice
|
|
|
|
import (
|
|
"errors"
|
|
"github.com/duanhf2012/origin/network"
|
|
"github.com/duanhf2012/origin/service"
|
|
"github.com/golang/protobuf/proto"
|
|
"reflect"
|
|
)
|
|
|
|
type TcpSocketPbService struct {
|
|
service.BaseService
|
|
listenaddr string
|
|
tcpsocketserver network.TcpSocketServer
|
|
MsgProcessor
|
|
}
|
|
|
|
|
|
type MessageHandler func(clientid uint64,msgtype uint16,msg proto.Message)
|
|
type MessageRecvHandler func(pClient *network.SClient,pPack *network.MsgBasePack)
|
|
type EventHandler func(clientid uint64)
|
|
type ExceptMsgHandler func(clientid uint64,pPack *network.MsgBasePack,err error)
|
|
|
|
type MsgProcessor struct {
|
|
mapMsg map[uint16]MessageInfo
|
|
connEvent EventHandler
|
|
disconnEvent EventHandler
|
|
exceptMsgHandler ExceptMsgHandler
|
|
messageRecvHandler MessageRecvHandler
|
|
}
|
|
|
|
|
|
func (slf *MsgProcessor) InitProcessor(){
|
|
slf.mapMsg = make(map[uint16]MessageInfo)
|
|
}
|
|
|
|
func (slf *MsgProcessor) RegMessage(msgtype uint16,msg proto.Message,handle MessageHandler){
|
|
var info MessageInfo
|
|
|
|
info.msgType = reflect.TypeOf(msg.(proto.Message))
|
|
info.msgHandler = handle
|
|
slf.mapMsg[msgtype] = info
|
|
}
|
|
|
|
func (slf *MsgProcessor) RegConnectEvent(eventHandler EventHandler){
|
|
slf.connEvent = eventHandler
|
|
}
|
|
|
|
func (slf *MsgProcessor) RegDisconnectEvent(eventHandler EventHandler){
|
|
slf.disconnEvent = eventHandler
|
|
}
|
|
|
|
func (slf *MsgProcessor) RegExceptMessage(exceptMsgHandler ExceptMsgHandler){
|
|
slf.exceptMsgHandler = exceptMsgHandler
|
|
}
|
|
|
|
func (slf *MsgProcessor) RegRecvMessage(msgHandler MessageRecvHandler){
|
|
slf.messageRecvHandler = msgHandler
|
|
}
|
|
|
|
func (slf *MsgProcessor) OnExceptMsg (pClient *network.SClient,pPack *network.MsgBasePack,err error){
|
|
if slf.exceptMsgHandler!=nil {
|
|
slf.exceptMsgHandler(pClient.GetId(),pPack,err)
|
|
}else{
|
|
pClient.Close()
|
|
//记录日志
|
|
service.GetLogger().Printf(service.LEVER_WARN, "OnExceptMsg packtype %d,error %+v",pPack.PackType,err)
|
|
}
|
|
}
|
|
|
|
func NewTcpSocketPbService(listenaddr string) *TcpSocketPbService {
|
|
ts := new(TcpSocketPbService)
|
|
|
|
ts.listenaddr = listenaddr
|
|
ts.mapMsg = make(map[uint16]MessageInfo,1)
|
|
ts.tcpsocketserver.Register(listenaddr,ts)
|
|
return ts
|
|
}
|
|
|
|
func (slf *TcpSocketPbService) OnInit() error {
|
|
return nil
|
|
}
|
|
|
|
func (slf *TcpSocketPbService) OnRun() bool {
|
|
slf.tcpsocketserver.Start()
|
|
|
|
return false
|
|
}
|
|
|
|
|
|
type MessageInfo struct {
|
|
msgType reflect.Type
|
|
msgHandler MessageHandler
|
|
}
|
|
|
|
|
|
func (slf *TcpSocketPbService) RegMessage(msgtype uint16,msg proto.Message,handle MessageHandler){
|
|
var info MessageInfo
|
|
|
|
info.msgType = reflect.TypeOf(msg.(proto.Message))
|
|
info.msgHandler = handle
|
|
slf.mapMsg[msgtype] = info
|
|
}
|
|
|
|
|
|
func (slf *TcpSocketPbService) OnConnected(pClient *network.SClient){
|
|
if slf.connEvent!=nil {
|
|
slf.connEvent(pClient.GetId())
|
|
}
|
|
}
|
|
|
|
func (slf *TcpSocketPbService) OnDisconnect(pClient *network.SClient){
|
|
if slf.disconnEvent!=nil {
|
|
slf.disconnEvent(pClient.GetId())
|
|
}
|
|
}
|
|
func (slf *TcpSocketPbService) VerifyPackType(packtype uint16) bool{
|
|
_,ok := slf.mapMsg[packtype]
|
|
return ok
|
|
}
|
|
|
|
func (slf *MsgProcessor) Handle(pClient *network.SClient,pPack *network.MsgBasePack){
|
|
if info, ok := slf.mapMsg[pPack.PackType]; ok {
|
|
msg := reflect.New(info.msgType.Elem()).Interface()
|
|
tmp := msg.(proto.Message)
|
|
err := proto.Unmarshal(pPack.Body, tmp)
|
|
if err != nil {
|
|
slf.OnExceptMsg(pClient,pPack,err)
|
|
return
|
|
}
|
|
|
|
info.msgHandler(pClient.GetId(),pPack.PackType, msg.(proto.Message))
|
|
return
|
|
}else if slf.messageRecvHandler!=nil {
|
|
slf.messageRecvHandler(pClient,pPack)
|
|
return
|
|
}
|
|
|
|
slf.OnExceptMsg(pClient,pPack,errors.New("not found PackType"))
|
|
}
|
|
|
|
|
|
func (slf *TcpSocketPbService) OnRecvMsg(pClient *network.SClient, pPack *network.MsgBasePack){
|
|
slf.Handle(pClient,pPack)
|
|
}
|
|
|
|
func DefaultTSPbService() *TcpSocketPbService{
|
|
iservice := service.InstanceServiceMgr().FindService("TcpSocketPbService")
|
|
if iservice == nil {
|
|
return nil
|
|
}
|
|
|
|
return iservice.(*TcpSocketPbService)
|
|
}
|
|
|
|
func GetTcpSocketPbService(serviceName string) *TcpSocketPbService{
|
|
iservice := service.InstanceServiceMgr().FindService(serviceName)
|
|
if iservice == nil {
|
|
return nil
|
|
}
|
|
|
|
return iservice.(*TcpSocketPbService)
|
|
}
|
|
|
|
func (slf *TcpSocketPbService) SendMsg(clientid uint64,packtype uint16,message proto.Message) error{
|
|
return slf.tcpsocketserver.SendMsg(clientid,packtype,message)
|
|
}
|
|
|
|
func (slf *TcpSocketPbService) Close(clientid uint64) error{
|
|
return slf.tcpsocketserver.Close(clientid)
|
|
}
|
|
|
|
func (slf *TcpSocketPbService) Send(clientid uint64,pack *network.MsgBasePack) error {
|
|
return slf.tcpsocketserver.Send(clientid,pack)
|
|
}
|