SocketServer.cs 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. using System;
  2. using System.Linq;
  3. using System.Text;
  4. using System.Threading;
  5. using Aitex.Core.RT.Event;
  6. using Aitex.Core.RT.Log;
  7. using Aitex.Core.RT.SCCore;
  8. using Aitex.Core.Util;
  9. using Efem.Protocol;
  10. using EFEMSC;
  11. using SuperSocket.SocketBase;
  12. using SuperSocket.SocketBase.Protocol;
  13. namespace EFEM.RT
  14. {
  15. public class RData
  16. {
  17. public string StartMark { get; set; }
  18. public string EndMark { get; set; }
  19. public string Key { get; set; }
  20. public byte[] BodyBuffer { get; set; }
  21. public string BodyString { get; set; }
  22. }
  23. public class RRequestInfo : RequestInfo<RData>
  24. {
  25. public RRequestInfo(string key, RData data)
  26. {
  27. Initialize(key, data);
  28. }
  29. }
  30. public class RReceiveFilter : IReceiveFilter<RRequestInfo>
  31. {
  32. public int leftBufferSize;
  33. public Encoding Encoder = Encoding.GetEncoding("gbk");
  34. public string StartMark = "!Start";
  35. public string EndMark = "$End";
  36. public RReceiveFilter(Encoding encoder, string startMark, string endMark)
  37. {
  38. Encoder = encoder;
  39. StartMark = startMark;
  40. EndMark = endMark;
  41. }
  42. public RRequestInfo Filter(byte[] readBuffer, int offset, int length, bool toBeCopied, out int rest)
  43. {
  44. rest = 0;
  45. byte[] startMarkBuffer = Encoder.GetBytes(StartMark);
  46. byte[] endMarkBuffer = Encoder.GetBytes(EndMark);
  47. if (length < startMarkBuffer.Length + endMarkBuffer.Length)
  48. return null;
  49. byte[] data = new byte[length];
  50. Buffer.BlockCopy(readBuffer, offset, data, 0, length);
  51. string receiveStartMark = Encoder.GetString(data, 0, startMarkBuffer.Length);
  52. string receiveEndMark = Encoder.GetString(data, length - endMarkBuffer.Length, endMarkBuffer.Length);
  53. RData receiveData = new RData();
  54. receiveData.StartMark = StartMark;
  55. receiveData.Key = Guid.NewGuid().ToString("B");
  56. receiveData.BodyBuffer = new byte[length - startMarkBuffer.Length - endMarkBuffer.Length];
  57. Buffer.BlockCopy(data, startMarkBuffer.Length, receiveData.BodyBuffer, 0, length - startMarkBuffer.Length - endMarkBuffer.Length);
  58. receiveData.EndMark = EndMark;
  59. receiveData.BodyString = Encoder.GetString(receiveData.BodyBuffer);
  60. leftBufferSize = length - startMarkBuffer.Length - endMarkBuffer.Length;
  61. if (!receiveStartMark.Equals(StartMark) || !receiveEndMark.Equals(EndMark))
  62. return null;
  63. return new RRequestInfo(receiveData.Key, receiveData);
  64. }
  65. public int LeftBufferSize
  66. {
  67. get { return leftBufferSize; }
  68. }
  69. /// <summary>
  70. ///
  71. /// </summary>
  72. public SuperSocket.SocketBase.Protocol.IReceiveFilter<RRequestInfo> NextReceiveFilter
  73. {
  74. get { return this; }
  75. }
  76. public void Reset()
  77. {
  78. }
  79. public SuperSocket.SocketBase.Protocol.FilterState State
  80. {
  81. get;
  82. private set;
  83. }
  84. }
  85. public class RReceiveFilterFactory : SuperSocket.SocketBase.Protocol.IReceiveFilterFactory<RRequestInfo>
  86. {
  87. /// <summary>
  88. /// 字符编码
  89. /// </summary>
  90. public Encoding Encoder = Encoding.GetEncoding("gbk");
  91. public string StartMark = "!Start";
  92. public string EndMark = "$End";
  93. public RReceiveFilterFactory(Encoding encoder, string startMark, string endMark)
  94. {
  95. Encoder = encoder;
  96. StartMark = startMark;
  97. EndMark = endMark;
  98. }
  99. public SuperSocket.SocketBase.Protocol.IReceiveFilter<RRequestInfo> CreateFilter(SuperSocket.SocketBase.IAppServer appServer, SuperSocket.SocketBase.IAppSession appSession, System.Net.IPEndPoint remoteEndPoint)
  100. {
  101. return new RReceiveFilter(Encoder, StartMark, EndMark);
  102. }
  103. }
  104. public class RAppSession : SuperSocket.SocketBase.AppSession<RAppSession, RRequestInfo>
  105. {
  106. public uint DeviceUDID;
  107. protected override void HandleException(Exception e)
  108. {
  109. }
  110. }
  111. public class InvalidPackageException : ApplicationException
  112. {
  113. public InvalidPackageException(string msg)
  114. : base(msg)
  115. {
  116. }
  117. public override string Message
  118. {
  119. get
  120. {
  121. return base.Message;
  122. }
  123. }
  124. }
  125. public class RAppServer : SuperSocket.SocketBase.AppServer<RAppSession, RRequestInfo>
  126. {
  127. public static Encoding Encoder = Encoding.GetEncoding("gbk");
  128. public static string StartMark = string.Empty;
  129. public static string EndMark = ";\r";
  130. public RAppServer()
  131. : base(new RReceiveFilterFactory(Encoder, StartMark, EndMark))
  132. {
  133. }
  134. public RAppServer(Encoding encoder, string startMark, string endMark)
  135. : base(new RReceiveFilterFactory(encoder, startMark, endMark))
  136. {
  137. RAppServer.Encoder = encoder;
  138. RAppServer.StartMark = startMark;
  139. RAppServer.EndMark = endMark;
  140. }
  141. }
  142. public interface IServerCallback
  143. {
  144. void OnConnected(string sessionId);
  145. void OnDisconnected(string sessionId);
  146. void OnReceived(string msg);
  147. }
  148. public class SocketServer
  149. {
  150. private RAppServer _server = null;
  151. private static Object _lockerSession = new Object();
  152. private RAppSession _session = null;
  153. private string _endMark;
  154. private IServerCallback _callback;
  155. private int _port;
  156. private bool _isFirstTimeReadyInfoMessage = true;
  157. public SocketServer(IServerCallback callback, int port, string endMark= ";\r")
  158. {
  159. _endMark = endMark;
  160. _callback = callback;
  161. _port = port;
  162. _server = new RAppServer(Encoding.ASCII, string.Empty, _endMark);
  163. _server.NewSessionConnected += OnNewSessionConnected;
  164. _server.SessionClosed += OnSessionClosed;
  165. _server.NewRequestReceived += OnReceive;
  166. }
  167. public void Send(string msg)
  168. {
  169. if (_session != null)
  170. {
  171. if (!msg.StartsWith("INFO:READY") || (msg.StartsWith("INFO:READY") && _isFirstTimeReadyInfoMessage))
  172. {
  173. EV.PostInfoLog("Server", string.Format("[Send] {0};", msg));
  174. _isFirstTimeReadyInfoMessage = false;
  175. }
  176. lock (_lockerSession)
  177. {
  178. _session.Send(string.Format("{0};\r", msg));
  179. }
  180. }
  181. else
  182. {
  183. LOG.Write($"Session is null, can not send out {msg}");
  184. }
  185. }
  186. void OnNewSessionConnected(RAppSession session)
  187. {
  188. EV.PostInfoLog("Server", string.Format("Client {0} connected", session.SessionID));
  189. lock (_lockerSession)
  190. {
  191. if (_session != null)
  192. {
  193. EV.PostWarningLog("Server",
  194. string.Format("New connection in, previous connection {0} removed", _session.SessionID));
  195. _session.Close();
  196. }
  197. _session = session;
  198. }
  199. _callback.OnConnected(_session.SessionID);
  200. }
  201. void OnSessionClosed(RAppSession session, CloseReason reason)
  202. {
  203. EV.PostInfoLog("Server", $"Client {session.SessionID} Disconnected, {reason}" );
  204. lock (_lockerSession)
  205. {
  206. if (_session != null && _session.SessionID == session.SessionID)
  207. {
  208. _session = null;
  209. }
  210. }
  211. _callback.OnDisconnected(session.SessionID);
  212. }
  213. void OnReceive(RAppSession session, RRequestInfo requestInfo)
  214. {
  215. string msgOrigin = requestInfo.Body.BodyString;
  216. EV.PostInfoLog("Server", string.Format("[Recv] {0};", msgOrigin));
  217. string[] cmdList = msgOrigin.Split(new char[] { ';', '\r' }, StringSplitOptions.RemoveEmptyEntries);
  218. for (int i = 0; i < cmdList.Length; i++)
  219. {
  220. _callback.OnReceived(cmdList[i]);
  221. Thread.Sleep(50);
  222. }
  223. }
  224. public bool Start(string server, int port)
  225. {
  226. _server.Stop();
  227. if (_server.State == ServerState.NotInitialized)
  228. {
  229. if (!_server.Setup(server, port))
  230. {
  231. EV.PostAlarmLog("Server", $"Can not create server {server}:{port}");
  232. return false;
  233. }
  234. }
  235. if (!_server.Start())
  236. {
  237. EV.PostAlarmLog("Server", $"Can not listen on {server}:{port}");
  238. return false;
  239. }
  240. EV.PostInfoLog("Server", $"Listen on {server}:{port}");
  241. return true;
  242. }
  243. public void Stop()
  244. {
  245. if (_session != null)
  246. {
  247. lock (_lockerSession)
  248. {
  249. _session.Close();
  250. }
  251. }
  252. _server.Stop();
  253. EV.PostInfoLog("EFEM", $"Stopped Listen on {_port}");
  254. }
  255. }
  256. }