BinaryMessage.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using SocketIOClient.Transport;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Text.Json;
  5. namespace SocketIOClient.Messages
  6. {
  7. public class BinaryMessage : IMessage
  8. {
  9. public MessageType Type => MessageType.BinaryMessage;
  10. public string Namespace { get; set; }
  11. public string Event { get; set; }
  12. public int Id { get; set; }
  13. public List<JsonElement> JsonElements { get; set; }
  14. public string Json { get; set; }
  15. public int BinaryCount { get; set; }
  16. public int Eio { get; set; }
  17. public TransportProtocol Protocol { get; set; }
  18. public List<byte[]> OutgoingBytes { get; set; }
  19. public List<byte[]> IncomingBytes { get; set; }
  20. public void Read(string msg)
  21. {
  22. int index1 = msg.IndexOf('-');
  23. BinaryCount = int.Parse(msg.Substring(0, index1));
  24. int index2 = msg.IndexOf('[');
  25. int index3 = msg.LastIndexOf(',', index2);
  26. if (index3 > -1)
  27. {
  28. Namespace = msg.Substring(index1 + 1, index3 - index1 - 1);
  29. int idLength = index2 - index3 - 1;
  30. if (idLength > 0)
  31. {
  32. Id = int.Parse(msg.Substring(index3 + 1, idLength));
  33. }
  34. }
  35. else
  36. {
  37. int idLength = index2 - index1 - 1;
  38. if (idLength > 0)
  39. {
  40. Id = int.Parse(msg.Substring(index1 + 1, idLength));
  41. }
  42. }
  43. string json = msg.Substring(index2);
  44. var array = JsonDocument.Parse(json).RootElement.EnumerateArray();
  45. int i = -1;
  46. foreach (var item in array)
  47. {
  48. i++;
  49. if (i == 0)
  50. {
  51. Event = item.GetString();
  52. JsonElements = new List<JsonElement>();
  53. }
  54. else
  55. {
  56. JsonElements.Add(item);
  57. }
  58. }
  59. }
  60. public string Write()
  61. {
  62. var builder = new StringBuilder();
  63. builder
  64. .Append("45")
  65. .Append(OutgoingBytes.Count)
  66. .Append('-');
  67. if (!string.IsNullOrEmpty(Namespace))
  68. {
  69. builder.Append(Namespace).Append(',');
  70. }
  71. if (string.IsNullOrEmpty(Json))
  72. {
  73. builder.Append("[\"").Append(Event).Append("\"]");
  74. }
  75. else
  76. {
  77. string data = Json.Insert(1, $"\"{Event}\",");
  78. builder.Append(data);
  79. }
  80. return builder.ToString();
  81. }
  82. }
  83. }