netpackager.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. package common
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "encoding/json"
  6. "errors"
  7. "io"
  8. "strings"
  9. )
  10. type NetPackager interface {
  11. Pack(writer io.Writer) (err error)
  12. UnPack(reader io.Reader) (err error)
  13. }
  14. type BasePackager struct {
  15. Length uint16
  16. Content []byte
  17. }
  18. func (Self *BasePackager) NewPac(contents ...interface{}) (err error) {
  19. Self.clean()
  20. for _, content := range contents {
  21. switch content.(type) {
  22. case nil:
  23. Self.Content = Self.Content[:0]
  24. case []byte:
  25. err = Self.appendByte(content.([]byte))
  26. case string:
  27. err = Self.appendByte([]byte(content.(string)))
  28. if err != nil {
  29. return
  30. }
  31. err = Self.appendByte([]byte(CONN_DATA_SEQ))
  32. default:
  33. err = Self.marshal(content)
  34. }
  35. }
  36. Self.setLength()
  37. return
  38. }
  39. func (Self *BasePackager) appendByte(data []byte) (err error) {
  40. m := len(Self.Content)
  41. n := m + len(data)
  42. if n <= cap(Self.Content) {
  43. Self.Content = Self.Content[0:n] // grow the length for copy
  44. copy(Self.Content[m:n], data)
  45. return nil
  46. } else {
  47. return errors.New("pack content too large")
  48. }
  49. }
  50. //似乎这里涉及到父类作用域问题,当子类调用父类的方法时,其struct仅仅为父类的
  51. func (Self *BasePackager) Pack(writer io.Writer) (err error) {
  52. err = binary.Write(writer, binary.LittleEndian, Self.Length)
  53. if err != nil {
  54. return
  55. }
  56. err = binary.Write(writer, binary.LittleEndian, Self.Content)
  57. return
  58. }
  59. //Unpack 会导致传入的数字类型转化成float64!!
  60. //主要原因是json unmarshal并未传入正确的数据类型
  61. func (Self *BasePackager) UnPack(reader io.Reader) (n uint16, err error) {
  62. Self.clean()
  63. n += 2 // uint16
  64. err = binary.Read(reader, binary.LittleEndian, &Self.Length)
  65. if err != nil {
  66. return
  67. }
  68. if int(Self.Length) > cap(Self.Content) {
  69. err = errors.New("unpack err, content length too large")
  70. }
  71. Self.Content = Self.Content[:int(Self.Length)]
  72. //n, err := io.ReadFull(reader, Self.Content)
  73. //if n != int(Self.Length) {
  74. // err = io.ErrUnexpectedEOF
  75. //}
  76. err = binary.Read(reader, binary.LittleEndian, Self.Content)
  77. n += Self.Length
  78. return
  79. }
  80. func (Self *BasePackager) marshal(content interface{}) (err error) {
  81. tmp, err := json.Marshal(content)
  82. if err != nil {
  83. return err
  84. }
  85. err = Self.appendByte(tmp)
  86. return
  87. }
  88. func (Self *BasePackager) Unmarshal(content interface{}) (err error) {
  89. err = json.Unmarshal(Self.Content, content)
  90. if err != nil {
  91. return err
  92. }
  93. return
  94. }
  95. func (Self *BasePackager) setLength() {
  96. Self.Length = uint16(len(Self.Content))
  97. return
  98. }
  99. func (Self *BasePackager) clean() {
  100. Self.Length = 0
  101. Self.Content = Self.Content[:0] // reset length
  102. }
  103. func (Self *BasePackager) Split() (strList []string) {
  104. n := bytes.IndexByte(Self.Content, 0)
  105. strList = strings.Split(string(Self.Content[:n]), CONN_DATA_SEQ)
  106. strList = strList[0 : len(strList)-1]
  107. return
  108. }
  109. type ConnPackager struct { // Todo
  110. ConnType uint8
  111. BasePackager
  112. }
  113. func (Self *ConnPackager) NewPac(connType uint8, content ...interface{}) (err error) {
  114. Self.ConnType = connType
  115. err = Self.BasePackager.NewPac(content...)
  116. return
  117. }
  118. func (Self *ConnPackager) Pack(writer io.Writer) (err error) {
  119. err = binary.Write(writer, binary.LittleEndian, Self.ConnType)
  120. if err != nil {
  121. return
  122. }
  123. err = Self.BasePackager.Pack(writer)
  124. return
  125. }
  126. func (Self *ConnPackager) UnPack(reader io.Reader) (n uint16, err error) {
  127. err = binary.Read(reader, binary.LittleEndian, &Self.ConnType)
  128. if err != nil && err != io.EOF {
  129. return
  130. }
  131. n, err = Self.BasePackager.UnPack(reader)
  132. n += 2
  133. return
  134. }
  135. type MuxPackager struct {
  136. Flag uint8
  137. Id int32
  138. Window uint32
  139. ReadLength uint32
  140. BasePackager
  141. }
  142. func (Self *MuxPackager) NewPac(flag uint8, id int32, content ...interface{}) (err error) {
  143. Self.Flag = flag
  144. Self.Id = id
  145. switch flag {
  146. case MUX_PING_FLAG, MUX_PING_RETURN, MUX_NEW_MSG, MUX_NEW_MSG_PART:
  147. Self.Content = WindowBuff.Get()
  148. err = Self.BasePackager.NewPac(content...)
  149. //logs.Warn(Self.Length, string(Self.Content))
  150. case MUX_MSG_SEND_OK:
  151. // MUX_MSG_SEND_OK contains two data
  152. switch content[0].(type) {
  153. case int:
  154. Self.Window = uint32(content[0].(int))
  155. case uint32:
  156. Self.Window = content[0].(uint32)
  157. }
  158. switch content[1].(type) {
  159. case int:
  160. Self.ReadLength = uint32(content[1].(int))
  161. case uint32:
  162. Self.ReadLength = content[1].(uint32)
  163. }
  164. }
  165. return
  166. }
  167. func (Self *MuxPackager) Pack(writer io.Writer) (err error) {
  168. err = binary.Write(writer, binary.LittleEndian, Self.Flag)
  169. if err != nil {
  170. return
  171. }
  172. err = binary.Write(writer, binary.LittleEndian, Self.Id)
  173. if err != nil {
  174. return
  175. }
  176. switch Self.Flag {
  177. case MUX_NEW_MSG, MUX_NEW_MSG_PART, MUX_PING_FLAG, MUX_PING_RETURN:
  178. err = Self.BasePackager.Pack(writer)
  179. WindowBuff.Put(Self.Content)
  180. case MUX_MSG_SEND_OK:
  181. err = binary.Write(writer, binary.LittleEndian, Self.Window)
  182. if err != nil {
  183. return
  184. }
  185. err = binary.Write(writer, binary.LittleEndian, Self.ReadLength)
  186. }
  187. return
  188. }
  189. func (Self *MuxPackager) UnPack(reader io.Reader) (n uint16, err error) {
  190. err = binary.Read(reader, binary.LittleEndian, &Self.Flag)
  191. if err != nil {
  192. return
  193. }
  194. err = binary.Read(reader, binary.LittleEndian, &Self.Id)
  195. if err != nil {
  196. return
  197. }
  198. switch Self.Flag {
  199. case MUX_NEW_MSG, MUX_NEW_MSG_PART, MUX_PING_FLAG, MUX_PING_RETURN:
  200. Self.Content = WindowBuff.Get() // need get a window buf from pool
  201. Self.BasePackager.clean() // also clean the content
  202. n, err = Self.BasePackager.UnPack(reader)
  203. //logs.Warn("unpack", Self.Length, string(Self.Content))
  204. case MUX_MSG_SEND_OK:
  205. err = binary.Read(reader, binary.LittleEndian, &Self.Window)
  206. if err != nil {
  207. return
  208. }
  209. n += 4 // uint32
  210. err = binary.Read(reader, binary.LittleEndian, &Self.ReadLength)
  211. n += 4 // uint32
  212. }
  213. n += 5 //uint8 int32
  214. return
  215. }