netpackager.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  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) (err error) {
  62. Self.clean()
  63. err = binary.Read(reader, binary.LittleEndian, &Self.Length)
  64. if err != nil {
  65. return
  66. }
  67. if int(Self.Length) > cap(Self.Content) {
  68. err = errors.New("unpack err, content length too large")
  69. }
  70. Self.Content = Self.Content[:int(Self.Length)]
  71. //n, err := io.ReadFull(reader, Self.Content)
  72. //if n != int(Self.Length) {
  73. // err = io.ErrUnexpectedEOF
  74. //}
  75. err = binary.Read(reader, binary.LittleEndian, Self.Content)
  76. return
  77. }
  78. func (Self *BasePackager) marshal(content interface{}) (err error) {
  79. tmp, err := json.Marshal(content)
  80. if err != nil {
  81. return err
  82. }
  83. err = Self.appendByte(tmp)
  84. return
  85. }
  86. func (Self *BasePackager) Unmarshal(content interface{}) (err error) {
  87. err = json.Unmarshal(Self.Content, content)
  88. if err != nil {
  89. return err
  90. }
  91. return
  92. }
  93. func (Self *BasePackager) setLength() {
  94. Self.Length = uint16(len(Self.Content))
  95. return
  96. }
  97. func (Self *BasePackager) clean() {
  98. Self.Length = 0
  99. Self.Content = Self.Content[:0] // reset length
  100. }
  101. func (Self *BasePackager) Split() (strList []string) {
  102. n := bytes.IndexByte(Self.Content, 0)
  103. strList = strings.Split(string(Self.Content[:n]), CONN_DATA_SEQ)
  104. strList = strList[0 : len(strList)-1]
  105. return
  106. }
  107. type ConnPackager struct { // Todo
  108. ConnType uint8
  109. BasePackager
  110. }
  111. func (Self *ConnPackager) NewPac(connType uint8, content ...interface{}) (err error) {
  112. Self.ConnType = connType
  113. err = Self.BasePackager.NewPac(content...)
  114. return
  115. }
  116. func (Self *ConnPackager) Pack(writer io.Writer) (err error) {
  117. err = binary.Write(writer, binary.LittleEndian, Self.ConnType)
  118. if err != nil {
  119. return
  120. }
  121. err = Self.BasePackager.Pack(writer)
  122. return
  123. }
  124. func (Self *ConnPackager) UnPack(reader io.Reader) (err error) {
  125. err = binary.Read(reader, binary.LittleEndian, &Self.ConnType)
  126. if err != nil && err != io.EOF {
  127. return
  128. }
  129. err = Self.BasePackager.UnPack(reader)
  130. return
  131. }
  132. type MuxPackager struct {
  133. Flag uint8
  134. Id int32
  135. Window uint32
  136. ReadLength uint32
  137. BasePackager
  138. }
  139. func (Self *MuxPackager) NewPac(flag uint8, id int32, content ...interface{}) (err error) {
  140. Self.Flag = flag
  141. Self.Id = id
  142. switch flag {
  143. case MUX_PING_FLAG, MUX_PING_RETURN, MUX_NEW_MSG, MUX_NEW_MSG_PART:
  144. Self.Content = WindowBuff.Get()
  145. err = Self.BasePackager.NewPac(content...)
  146. //logs.Warn(Self.Length, string(Self.Content))
  147. case MUX_MSG_SEND_OK:
  148. // MUX_MSG_SEND_OK contains two data
  149. switch content[0].(type) {
  150. case int:
  151. Self.Window = uint32(content[0].(int))
  152. case uint32:
  153. Self.Window = content[0].(uint32)
  154. }
  155. switch content[1].(type) {
  156. case int:
  157. Self.ReadLength = uint32(content[1].(int))
  158. case uint32:
  159. Self.ReadLength = content[1].(uint32)
  160. }
  161. }
  162. return
  163. }
  164. func (Self *MuxPackager) Pack(writer io.Writer) (err error) {
  165. err = binary.Write(writer, binary.LittleEndian, Self.Flag)
  166. if err != nil {
  167. return
  168. }
  169. err = binary.Write(writer, binary.LittleEndian, Self.Id)
  170. if err != nil {
  171. return
  172. }
  173. switch Self.Flag {
  174. case MUX_NEW_MSG, MUX_NEW_MSG_PART, MUX_PING_FLAG, MUX_PING_RETURN:
  175. err = Self.BasePackager.Pack(writer)
  176. WindowBuff.Put(Self.Content)
  177. case MUX_MSG_SEND_OK:
  178. err = binary.Write(writer, binary.LittleEndian, Self.Window)
  179. if err != nil {
  180. return
  181. }
  182. err = binary.Write(writer, binary.LittleEndian, Self.ReadLength)
  183. }
  184. return
  185. }
  186. func (Self *MuxPackager) UnPack(reader io.Reader) (err error) {
  187. err = binary.Read(reader, binary.LittleEndian, &Self.Flag)
  188. if err != nil {
  189. return
  190. }
  191. err = binary.Read(reader, binary.LittleEndian, &Self.Id)
  192. if err != nil {
  193. return
  194. }
  195. switch Self.Flag {
  196. case MUX_NEW_MSG, MUX_NEW_MSG_PART, MUX_PING_FLAG, MUX_PING_RETURN:
  197. Self.Content = WindowBuff.Get() // need get a window buf from pool
  198. Self.BasePackager.clean() // also clean the content
  199. err = Self.BasePackager.UnPack(reader)
  200. //logs.Warn("unpack", Self.Length, string(Self.Content))
  201. case MUX_MSG_SEND_OK:
  202. err = binary.Read(reader, binary.LittleEndian, &Self.Window)
  203. if err != nil {
  204. return
  205. }
  206. err = binary.Read(reader, binary.LittleEndian, &Self.ReadLength)
  207. }
  208. return
  209. }