func (this *Server) handleClientConn(conn *net.TCPConn) { this.waitGroup.Add(1) defer this.waitGroup.Done() receivePackets := make(chan *packet.Packet, 100) // 接收到的包 chStop := make(chan bool) // 通知停止消息处理 addr := conn.RemoteAddr().String() defer func() { defer func() { if e := recover(); e != nil { log.Printf("Panic: %v\r\n", e) } }() handlers.CloseConn(conn) log.Printf("Disconnect: %v\r\n", addr) chStop <- true }() // 处理接收到的包 go this.handlePackets(conn, receivePackets, chStop) // 接收数据 log.Printf("HandleClient: %v\r\n", addr) // 包长(4) + 类型(4) + 包体(len(pacData)) var ( bLen []byte = make([]byte, 4) bType []byte = make([]byte, 4) pacLen uint32 ) for { select { case <-this.exitCh: log.Printf("Stop handleClientConn\r\n") return default: } conn.SetReadDeadline(time.Now().Add(this.readTimeout)) if n, err := io.ReadFull(conn, bLen); err != nil && n != 4 { log.Printf("Read pacLen failed: %v\r\n", err) return } if n, err := io.ReadFull(conn, bType); err != nil && n != 4 { log.Printf("Read pacType failed: %v\r\n", err) return } if pacLen = convert.BytesToUint32(bLen); pacLen > this.maxPacLen { log.Printf("pacLen larger than maxPacLen\r\n") return } pacData := make([]byte, pacLen-8) if n, err := io.ReadFull(conn, pacData); err != nil && n != int(pacLen) { log.Printf("Read pacData failed: %v\r\n", err) return } receivePackets <- &packet.Packet{ Len: pacLen, Type: convert.BytesToUint32(bType), Data: pacData, } } }
func (this *Server) handleClientConn(conn *net.TCPConn) { this.waitGroup.Add(1) defer this.waitGroup.Done() receivePackets := make(chan *packet.Packet, 20) // 接收到的包 chStop := make(chan bool) // 通知停止消息处理 addr := conn.RemoteAddr().String() defer func() { defer func() { if e := recover(); e != nil { log.Printf("Panic: %v\r\n", e) } }() handlers.CloseConn(conn) log.Printf("Disconnect: %v\r\n", addr) chStop <- true }() // 处理接收到的包 go this.handlePackets(conn, receivePackets, chStop) // 接收数据 log.Printf("HandleClient: %v\r\n", addr) request := this.reqMemPool.Get().([]byte) defer this.reqMemPool.Put(request) rbuf := this.rbufMemPool.Get().(*ringbuffer.RingBuffer) defer this.rbufMemPool.Put(rbuf) for { select { case <-this.exitCh: log.Printf("Stop handleClientConn\r\n") return default: } conn.SetReadDeadline(time.Now().Add(this.readTimeout)) readSize, err := conn.Read(request) if err != nil { log.Printf("Read failed: %v\r\n", err) return } if readSize > 0 { rbuf.Write(request[:readSize]) // 包长(4) + 类型(4) + 包体(len([]byte)) for { if rbuf.Size() >= 8 { pacLen := convert.BytesToUint32(rbuf.Bytes(4)) if rbuf.Size() >= int(pacLen) { rbuf.Peek(4) receivePackets <- &packet.Packet{ Len: pacLen, Type: convert.BytesToUint32(rbuf.Read(4)), Data: rbuf.Read(int(pacLen) - 8), } } else { break } } else { break } } } } }