BgCommunicate.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using TeamAAS_VP.Enums;
  7. using TeamAAS_VP.Models;
  8. using TouchSocket.Core;
  9. using TouchSocket.Sockets;
  10. namespace TeamAAS_VP.Core
  11. {
  12. public class BgCommunicate
  13. {
  14. private IWaitingClient<ITcpSessionClient, IReceiverResult> WaitClientServer;
  15. public TcpService TcpService { get; private set; }
  16. BgTcpIP Config;
  17. public event Action<ITcpSessionClient, ConnectedEventArgs> ConnectedEvent;
  18. public event Action<ITcpSessionClient, ClosedEventArgs> DisconnectedEvent;
  19. public event Action<ITcpSessionClient, string> ReceivedEvent;
  20. public event Action<ITcpSessionClient, string> SendEvent;
  21. public int Port { get => Config.Port; }
  22. public Terminator Terminator { get => Config.Terminator; }
  23. public DataEncoding DataEncoding { get => Config.DataEncoding; }
  24. public int ClientCount { get => TcpService.Count; }
  25. public BgCommunicate(BgTcpIP _Config)
  26. {
  27. Config= _Config;
  28. TcpService = new TcpService();
  29. var config = new TouchSocketConfig();
  30. config.SetListenIPHosts(new IPHost[] { new IPHost(Config.Port) }); //同时监听两个地址
  31. ////设置结束符
  32. if (Config.Terminator == Terminator.None)
  33. {
  34. config.SetTcpDataHandlingAdapter(() => { return new NormalDataHandlingAdapter(); }); ////亦或者省略\r\n,但此时调用方不能高速调用,会粘包
  35. }
  36. else if (Config.Terminator == Terminator.CR)
  37. {
  38. config.SetTcpDataHandlingAdapter(() => { return new TerminatorPackageAdapter("\r"); }); //命令行中使用\r结尾
  39. }
  40. else if (Config.Terminator == Terminator.LF)
  41. {
  42. config.SetTcpDataHandlingAdapter(() => { return new TerminatorPackageAdapter("\n"); }); //命令行中使用\n结尾
  43. }
  44. else if (Config.Terminator == Terminator.CRLF)
  45. {
  46. config.SetTcpDataHandlingAdapter(() => { return new TerminatorPackageAdapter("\r\n"); }); //命令行中使用\r\n结尾
  47. }
  48. //载入配置
  49. TcpService.Setup(config);
  50. /////有客户端成功连接
  51. TcpService.Connected = ConnectedVoid;
  52. //有客户端断开连接
  53. TcpService.Closed = DisconnectedVoid;
  54. //从客户端收到信息
  55. TcpService.Received = ReceivedVoid;
  56. }
  57. /// <summary>
  58. /// 启动监听
  59. /// </summary>
  60. public void StartListening()
  61. {
  62. TcpService.Start();
  63. }
  64. /// <summary>
  65. /// 停止监听
  66. /// </summary>
  67. public void StopListening()
  68. {
  69. TcpService.Stop();
  70. }
  71. public void Dispose()
  72. {
  73. TcpService.Stop();
  74. TcpService.Dispose();
  75. }
  76. #region 事件接收
  77. /// <summary>
  78. /// 有客户端成功连接
  79. /// </summary>
  80. /// <param name="client"></param>
  81. /// <param name="e"></param>
  82. /// <returns></returns>
  83. private Task ConnectedVoid(ITcpSessionClient client, ConnectedEventArgs e)
  84. {
  85. //调用CreateWaitingClient获取到IWaitingClient的对象。
  86. WaitClientServer = client.CreateWaitingClient(new WaitingOptions()
  87. {
  88. FilterFunc = response => //设置用于筛选的fun委托,当返回为true时,才会响应返回
  89. {
  90. return true;
  91. //if (response.Data.Length == 1)
  92. //{
  93. // return true;
  94. //}
  95. //return false;
  96. }
  97. });
  98. ConnectedEvent?.Invoke(client, e);
  99. return EasyTask.CompletedTask;
  100. }
  101. /// <summary>
  102. /// 有客户端断开连接
  103. /// </summary>
  104. /// <param name="client"></param>
  105. /// <param name="e"></param>
  106. /// <returns></returns>
  107. private Task DisconnectedVoid(ITcpSessionClient client, ClosedEventArgs e)
  108. {
  109. DisconnectedEvent?.Invoke(client, e);
  110. if (WaitClientServer != null)
  111. {
  112. if (WaitClientServer.Client.Id == client.Id)
  113. {
  114. if (TcpService.Count > 0)
  115. {
  116. WaitClientServer = ((ITcpSessionClient)(TcpService.Clients.First())).CreateWaitingClient(new WaitingOptions()
  117. {
  118. FilterFunc = response => //设置用于筛选的fun委托,当返回为true时,才会响应返回
  119. {
  120. return true;
  121. //if (response.Data.Length == 1)
  122. //{
  123. // return true;
  124. //}
  125. //return false;
  126. }
  127. });
  128. }
  129. }
  130. }
  131. return EasyTask.CompletedTask;
  132. }
  133. /// <summary>
  134. /// 从客户端收到信息
  135. /// </summary>
  136. /// <param name="client"></param>
  137. /// <param name="e"></param>
  138. /// <returns></returns>
  139. private Task ReceivedVoid(ITcpSessionClient client, ReceivedDataEventArgs e)
  140. {
  141. Encoding encoding = GetEncoding();
  142. ReceivedEvent?.Invoke(client, e.ByteBlock.Span.ToString(encoding));
  143. //调用CreateWaitingClient获取到IWaitingClient的对象。
  144. WaitClientServer = client.CreateWaitingClient(new WaitingOptions()
  145. {
  146. FilterFunc = response => //设置用于筛选的fun委托,当返回为true时,才会响应返回
  147. {
  148. return true;
  149. //if (response.Data.Length == 1)
  150. //{
  151. // return true;
  152. //}
  153. //return false;
  154. }
  155. });
  156. return EasyTask.CompletedTask;
  157. }
  158. #endregion
  159. #region 发送数据
  160. /// <summary>
  161. /// 发送信息给特定ID的客户端
  162. /// </summary>
  163. /// <param name="ID"></param>
  164. /// <param name="msg"></param>
  165. public void Send(string ID, string mes)
  166. {
  167. Encoding encoding = GetEncoding();
  168. var client = TcpService.Clients.FirstOrDefault(cl => cl.Id == ID);
  169. if (client!=null)
  170. {
  171. client.Send(encoding.GetBytes(mes));
  172. SendEvent?.Invoke(client,mes);
  173. }
  174. }
  175. /// <summary>
  176. /// 发送信息给特定ID的客户端
  177. /// </summary>
  178. /// <param name="ID"></param>
  179. /// <param name="mes"></param>
  180. public async Task SendAsync(string ID, string mes)
  181. {
  182. Encoding encoding = GetEncoding();
  183. var client = TcpService.Clients.FirstOrDefault(cl => cl.Id == ID);
  184. if (client != null)
  185. {
  186. await client.SendAsync(encoding.GetBytes(mes));
  187. SendEvent?.Invoke(client, mes);
  188. }
  189. }
  190. /// <summary>
  191. /// 发送信息给在线的所有客户端
  192. /// </summary>
  193. /// <param name="ID"></param>
  194. /// <param name="msg"></param>
  195. public void Send(string mes)
  196. {
  197. Encoding encoding = GetEncoding();
  198. foreach (var client in TcpService.Clients)
  199. {
  200. client.Send(encoding.GetBytes(mes));
  201. SendEvent?.Invoke(client, mes);
  202. }
  203. }
  204. /// <summary>
  205. /// 发送信息给在线的所有客户端
  206. /// </summary>
  207. /// <param name="mes"></param>
  208. public async Task SendAsync(string mes)
  209. {
  210. Encoding encoding = GetEncoding();
  211. foreach (var client in TcpService.Clients)
  212. {
  213. await client.SendAsync(encoding.GetBytes(mes));
  214. SendEvent?.Invoke(client, mes);
  215. }
  216. }
  217. /// <summary>
  218. /// 发送信息给客户端
  219. /// </summary>
  220. /// <param name="client">客户端</param>
  221. /// <param name="mes"></param>
  222. public void Send(ITcpSessionClient client, string mes)
  223. {
  224. Encoding encoding = GetEncoding();
  225. client.Send(encoding.GetBytes(mes));
  226. SendEvent?.Invoke(client, mes);
  227. }
  228. /// <summary>
  229. /// 发送信息给客户端
  230. /// </summary>
  231. /// <param name="client"></param>
  232. /// <param name="mes"></param>
  233. public async Task SendAsync(ITcpSessionClient client, string mes)
  234. {
  235. Encoding encoding = GetEncoding();
  236. await client.SendAsync(encoding.GetBytes(mes));
  237. SendEvent?.Invoke(client, mes);
  238. }
  239. /// <summary>
  240. /// 发送并接收数据(最后一次活动的客户端)
  241. /// </summary>
  242. /// <param name="mes"></param>
  243. /// <param name="millisecondsTimeout"></param>
  244. /// <returns></returns>
  245. public string SendThenReturn(string mes, int millisecondsTimeout = 5000)
  246. {
  247. Encoding encoding = GetEncoding();
  248. SendEvent?.Invoke(WaitClientServer.Client, mes);
  249. var returnData= WaitClientServer.SendThenReturn(encoding.GetBytes(mes), millisecondsTimeout);
  250. ReceivedEvent?.Invoke(WaitClientServer.Client, encoding.GetString(returnData));
  251. return encoding.GetString(returnData);
  252. }
  253. /// <summary>
  254. /// 发送并接收数据(最后一次活动的客户端)
  255. /// </summary>
  256. /// <param name="mes"></param>
  257. /// <param name="millisecondsTimeout"></param>
  258. /// <returns></returns>
  259. public async Task<string> SendThenReturnAsync(string mes, int millisecondsTimeout = 5000)
  260. {
  261. Encoding encoding = GetEncoding();
  262. SendEvent?.Invoke(WaitClientServer.Client, mes);
  263. var returnData = await WaitClientServer.SendThenReturnAsync(encoding.GetBytes(mes), millisecondsTimeout);
  264. ReceivedEvent?.Invoke(WaitClientServer.Client, encoding.GetString(returnData));
  265. return encoding.GetString(returnData);
  266. }
  267. /// <summary>
  268. /// 发送并接收数据
  269. /// </summary>
  270. /// <param name="client"></param>
  271. /// <param name="mes"></param>
  272. /// <param name="millisecondsTimeout"></param>
  273. /// <returns></returns>
  274. public string SendThenReturn(ITcpSessionClient client,string mes, int millisecondsTimeout = 5000)
  275. {
  276. WaitClientServer = client.CreateWaitingClient(new WaitingOptions()
  277. {
  278. FilterFunc = response => //设置用于筛选的fun委托,当返回为true时,才会响应返回
  279. {
  280. return true;
  281. //if (response.Data.Length == 1)
  282. //{
  283. // return true;
  284. //}
  285. //return false;
  286. }
  287. });
  288. Encoding encoding = GetEncoding();
  289. SendEvent?.Invoke(WaitClientServer.Client, mes);
  290. var returnData = WaitClientServer.SendThenReturn(encoding.GetBytes(mes), millisecondsTimeout);
  291. ReceivedEvent?.Invoke(WaitClientServer.Client, encoding.GetString(returnData));
  292. return encoding.GetString(returnData);
  293. }
  294. /// <summary>
  295. /// 发送并接收数据
  296. /// </summary>
  297. /// <param name="client"></param>
  298. /// <param name="mes"></param>
  299. /// <param name="millisecondsTimeout"></param>
  300. /// <returns></returns>
  301. public async Task<string> SendThenReturnAsync(ITcpSessionClient client,string mes, int millisecondsTimeout = 5000)
  302. {
  303. WaitClientServer = client.CreateWaitingClient(new WaitingOptions()
  304. {
  305. FilterFunc = response => //设置用于筛选的fun委托,当返回为true时,才会响应返回
  306. {
  307. return true;
  308. //if (response.Data.Length == 1)
  309. //{
  310. // return true;
  311. //}
  312. //return false;
  313. }
  314. });
  315. Encoding encoding = GetEncoding();
  316. SendEvent?.Invoke(WaitClientServer.Client, mes);
  317. var returnData = await WaitClientServer.SendThenReturnAsync(encoding.GetBytes(mes), millisecondsTimeout);
  318. ReceivedEvent?.Invoke(WaitClientServer.Client, encoding.GetString(returnData));
  319. return encoding.GetString(returnData);
  320. }
  321. #endregion
  322. #region 编码
  323. /// <summary>
  324. /// 获取编码
  325. /// </summary>
  326. /// <param name="dataEncoding"></param>
  327. /// <returns></returns>
  328. public Encoding GetEncoding()
  329. {
  330. DataEncoding dataEncoding = this.DataEncoding;
  331. Encoding encoding;
  332. if (dataEncoding == DataEncoding.Default)
  333. {
  334. encoding = Encoding.Default;
  335. }
  336. else if (dataEncoding == DataEncoding.ASCII)
  337. {
  338. encoding = Encoding.ASCII;
  339. }
  340. else if (dataEncoding == DataEncoding.UTF7)
  341. {
  342. encoding = Encoding.UTF7;
  343. }
  344. else if (dataEncoding == DataEncoding.UTF8)
  345. {
  346. encoding = Encoding.UTF8;
  347. }
  348. else if (dataEncoding == DataEncoding.UTF32)
  349. {
  350. encoding = Encoding.UTF32;
  351. }
  352. else if (dataEncoding == DataEncoding.Unicode)
  353. {
  354. encoding = Encoding.Unicode;
  355. }
  356. else if (dataEncoding == DataEncoding.BigEndianUnicode)
  357. {
  358. encoding = Encoding.BigEndianUnicode;
  359. }
  360. else if (dataEncoding == DataEncoding.GB2312)
  361. {
  362. encoding = Encoding.GetEncoding("gb2312");
  363. }
  364. else
  365. {
  366. encoding = Encoding.Default;
  367. }
  368. return encoding;
  369. }
  370. #endregion
  371. }
  372. }