snappy.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package conn
  2. import (
  3. "github.com/cnlh/nps/lib/crypt"
  4. "github.com/cnlh/nps/lib/lg"
  5. "github.com/cnlh/nps/lib/pool"
  6. "github.com/cnlh/nps/lib/rate"
  7. "github.com/cnlh/nps/vender/github.com/golang/snappy"
  8. "log"
  9. "net"
  10. )
  11. type SnappyConn struct {
  12. w *snappy.Writer
  13. r *snappy.Reader
  14. crypt bool
  15. rate *rate.Rate
  16. }
  17. func NewSnappyConn(conn net.Conn, crypt bool, rate *rate.Rate) *SnappyConn {
  18. c := new(SnappyConn)
  19. c.w = snappy.NewBufferedWriter(conn)
  20. c.r = snappy.NewReader(conn)
  21. c.crypt = crypt
  22. c.rate = rate
  23. return c
  24. }
  25. //snappy压缩写 包含加密
  26. func (s *SnappyConn) Write(b []byte) (n int, err error) {
  27. n = len(b)
  28. if s.crypt {
  29. if b, err = crypt.AesEncrypt(b, []byte(cryptKey)); err != nil {
  30. lg.Println("encode crypt error:", err)
  31. return
  32. }
  33. }
  34. if _, err = s.w.Write(b); err != nil {
  35. return
  36. }
  37. if err = s.w.Flush(); err != nil {
  38. return
  39. }
  40. if s.rate != nil {
  41. s.rate.Get(int64(n))
  42. }
  43. return
  44. }
  45. //snappy压缩读 包含解密
  46. func (s *SnappyConn) Read(b []byte) (n int, err error) {
  47. buf := pool.BufPool.Get().([]byte)
  48. defer pool.BufPool.Put(buf)
  49. if n, err = s.r.Read(buf); err != nil {
  50. return
  51. }
  52. var bs []byte
  53. if s.crypt {
  54. if bs, err = crypt.AesDecrypt(buf[:n], []byte(cryptKey)); err != nil {
  55. log.Println("decode crypt error:", err)
  56. return
  57. }
  58. } else {
  59. bs = buf[:n]
  60. }
  61. n = len(bs)
  62. copy(b, bs)
  63. if s.rate != nil {
  64. s.rate.Get(int64(n))
  65. }
  66. return
  67. }