ClassDeviceNet.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. using HslCommunication.Core;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Net;
  7. using System.Net.Sockets;
  8. using HslCommunication;
  9. using System.IO;
  10. using HslCommunication.Core.Net;
  11. namespace HslCommunication.Enthernet
  12. {
  13. /// <summary>
  14. /// 通用设备的基础网络信息
  15. /// </summary>
  16. public class DeviceNet : NetworkServerBase
  17. {
  18. #region Constructor
  19. /// <summary>
  20. /// 实例化一个通用的设备类
  21. /// </summary>
  22. public DeviceNet()
  23. {
  24. list = new List<DeviceState>( );
  25. lock_list = new SimpleHybirdLock( );
  26. }
  27. #endregion
  28. #region Connection Management
  29. private List<DeviceState> list; // 所有客户端的连接对象
  30. private SimpleHybirdLock lock_list; // 列表锁
  31. private void AddClient(DeviceState device)
  32. {
  33. lock_list.Enter( );
  34. list.Add( device );
  35. lock_list.Leave( );
  36. ClientOnline?.Invoke( device );
  37. }
  38. private void RemoveClient(DeviceState device)
  39. {
  40. lock_list.Enter( );
  41. list.Remove( device );
  42. device.WorkSocket?.Close( );
  43. lock_list.Leave( );
  44. ClientOffline?.Invoke( device );
  45. }
  46. #endregion
  47. #region Event Handle
  48. /// <summary>
  49. /// 当客户端上线的时候,触发此事件
  50. /// </summary>
  51. public event Action<DeviceState> ClientOnline;
  52. /// <summary>
  53. /// 当客户端下线的时候,触发此事件
  54. /// </summary>
  55. public event Action<DeviceState> ClientOffline;
  56. /// <summary>
  57. /// 按照ASCII文本的方式进行触发接收的数据
  58. /// </summary>
  59. public event Action<DeviceState, string> AcceptString;
  60. /// <summary>
  61. /// 按照字节的方式进行触发接收的数据
  62. /// </summary>
  63. public event Action<DeviceState, byte[]> AcceptBytes;
  64. #endregion
  65. #region Private Member
  66. private byte endByte = 0x0D; // 结束的指令
  67. #endregion
  68. /// <summary>
  69. /// 登录后的处理方法
  70. /// </summary>
  71. /// <param name="obj"></param>
  72. protected override void ThreadPoolLogin(object obj)
  73. {
  74. if (obj is Socket)
  75. {
  76. Socket socket = obj as Socket;
  77. // 登录成功
  78. DeviceState stateone = new DeviceState( )
  79. {
  80. WorkSocket = socket,
  81. DeviceEndPoint = (IPEndPoint)socket.RemoteEndPoint,
  82. IpAddress = ((IPEndPoint)socket.RemoteEndPoint).Address.ToString( ),
  83. ConnectTime = DateTime.Now,
  84. };
  85. AddClient( stateone );
  86. try
  87. {
  88. stateone.WorkSocket.BeginReceive( stateone.Buffer, 0, stateone.Buffer.Length, SocketFlags.None,
  89. new AsyncCallback( ContentReceiveCallBack ), stateone );
  90. }
  91. catch (Exception ex)
  92. {
  93. //登录前已经出错
  94. RemoveClient( stateone );
  95. LogNet?.WriteException( ToString(), StringResources.NetClientLoginFailed, ex );
  96. }
  97. }
  98. }
  99. private void ContentReceiveCallBack(IAsyncResult ar)
  100. {
  101. if(ar.AsyncState is DeviceState)
  102. {
  103. DeviceState stateone = ar.AsyncState as DeviceState;
  104. try
  105. {
  106. int count = stateone.WorkSocket.EndReceive( ar );
  107. if (count > 0)
  108. {
  109. MemoryStream ms = new MemoryStream( );
  110. byte next = stateone.Buffer[0];
  111. while(next != endByte)
  112. {
  113. ms.WriteByte( next );
  114. byte[] buffer = new byte[1];
  115. stateone.WorkSocket.Receive( buffer, 0, 1, SocketFlags.None );
  116. next = buffer[0];
  117. }
  118. // 接收完成
  119. stateone.WorkSocket.BeginReceive( stateone.Buffer, 0, stateone.Buffer.Length, SocketFlags.None,
  120. new AsyncCallback( ContentReceiveCallBack ), stateone );
  121. byte[] receive =ms.ToArray( );
  122. ms.Dispose( );
  123. lock_list.Enter( );
  124. stateone.ReceiveTime = DateTime.Now;
  125. lock_list.Leave( );
  126. AcceptBytes?.Invoke( stateone, receive );
  127. AcceptString?.Invoke( stateone, Encoding.ASCII.GetString( receive ));
  128. }
  129. else
  130. {
  131. RemoveClient( stateone );
  132. LogNet?.WriteInfo( ToString( ), StringResources.NetClientOffline );
  133. }
  134. }
  135. catch(Exception ex)
  136. {
  137. //登录前已经出错
  138. RemoveClient( stateone );
  139. LogNet?.WriteException( ToString( ), StringResources.NetClientLoginFailed, ex );
  140. }
  141. }
  142. }
  143. }
  144. }