github.com/cnotch/ipchub@v1.1.0/service/rtsp/io.go (about) 1 // Copyright (c) 2019,CAOHONGJU All rights reserved. 2 // Use of this source code is governed by a MIT-style 3 // license that can be found in the LICENSE file. 4 5 package rtsp 6 7 import ( 8 "bufio" 9 "strings" 10 11 "github.com/cnotch/xlog" 12 ) 13 14 // 接收处理器接口 15 type receiveHandler interface { 16 onRequest(req *Request) error 17 onResponse(resp *Response) error 18 onPack(pack *RTPPack) error 19 } 20 21 // 统一消息接受函数 22 func receive(logger *xlog.Logger, r *bufio.Reader, 23 channels []int, handler receiveHandler) error { 24 25 // 预取4个字节 26 sl, err := r.Peek(4) 27 if err != nil { 28 return err 29 } 30 31 // 如果是 RTP 流 32 if sl[0] == rtpPackPrefix { 33 pack, err := ReadPacket(r, channels) 34 if err != nil { 35 if pack != nil { // 通道不匹配 36 logger.Warn(err.Error()) 37 return nil 38 } 39 logger.Errorf("decode rtp pack failed; %v.", err) 40 return err 41 } 42 return handler.onPack(pack) 43 } 44 45 i := 0 46 for ; i < 4; i++ { 47 if sl[i] != rtspProto[i] { 48 break 49 } 50 } 51 52 if i == 4 { // 比较完成并且相等,是Response 53 resp, err := ReadResponse(r) 54 if err != nil { 55 logger.Errorf("decode response failed; %v.", err) 56 return err 57 } 58 59 if logger.LevelEnabled(xlog.DebugLevel) { 60 logger.Debugf("<<<===\r\n%s", strings.TrimSpace(resp.String())) 61 } 62 return handler.onResponse(resp) 63 } 64 65 // 是请求 66 req, err := ReadRequest(r) 67 if err != nil { 68 logger.Errorf("decode request failed; %v.", err) 69 return err 70 } 71 72 if logger.LevelEnabled(xlog.DebugLevel) { 73 logger.Debugf("<<<===\r\n%s", strings.TrimSpace(req.String())) 74 } 75 return handler.onRequest(req) 76 }