message.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package rpc
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "errors"
  6. "io"
  7. )
  8. const (
  9. FuncPing uint8 = 0x01
  10. FuncRequest = 0x02
  11. FuncResponse = 0x03
  12. )
  13. var (
  14. feature = []byte{82, 80, 67} //RPC数据包
  15. errInvalidPackage = errors.New("invalid package")
  16. )
  17. type Frame struct {
  18. Feature []byte //特征码 RPC
  19. Func uint8
  20. Sequence uint16
  21. Length uint16
  22. Data []byte
  23. }
  24. func readFrame(r io.Reader) (frame *Frame, err error) {
  25. var (
  26. n int
  27. )
  28. frame = &Frame{Feature: make([]byte, 3)}
  29. if _, err = io.ReadFull(r, frame.Feature); err != nil {
  30. return
  31. }
  32. if !bytes.Equal(frame.Feature, feature) {
  33. err = errInvalidPackage
  34. return
  35. }
  36. if err = binary.Read(r, binary.LittleEndian, &frame.Func); err != nil {
  37. return
  38. }
  39. if err = binary.Read(r, binary.LittleEndian, &frame.Sequence); err != nil {
  40. return
  41. }
  42. if err = binary.Read(r, binary.LittleEndian, &frame.Length); err != nil {
  43. return
  44. }
  45. frame.Data = make([]byte, frame.Length)
  46. if n, err = io.ReadFull(r, frame.Data); err == nil {
  47. if n < int(frame.Length) {
  48. err = io.ErrShortBuffer
  49. }
  50. }
  51. return
  52. }
  53. func writeFrame(w io.Writer, frame *Frame) (err error) {
  54. var (
  55. n int
  56. )
  57. if frame.Length == 0 {
  58. frame.Length = uint16(len(frame.Data))
  59. }
  60. if _, err = w.Write(feature); err != nil {
  61. return
  62. }
  63. if err = binary.Write(w, binary.LittleEndian, frame.Func); err != nil {
  64. return
  65. }
  66. if err = binary.Write(w, binary.LittleEndian, frame.Sequence); err != nil {
  67. return
  68. }
  69. if err = binary.Write(w, binary.LittleEndian, frame.Length); err != nil {
  70. return
  71. }
  72. if n, err = w.Write(frame.Data); err == nil {
  73. if n < int(frame.Length) {
  74. err = io.ErrShortWrite
  75. }
  76. }
  77. return
  78. }