Server.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using FunnyCommon.Remoting.Protocol;
  7. using FunnyCommon.Shared;
  8. namespace FunnyCommon.Remoting.Networking
  9. {
  10. public class Server : ServerBase
  11. {
  12. private readonly IPiGpoutManager _gpoutManager;
  13. public Server(IPiGpoutManager gpoutManager)
  14. {
  15. _gpoutManager = gpoutManager;
  16. }
  17. protected override void HandleClientOneByOne(Socket client)
  18. {
  19. using (var ns = new NetworkStream(client))
  20. {
  21. using (var br = new BinaryReader(ns))
  22. using (var bw = new BinaryWriter(ns))
  23. {
  24. Log?.WriteLine("Checking Protocol version...");
  25. if (Consts.Version != br.ReadByte())
  26. {
  27. Log?.WriteLine("Protocol version Not matched!");
  28. return;
  29. }
  30. Log?.WriteLine("Enter looping.");
  31. while (client.Connected)
  32. {
  33. ushort count = br.ReadByte();
  34. count += (ushort)(br.ReadByte() * 256);
  35. Log?.WriteLine($"Recv: {count} commands");
  36. var arrCommands = new Command[count];
  37. Log?.Write("Parsing:");
  38. for (var i = 0; i < count; i++)
  39. {
  40. arrCommands[i] = Command.ReadFromStream(ns);
  41. Log?.Write(".");
  42. }
  43. Log?.WriteLine("Success");
  44. var responses = new List<Response>(count);
  45. Log?.WriteLine("*** Begin execute ***");
  46. for (var i = 0; i < arrCommands.Length; i++)
  47. {
  48. var command = arrCommands[i];
  49. try
  50. {
  51. var r = command.Execute(_gpoutManager);
  52. responses.Add(r);
  53. Log?.WriteLine($"{i:00000} - {r}");
  54. }
  55. catch (Exception ex)
  56. {
  57. responses.Add(new Response { Success = false, Message = ex.Message });
  58. Log?.WriteLine("<ERROR>");
  59. Log?.WriteLine(ex.ToString());
  60. break;
  61. }
  62. }
  63. Log?.WriteLine("*** Finish execute ***");
  64. Log?.Write($"Writing response({responses.Count}):");
  65. bw.Write((byte)responses.Count);
  66. bw.Write((byte)(responses.Count >> 8));
  67. foreach (var response in responses)
  68. {
  69. var buf = response.ToBytes();
  70. bw.Write(buf);
  71. Log?.Write(buf.Length + ".");
  72. }
  73. Log?.WriteLine();
  74. Log?.WriteLine($"To be next loop...");
  75. }
  76. }
  77. }
  78. }
  79. }
  80. public abstract class ServerBase : IDisposable
  81. {
  82. private Socket _svr;
  83. public TextWriter Log { get; set; }
  84. public void Start(int port)
  85. {
  86. Stop();
  87. _svr = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  88. _svr.Bind(new IPEndPoint(IPAddress.Any, port));
  89. _svr.Listen(1);
  90. AsyncCallback accept = null;
  91. accept = ar =>
  92. {
  93. var cl = _svr.EndAccept(ar);
  94. Log?.WriteLine($"Accept from {cl.RemoteEndPoint}");
  95. try
  96. {
  97. HandleClientOneByOne(cl);
  98. }
  99. catch (Exception ex)
  100. {
  101. Log?.WriteLine(ex);
  102. }
  103. cl.Close();
  104. _svr.BeginAccept(accept, null);
  105. };
  106. _svr.BeginAccept(accept, null);
  107. }
  108. public void Stop()
  109. {
  110. _svr?.Close();
  111. }
  112. public void Dispose()
  113. {
  114. Stop();
  115. }
  116. protected abstract void HandleClientOneByOne(Socket client);
  117. }
  118. }