xugu_buffer.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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 int
  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. fmt.Println("大于缓冲区: len(buf) > cap(b.buf)")
  29. return ErrBusyBuffer
  30. }
  31. b.buf = buf[:cap(buf)]
  32. return nil
  33. }
  34. func (b *buffer) peekChar() byte {
  35. ret := b.buf[b.idx]
  36. // fmt.Println("peekChar内部的: ", b.buf[b.idx:])
  37. return ret
  38. }
  39. func (b *buffer) reset() {
  40. b.idx = 0
  41. b.buf = make([]byte, 2048)
  42. }
  43. // 返回指定字节的切片
  44. func (b *buffer) readNext(need int, reverse bool) []byte {
  45. //长度不够返回
  46. if len(b.buf[b.idx:]) < need {
  47. //调用一次接收服务器消息
  48. b.conn.Read(b.buf[b.idx:])
  49. offset := b.idx
  50. b.idx += need
  51. return b.buf[offset:b.idx]
  52. }
  53. offset := b.idx
  54. b.idx += need
  55. //fmt.Println("readNext: ", b.buf[offset:b.idx])
  56. if reverse {
  57. // tmp2 := b.buf[offset:b.idx]
  58. //fmt.Println("readNext: 转换小端前", tmp2, " - ", string(tmp2))
  59. tmp := reverseBytes(b.buf[offset:b.idx])
  60. // fmt.Println("readNext: 转换小端后", tmp, " - ", string(tmp))
  61. return tmp
  62. } else {
  63. // fmt.Println("readNext: 没有转换:", b.buf[offset:b.idx])
  64. // fmt.Println("readNext: 没有转换:", string(b.buf[offset:b.idx]))
  65. return b.buf[offset:b.idx]
  66. }
  67. }