[Go] 轻量服务器框架基础TCP连接的抽象和封装
发布时间:2021-05-21 06:47:33 所属栏目:大数据 来源: https://www.jb51.cc
导读:对tcp连接部分以及与连接绑定的业务部分进行抽象和封装 主要是对连接的开启关闭和读写进行封装,抽象出接口,使用回调进行具体业务的绑定 zinterface/iconnection.go @H_502_6@ package zinterfaceimport " net " type IConnection interface{ Start() Stop(
对tcp连接部分以及与连接绑定的业务部分进行抽象和封装 主要是对连接的开启关闭和读写进行封装,抽象出接口,使用回调进行具体业务的绑定 zinterface/iconnection.go @H_502_6@package zinterface import "net" type IConnection interface{ Start() Stop() GetConnId() uint32 IsClosed() bool Send(data []byte,len int) error GetRemoteAddr() net.Addr GetConn() *net.TCPConn } type HandleFunc func (*net.TCPConn,[]int) error znet/connection.go @H_502_6@package znet import ( log" zinx/zinterface ) type Connection struct { ConnId uint32 Conn *net.TCPConn Closed RemoteAddr net.Addr ExitChan chan HandleAPI zinterface.HandleFunc } func NewConnection(connid uint32,conn *net.TCPConn,callback zinterface.HandleFunc) zinterface.IConnection { c := &Connection{ ConnId: connid,Conn: conn,Closed: false,ExitChan: make(chan bool,1),HandleAPI: callback,} return c } func (c *Connection) StartRead() { defer c.Stop() for { b := make([]512) len,err := c.Conn.Read(b) if err != nil { log.Println(read tcp err recv from client %s,len=%d,connid=%dif err:=c.HandleAPI(c.Conn,len);err!=nil{ log.Println(c.handleAPI err Connection) Start() { go c.StartRead() } func (c *Connection) Stop() { if c.Closed { return } c.Closed = true c.Conn.Close() close(c.ExitChan) } func (c *Connection) GetConnId() uint32 { return c.ConnId } func (c *Connection) Send(data []) error { return nil } func (c *Connection) GetRemoteAddr() net.Addr { return c.Conn.RemoteAddr() } func (c *Connection) GetConn() *net.TCPConn { return c.Conn } func (c *Connection) IsClosed() { return c.Closed } znet/server.go @H_502_6@fmterrors ) type Server struct { Name string IP IPversion Port } func Callbackapi(conn *net.TCPConn,readData []) error{ if _,err := conn.Write(readData[:len]); err != nil { log.Println(write tcp err write tcp err) } log.Println(callback write...) return nil } func (s *Server) Start() { log.Printf(%s %s:%d start...nfmt.Sprintf(%s:%dresolve tcp addr err net.ListenTCP(s.IPversion,addr) listen tcp err 0 { conn,1)"> listener.AcceptTCP() nil { log.Println(accept tcp err NewConnection(connid,conn,Callbackapi) go dealConn.Start() connid++ } }() } func (s *Server) Stop() { } func (s *Server) Server() { s.Start() select {} } func NewServer(name ) zinterface.IServer { s := &Server{ Name: name,IP: 0.0.0.0tcp48999(编辑:北几岛) |