xugu_buffer.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package xugu
  2. import (
  3. "errors"
  4. "fmt"
  5. "net"
  6. "time"
  7. )
  8. var (
  9. ErrBusyBuffer = errors.New("busy buffer")
  10. )
  11. type buffer struct {
  12. buf []byte // buf 是一个字节缓冲区,长度和容量相等。
  13. conn net.Conn
  14. idx int64
  15. length int
  16. timeout time.Duration
  17. }
  18. // newBuffer 分配并返回一个新的缓冲区。
  19. func newBuffer(nc net.Conn) buffer {
  20. return buffer{
  21. buf: make([]byte, 2048),
  22. conn: nc,
  23. }
  24. }
  25. // store 存储 buf,这是一个更新的缓冲区,如果合适的话。
  26. func (b *buffer) store(buf []byte) error {
  27. if len(buf) > cap(b.buf) {
  28. return ErrBusyBuffer
  29. }
  30. b.buf = buf[:cap(buf)]
  31. return nil
  32. }
  33. func (b *buffer) peekChar() byte {
  34. ret := b.buf[b.idx]
  35. // fmt.Println("peekChar内部的: ", b.buf[b.idx:])
  36. return ret
  37. }
  38. func (b *buffer) reset() {
  39. b.idx = 0
  40. b.length = 0
  41. b.buf = make([]byte, 2048)
  42. }
  43. func (b *buffer) readNext(need int, reverse bool) ([]byte, error) {
  44. //长度不够返回
  45. if len(b.buf[b.idx:b.length]) < need {
  46. buffer := make([]byte, need+1)
  47. b.buf = append(b.buf[:b.length], buffer...)
  48. n, err := b.conn.Read(b.buf[b.length:])
  49. if err != nil {
  50. // if err == io.EOF {
  51. // }
  52. // fmt.Println("Error reading from server:", err)
  53. return nil, err
  54. }
  55. b.length += n
  56. for b.length-int(b.idx) < need {
  57. n, err := b.conn.Read(b.buf[b.length:])
  58. if err != nil {
  59. // if err == io.EOF {
  60. // fmt.Println("End of data")
  61. // }
  62. fmt.Println("Error reading from server:", err)
  63. return nil, err
  64. }
  65. //nTmp += n
  66. b.length += n
  67. }
  68. }
  69. offset := b.idx
  70. b.idx += int64(need)
  71. if reverse {
  72. // tmp2 := b.buf[offset:b.idx]
  73. //fmt.Println("readNext: 转换小端前", tmp2, " - ", string(tmp2))
  74. tmp := reverseBytes(b.buf[offset:b.idx])
  75. // fmt.Println("readNext: 转换小端后", tmp, " - ", string(tmp))
  76. return tmp, nil
  77. } else {
  78. // fmt.Println("readNext: 没有转换:", b.buf[offset:b.idx])
  79. // fmt.Println("readNext: 没有转换:", string(b.buf[offset:b.idx]))
  80. return b.buf[offset:b.idx], nil
  81. }
  82. }