This commit is contained in:
aozhiwei 2023-08-11 12:58:26 +08:00
parent 75d8a8b38d
commit 6674f3e8f8
5 changed files with 69 additions and 63 deletions

View File

@ -13,14 +13,14 @@ import (
type WSPListener_ struct { type WSPListener_ struct {
listener net.Listener listener net.Listener
ch chan *q5.MsgHdr ch chan *f5.MsgHdr
msgList q5.ListHead msgList q5.ListHead
} }
var WSPListener = new (WSPListener_) var WSPListener = new (WSPListener_)
func (this *WSPListener_) Init() { func (this *WSPListener_) Init() {
this.ch = make(chan *q5.MsgHdr) this.ch = make(chan *f5.MsgHdr)
listener, err := net.Listen("tcp", "0.0.0.0:8888") listener, err := net.Listen("tcp", "0.0.0.0:8888")
if err != nil { if err != nil {
@ -45,18 +45,6 @@ func (this *WSPListener_) accept() {
} }
} }
/*
struct WSProxyPackHead_C
{
unsigned short packlen;
unsigned short msgid;
unsigned int seqid;
unsigned short magic_code;
unsigned short socket_handle;
unsigned long ip_saddr;
};
*/
func (this *WSPListener_) socketRead(conn net.Conn) { func (this *WSPListener_) socketRead(conn net.Conn) {
buf := make([]byte, 1024 * 64) buf := make([]byte, 1024 * 64)
recvBufLen := 0 recvBufLen := 0
@ -84,7 +72,7 @@ func (this *WSPListener_) socketRead(conn net.Conn) {
prevOffset := 0 prevOffset := 0
for { for {
prevOffset = offset prevOffset = offset
this.decodePacket(recvBuf, &offset, recvBufLen) this.decodePacket(conn, recvBuf, &offset, recvBufLen)
if prevOffset >= offset || offset >= recvBufLen { if prevOffset >= offset || offset >= recvBufLen {
break break
} }
@ -108,19 +96,22 @@ func (this *WSPListener_) socketRead(conn net.Conn) {
} }
} }
func (this *WSPListener_) decodePacket(buf []byte, offset *int, bufLen int) { func (this *WSPListener_) decodePacket(conn net.Conn, buf []byte, offset *int, bufLen int) {
warning := false warning := false
for bufLen - *offset >= 20 { for bufLen - *offset >= f5.WSPROXYPACKHEAD_C_SIZE {
packLen := int(buf[*offset + 0]) + int(buf[*offset + 1] << 16) msgHead := f5.WSProxyPackHead_C{}
if buf[*offset + 8] == 'K' && buf[*offset + 9] == 'S' { msgHead.Read(buf, *offset)
if bufLen - *offset < 12 + packLen { if msgHead.MagicCode == f5.NET_MSG_MAGIC_CODE {
if bufLen - *offset < int(f5.WSPROXYPACKHEAD_C_SIZE) + int(msgHead.PackLen) {
continue continue
} }
hdr := new(q5.MsgHdr) hdr := new(f5.MsgHdr)
hdr.MsgId = int(buf[*offset + 2]) + int(buf[*offset + 3] << 16) hdr.Conn = conn
//hdr.SeqId = int(recvBuf[4]) + int(recvBuf[5] ) hdr.MsgId = msgHead.MsgId
hdr.SocketHandle = msgHead.SocketHandle
hdr.SeqId = msgHead.SeqId
this.ch <- hdr this.ch <- hdr
*offset += 20 + packLen *offset += 20 + int(msgHead.PackLen)
} else { } else {
warning = true warning = true
*offset++ *offset++
@ -138,39 +129,31 @@ func (this *WSPListener_) parseNetPkt() {
if hdr, ok := <-this.ch; ok { if hdr, ok := <-this.ch; ok {
hdr.Msg = cs.ParsePb(hdr.MsgId, hdr.Data) hdr.Msg = cs.ParsePb(hdr.MsgId, hdr.Data)
if hdr.Msg != nil { if hdr.Msg != nil {
hdr.Entry.Init(hdr)
App.addNetMsg(hdr)
} }
} }
} }
} }
/*
struct WSProxyPackHead_S
{
unsigned short packlen;
unsigned short msgid;
unsigned int seqid;
unsigned short magic_code;
unsigned short rpc_error_code;
unsigned short socket_handle;
unsigned short ext_len;
};
*/
func (this *WSPListener_) sendProxyMsg(conn net.Conn, socketHandle uint16, msg proto.Message) { func (this *WSPListener_) sendProxyMsg(conn net.Conn, socketHandle uint16, msg proto.Message) {
netMsg := msg.(q5.NetMsg) netMsg := msg.(f5.NetMsg)
msgId := netMsg.GetNetMsgId() msgId := netMsg.GetNetMsgId()
msgData, err := proto.Marshal(msg) msgData, err := proto.Marshal(msg)
if err != nil { if err != nil {
return return
} }
buff := make([]byte, len(msgData) + 12) buff := make([]byte, len(msgData) + 16)
buff[0] = byte(len(msgData) & 0xFF) buff[0] = byte(len(msgData) & 0xFF)
buff[1] = byte(len(msgData) & 0xFFFF >> 16) buff[1] = byte((len(msgData) & 0xFFFF) >> 8)
buff[2] = byte(msgId & 0xFF) buff[2] = byte(msgId & 0xFF)
buff[3] = byte(msgId >> 16) buff[3] = byte((msgId & 0xFFFF) >> 8)
buff[9] = byte(socketHandle & 0xFF) buff[8] = byte('K')
buff[10] = byte(socketHandle >> 16) buff[9] = byte('S')
copy(buff[12:], msgData[:])
buff[12] = byte(socketHandle & 0xFF)
buff[13] = byte((socketHandle & 0xFFFF) >> 8)
copy(buff[16:], msgData[:])
conn.Write(buff) conn.Write(buff)
} }

View File

@ -25,11 +25,13 @@ func (this *App_) Init() {
this.App_.Init(this.Update) this.App_.Init(this.Update)
this.msgList.Init(nil) this.msgList.Init(nil)
this.workList.Init(nil) this.workList.Init(nil)
HandlerMgr.Init()
WSPListener.Init() WSPListener.Init()
go this.goReportServerState(); go this.goReportServerState();
} }
func (this *App_) UnInit() { func (this *App_) UnInit() {
HandlerMgr.UnInit()
WSPListener.UnInit() WSPListener.UnInit()
this.App_.UnInit() this.App_.UnInit()
} }
@ -44,7 +46,7 @@ func (this *App_) Update() {
} }
for !this.workList.Empty() { for !this.workList.Empty() {
next := this.workList.Next() next := this.workList.Next()
hdr, ok := next.GetData().(*q5.MsgHdr) hdr, ok := next.GetData().(*f5.MsgHdr)
if ok { if ok {
handler := cs.GetNetMsgHandler(hdr.MsgId) handler := cs.GetNetMsgHandler(hdr.MsgId)
if handler != nil && handler.HandlerId== PLAYER_MGR_HANDLER_ID { if handler != nil && handler.HandlerId== PLAYER_MGR_HANDLER_ID {
@ -76,7 +78,7 @@ func (this *App_) goReportServerState() {
} }
func (this *App_) addNetMsg(hdr *q5.MsgHdr) { func (this *App_) addNetMsg(hdr *f5.MsgHdr) {
{ {
this.msgMutex.Lock() this.msgMutex.Lock()
defer this.msgMutex.Unlock() defer this.msgMutex.Unlock()

View File

@ -1,14 +1,14 @@
package cs package cs
import ( import (
"q5" "f5"
proto "github.com/golang/protobuf/proto" proto "github.com/golang/protobuf/proto"
) )
type MsgHandler interface { type MsgHandler interface {
CMPing(*q5.MsgHdr, *CMPing) CMPing(*f5.MsgHdr, *CMPing)
CMLogin(*q5.MsgHdr, *CMLogin) CMLogin(*f5.MsgHdr, *CMLogin)
CMReconnect(*q5.MsgHdr, *CMReconnect) CMReconnect(*f5.MsgHdr, *CMReconnect)
} }
type MsgHandlerImpl struct { type MsgHandlerImpl struct {
@ -18,26 +18,26 @@ type NetMsgHandler struct {
MsgId int MsgId int
HandlerId int HandlerId int
parseCb func([]byte) interface{} parseCb func([]byte) interface{}
cb func(*q5.MsgHdr, MsgHandler) cb func(*f5.MsgHdr, MsgHandler)
} }
var handlers [2000]*NetMsgHandler var handlers [2000]*NetMsgHandler
func (this *MsgHandlerImpl) CMPing(hdr *q5.MsgHdr, msg *CMPing) { func (this *MsgHandlerImpl) CMPing(hdr *f5.MsgHdr, msg *CMPing) {
} }
func (this *MsgHandlerImpl) CMLogin(hdr *q5.MsgHdr, msg *CMLogin) { func (this *MsgHandlerImpl) CMLogin(hdr *f5.MsgHdr, msg *CMLogin) {
} }
func (this *MsgHandlerImpl) CMReconnect(hdr *q5.MsgHdr, msg *CMReconnect) { func (this *MsgHandlerImpl) CMReconnect(hdr *f5.MsgHdr, msg *CMReconnect) {
} }
func GetNetMsgHandler(msgId int) *NetMsgHandler { func GetNetMsgHandler(msgId uint16) *NetMsgHandler {
handler := handlers[msgId] handler := handlers[msgId]
return handler return handler
} }
func DispatchMsg(handler *NetMsgHandler, hdr *q5.MsgHdr, msgHandler MsgHandler) { func DispatchMsg(handler *NetMsgHandler, hdr *f5.MsgHdr, msgHandler MsgHandler) {
handler.cb(hdr, msgHandler) handler.cb(hdr, msgHandler)
} }
@ -46,25 +46,43 @@ func RegHandlerId(msgId int, handlerId int) {
handler.HandlerId = handlerId handler.HandlerId = handlerId
} }
func ParsePb(msgId int, data []byte) interface{} { func ParsePb(msgId uint16, data []byte) interface{} {
handler := handlers[msgId] handler := handlers[msgId]
if handler == nil {
return nil
}
return handler.parseCb(data) return handler.parseCb(data)
} }
func init() { func init() {
handlers[10] = &NetMsgHandler{ handlers[int(CMMessageIdE__CMPing)] = &NetMsgHandler{
MsgId: int(CMMessageIdE__CMPing), MsgId: int(CMMessageIdE__CMPing),
parseCb: func (data []byte) interface{} { parseCb: func (data []byte) interface{} {
msg := &CMLogin{} msg := &CMLogin{}
proto.Unmarshal(data, msg) proto.Unmarshal(data, msg)
return msg return msg
}, },
cb: func (hdr *q5.MsgHdr, handler MsgHandler) { cb: func (hdr *f5.MsgHdr, handler MsgHandler) {
handler.CMPing(hdr, hdr.Msg.(*CMPing)) handler.CMPing(hdr, hdr.Msg.(*CMPing))
}, },
}; }
handlers[int(CMMessageIdE__CMLogin)] = &NetMsgHandler{
MsgId: int(CMMessageIdE__CMLogin),
parseCb: func (data []byte) interface{} {
msg := &CMLogin{}
proto.Unmarshal(data, msg)
return msg
},
cb: func (hdr *f5.MsgHdr, handler MsgHandler) {
handler.CMLogin(hdr, hdr.Msg.(*CMLogin))
},
}
} }
func (x *CMLogin) GetNetMsgId() uint16 { func (x *CMLogin) GetNetMsgId() uint16 {
return uint16(CMMessageIdE__CMLogin); return uint16(CMMessageIdE__CMLogin);
} }
func (x *SMLogin) GetNetMsgId() uint16 {
return uint16(SMMessageIdE__SMLogin);
}

View File

@ -2,7 +2,7 @@ package main
import ( import (
"cs" "cs"
"q5" "f5"
) )
type PlayerMgr_ struct { type PlayerMgr_ struct {
@ -11,7 +11,9 @@ type PlayerMgr_ struct {
var PlayerMgr = new (PlayerMgr_) var PlayerMgr = new (PlayerMgr_)
func (this *PlayerMgr_) CMLogin(hdr *q5.MsgHdr, msg *cs.CMLogin) { func (this *PlayerMgr_) CMLogin(hdr *f5.MsgHdr, msg *cs.CMLogin) {
serverInfo := "192.168.100.39:1000"
rspMsg := &cs.SMLogin{} rspMsg := &cs.SMLogin{}
rspMsg.ServerInfo = &serverInfo
WSPListener.sendProxyMsg(hdr.Conn, 0, rspMsg) WSPListener.sendProxyMsg(hdr.Conn, 0, rspMsg)
} }

View File

@ -82,6 +82,7 @@ class ClientNet {
async #onParsePacket() { async #onParsePacket() {
let offset = 0; let offset = 0;
console.log('onParsepacket');
while (this.recvBuf.length > offset + 12) { while (this.recvBuf.length > offset + 12) {
const msgSize = this.recvBuf.readUInt32LE(offset + 0); const msgSize = this.recvBuf.readUInt32LE(offset + 0);
const msgId = this.recvBuf.readUInt16LE(offset + 4); const msgId = this.recvBuf.readUInt16LE(offset + 4);