netpackager.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. package core
  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 uint32
  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 = uint32(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 uint16
  136. BasePackager
  137. }
  138. func (Self *MuxPackager) NewPac(flag uint8, id int32, content ...interface{}) (err error) {
  139. Self.Flag = flag
  140. Self.Id = id
  141. if flag == MUX_NEW_MSG {
  142. err = Self.BasePackager.NewPac(content...)
  143. }
  144. if flag == MUX_MSG_SEND_OK {
  145. // MUX_MSG_SEND_OK only allows one data
  146. switch content[0].(type) {
  147. case int:
  148. Self.Window = uint16(content[0].(int))
  149. case uint16:
  150. Self.Window = content[0].(uint16)
  151. }
  152. }
  153. return
  154. }
  155. func (Self *MuxPackager) Pack(writer io.Writer) (err error) {
  156. err = binary.Write(writer, binary.LittleEndian, Self.Flag)
  157. if err != nil {
  158. return
  159. }
  160. err = binary.Write(writer, binary.LittleEndian, Self.Id)
  161. if err != nil {
  162. return
  163. }
  164. if Self.Flag == MUX_NEW_MSG {
  165. err = Self.BasePackager.Pack(writer)
  166. }
  167. if Self.Flag == MUX_MSG_SEND_OK {
  168. err = binary.Write(writer, binary.LittleEndian, Self.Window)
  169. }
  170. return
  171. }
  172. func (Self *MuxPackager) UnPack(reader io.Reader) (err error) {
  173. Self.BasePackager.clean() // also clean the content
  174. err = binary.Read(reader, binary.LittleEndian, &Self.Flag)
  175. if err != nil {
  176. return
  177. }
  178. err = binary.Read(reader, binary.LittleEndian, &Self.Id)
  179. if err != nil {
  180. return
  181. }
  182. if Self.Flag == MUX_NEW_MSG {
  183. err = Self.BasePackager.UnPack(reader)
  184. }
  185. if Self.Flag == MUX_MSG_SEND_OK {
  186. err = binary.Read(reader, binary.LittleEndian, &Self.Window)
  187. }
  188. return
  189. }