xugu_buffer.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package xugu
  2. import (
  3. "errors"
  4. "net"
  5. "time"
  6. )
  7. var (
  8. ErrBusyBuffer = errors.New("busy buffer")
  9. )
  10. type buffer struct {
  11. buf []byte // buf 是一个字节缓冲区,长度和容量相等。
  12. conn net.Conn
  13. idx int64
  14. length int
  15. timeout time.Duration
  16. }
  17. // newBuffer 分配并返回一个新的缓冲区。
  18. func newBuffer(nc net.Conn) buffer {
  19. return buffer{
  20. buf: make([]byte, 2048),
  21. conn: nc,
  22. }
  23. }
  24. func (b *buffer) peekChar() byte {
  25. if b.idx >= int64(len(b.buf[b.idx:b.length])) {
  26. b.readNext(1, false)
  27. b.idx-- //peekchar 只查看当前字符,不移动指针,但是readNext会移动指针,所以需要-1
  28. }
  29. ret := b.buf[b.idx]
  30. return ret
  31. }
  32. func (b *buffer) reset() {
  33. b.idx = 0
  34. b.length = 0
  35. b.buf = make([]byte, 2048)
  36. }
  37. func (b *buffer) readNext(need int, reverse bool) ([]byte, error) {
  38. if need == 0 {
  39. return nil, nil
  40. }
  41. //长度不够返回
  42. if len(b.buf[b.idx:b.length]) < need {
  43. buffer := make([]byte, need+1)
  44. b.buf = append(b.buf[:b.length], buffer...)
  45. n, err := b.conn.Read(b.buf[b.length:])
  46. if err != nil {
  47. // if err == io.EOF {
  48. // }
  49. return nil, err
  50. }
  51. b.length += n
  52. for b.length-int(b.idx) < need {
  53. n, err := b.conn.Read(b.buf[b.length:])
  54. if err != nil {
  55. // if err == io.EOF {
  56. // fmt.Println("End of data")
  57. // }
  58. return nil, err
  59. }
  60. //nTmp += n
  61. b.length += n
  62. }
  63. }
  64. offset := b.idx
  65. b.idx += int64(need)
  66. if GlobalIsBig {
  67. reverse = false
  68. }
  69. if reverse {
  70. tmp := reverseBytes(b.buf[offset:b.idx])
  71. return tmp, nil
  72. } else {
  73. return b.buf[offset:b.idx], nil
  74. }
  75. }