大佬教程收集整理的这篇文章主要介绍了[Golang]网络游戏协议处理框架,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
type Connection func NewConnection(conn Socket,maxcount int,dh DataHandler,ih IdentityHandler,eh ErrorHandler) *Connection func (p *Connection) Start() func (p *Connection) Close() func (p *Connection) Query(data []byte) (res []byte,err error) func (p *Connection) Reply(query,answer []byte) error func (p *Connection) Write(data []byte) error type Socket interface { Read() ([]byte,error) Write([]byte) error Close() } type DataHandler interface { Process([]byte) } type ErrorHandler interface { OnError(error) } type IdentityHandler interface { GetIdentity([]byte) uint32 SetIdentity([]byte,uint32) }完整的代码实现:
package multiplexer import ( "errors" "sync" "sync/atomic" ) var ( ERR_EXIT = errors.New("exit") ) type Socket interface { Read() ([]byte,error) Write([]byte) error Close() } type DataHandler interface { Process([]byte) } type ErrorHandler interface { OnError(error) } type IdentityHandler interface { GetIdentity([]byte) uint32 SetIdentity([]byte,uint32) } type Connection struct { conn Socket wg sync.WaitGroup mutex sync.Mutex applicants map[uint32]chan []byte chexit chan bool chsend chan []byte chch chan chan []byte dh DataHandler ih IdentityHandler eh ErrorHandler identity uint32 } func NewConnection(conn Socket,eh ErrorHandler) *Connection { count := maxcount if count < 1024 { count = 1024 } chch := make(chan chan []byte,count) for i := 0; i < count; i++ { chch <- make(chan []byte,1) } return &Connection{ conn: conn,applicants: make(map[uint32]chan []byte,count),chsend: make(chan []byte,chexit: make(chan bool),chch: chch,dh: dh,ih: ih,eh: eh,} } func (p *Connection) Start() { p.wg.Add(2) go func() { defer p.wg.Done() p.recv() }() go func() { defer p.wg.Done() p.send() }() } func (p *Connection) Close() { close(p.chexit) p.conn.Close() p.wg.Wait() } func (p *Connection) Query(data []byte) (res []byte,err error) { var ch chan []byte select { case <-p.chexit: return nil,ERR_EXIT case ch = <-p.chch: defer func() { p.chch <- ch }() } id := p.newIdentity() p.ih.SetIdentity(data,id) p.addApplicant(id,ch) defer func() { if err != nil { p.popApplicant(id) } }() if err := p.Write(data); err != nil { return nil,err } select { case <-p.chexit: return nil,ERR_EXIT case res = <-ch: break } return res,nil } func (p *Connection) Reply(query,answer []byte) error { // put back the identity attached to the query id := p.ih.GetIdentity(query) p.ih.SetIdentity(answer,id) return p.Write(answer) } func (p *Connection) Write(data []byte) error { select { case <-p.chexit: return ERR_EXIT case p.chsend <- data: break } return nil } func (p *Connection) send() { for { select { case <-p.chexit: return case data := <-p.chsend: if p.conn.Write(data) != nil { return } } } } func (p *Connection) recv() (err error) { defer func() { if err != nil { select { case <-p.chexit: err = nil default: p.eh.OnError(err) } } }() for { select { case <-p.chexit: return nil default: break } data,err := p.conn.Read() if err != nil { return err } if id := p.ih.GetIdentity(data); id > 0 { ch,ok := p.popApplicant(id) if ok { ch <- data continue } } p.dh.Process(data) } return nil } func (p *Connection) newIdentity() uint32 { return atomic.AddUint32(&p.identity,1) } func (p *Connection) addApplicant(identity uint32,ch chan []byte) { p.mutex.Lock() defer p.mutex.Unlock() p.applicants[identity] = ch } func (p *Connection) popApplicant(identity uint32) (chan []byte,bool) { p.mutex.Lock() defer p.mutex.Unlock() ch,ok := p.applicants[identity] if !ok { return nil,false } delete(p.applicants,identity) return ch,true }
以上是大佬教程为你收集整理的[Golang]网络游戏协议处理框架全部内容,希望文章能够帮你解决[Golang]网络游戏协议处理框架所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。