Easy Socket Class


SUBMITTED BY: Guest

DATE: June 16, 2014, 5:44 a.m.

FORMAT: C#

SIZE: 15.9 kB

HITS: 3657

  1. class EasySocket
  2. {
  3. public delegate void ConnectEvent(object sender);
  4. public delegate void ShutdownEvent(object sender);
  5. public delegate void ClientConnectedEvent(Socket socketConnected, object sender);
  6. public delegate void DataReceivedEvent(String data, Socket fromSocket, object sender);
  7. public delegate void DataSendEvent(object sender);
  8. public enum FamilyType
  9. {
  10. Tcp,
  11. Udp
  12. }
  13. public class Server : IDisposable
  14. {
  15. public Server()
  16. {
  17. EndToken = "\0";
  18. }
  19. public event ClientConnectedEvent OnClientConnected;
  20. public event DataReceivedEvent OnDataReceive;
  21. public event DataSendEvent OnDataSent;
  22. public event ShutdownEvent OnShutdown;
  23. public FamilyType SocketFamilyType { get; set; }
  24. public int Port { get; set; }
  25. public int MaxClient { get; set; }
  26. public bool Universal { get; set; }
  27. public String EndToken { get; set; }
  28. public bool Started { get; private set; }
  29. public List<Socket> SocketsConnected { get { return this.m_Sockets; } }
  30. public void Start()
  31. {
  32. if (String.IsNullOrEmpty(SocketFamilyType.ToString()) || Port == 0)
  33. return;
  34. else // I liked this style
  35. {
  36. m_EndPoint = new IPEndPoint(Universal ? IPAddress.Any : IPAddress.Loopback, Port);
  37. switch (SocketFamilyType)
  38. {
  39. case FamilyType.Tcp:
  40. m_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  41. break;
  42. case FamilyType.Udp:
  43. m_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
  44. break;
  45. }
  46. try
  47. {
  48. m_Socket.Bind(m_EndPoint);
  49. m_Socket.Listen(MaxClient);
  50. m_Socket.BeginAccept(CallBack_OnAccept, m_Socket);
  51. Started = true;
  52. }
  53. catch (SocketException ex)
  54. {
  55. throw new Exception(String.Format("Port {0} has already been occupied.", Port));
  56. }
  57. }
  58. }
  59. public void Disconnnect(Socket trySocket)
  60. {
  61. if (trySocket != null)
  62. {
  63. try
  64. {
  65. trySocket.BeginDisconnect(true, CallBack_OnDisconnect, trySocket);
  66. }
  67. catch (Exception ex)
  68. {
  69. Console.WriteLine(ex.Message);
  70. Console.WriteLine(ex.StackTrace);
  71. }
  72. }
  73. }
  74. public void Send(Socket socket, String data)
  75. {
  76. data += EndToken;
  77. byte[] byteData = Encoding.ASCII.GetBytes(data);
  78. socket.BeginSend(byteData, 0, byteData.Length, 0, CallBack_OnSend, socket);
  79. }
  80. public void Broadcast(String data)
  81. {
  82. foreach (var m_Socket_field in m_Sockets)
  83. Send(m_Socket_field, data);
  84. }
  85. public void Shutdown()
  86. {
  87. m_Socket.Close();
  88. if (this.OnShutdown != null) OnShutdown(this);
  89. this.Dispose();
  90. }
  91. private void CallBack_OnAccept(IAsyncResult ar)
  92. {
  93. Socket socketAccepted = null;
  94. try
  95. {
  96. socketAccepted = m_Socket.EndAccept(ar);
  97. m_Sockets.Add(socketAccepted);
  98. m_SocketsBuffer.Add(socketAccepted, new StringBuilder());
  99. if (OnClientConnected != null)
  100. OnClientConnected(socketAccepted, this);
  101. socketAccepted.BeginReceive(m_Data, 0, m_Data.Length, SocketFlags.None, CallBack_OnReceive, socketAccepted);
  102. m_Socket.BeginAccept(CallBack_OnAccept, m_Socket);
  103. }
  104. catch (SocketException ex)
  105. {
  106. Console.WriteLine(ex.Message);
  107. Console.WriteLine(ex.StackTrace);
  108. Disconnnect(socketAccepted);
  109. }
  110. catch (Exception ex)
  111. {
  112. Console.WriteLine(ex.Message);
  113. Console.WriteLine(ex.StackTrace);
  114. }
  115. }
  116. private void CallBack_OnReceive(IAsyncResult ar)
  117. {
  118. Socket socketAccepted = null;
  119. try
  120. {
  121. socketAccepted = ar.AsyncState as Socket;
  122. int read = socketAccepted.EndReceive(ar);
  123. var sb = new StringBuilder();
  124. if (read > 0)
  125. {
  126. String strRead = Encoding.ASCII.GetString(m_Data, 0, read);
  127. char lastChar = strRead[strRead.Length - 1];
  128. //Console.WriteLine("{0}", strRead);
  129. Console.WriteLine("{0}", m_SocketsBuffer[socketAccepted]);
  130. if (lastChar != '\r' )
  131. {
  132. m_SocketsBuffer[socketAccepted].Append(strRead);
  133. socketAccepted.BeginReceive(m_Data, 0, m_Data.Length, SocketFlags.None, CallBack_OnReceive, socketAccepted);
  134. return;
  135. }
  136. sb.Append(m_SocketsBuffer[socketAccepted]);
  137. //socketAccepted.BeginReceive(m_Data, 0, m_Data.Length, SocketFlags.None, CallBack_OnReceive, socketAccepted);
  138. }
  139. if (sb.Length > 0)
  140. {
  141. string content = sb.ToString();
  142. if (!String.IsNullOrEmpty(EndToken))
  143. {
  144. int index = content.IndexOf(EndToken, StringComparison.Ordinal);
  145. if (index != -1)
  146. content = content.Substring(0, index);
  147. }
  148. if (OnDataReceive != null)
  149. OnDataReceive(content, socketAccepted, this);
  150. // Flush it
  151. m_SocketsBuffer[socketAccepted] = new StringBuilder();
  152. }
  153. }
  154. catch (SocketException ex)
  155. {
  156. Console.WriteLine(ex.Message);
  157. Console.WriteLine(ex.StackTrace);
  158. Disconnnect(socketAccepted);
  159. }
  160. catch (Exception ex)
  161. {
  162. Console.WriteLine(ex.Message);
  163. Console.WriteLine(ex.StackTrace);
  164. }
  165. }
  166. private void CallBack_OnSend(IAsyncResult ar)
  167. {
  168. Socket socketAccepted = null;
  169. try
  170. {
  171. socketAccepted = ar.AsyncState as Socket;
  172. // Complete sending the data to the remote device.
  173. socketAccepted.EndSend(ar);
  174. if (this.OnDataSent != null)
  175. OnDataSent(this);
  176. }
  177. catch (SocketException ex)
  178. {
  179. Console.WriteLine(ex.Message);
  180. Console.WriteLine(ex.StackTrace);
  181. Disconnnect(socketAccepted);
  182. }
  183. catch (Exception ex)
  184. {
  185. Console.WriteLine(ex.Message);
  186. Console.WriteLine(ex.StackTrace);
  187. }
  188. }
  189. private void CallBack_OnDisconnect(IAsyncResult ar)
  190. {
  191. try
  192. {
  193. Socket socketTryDisconnect = ar.AsyncState as Socket;
  194. socketTryDisconnect.EndDisconnect(ar);
  195. m_SocketsBuffer.Remove(socketTryDisconnect);
  196. m_Sockets.Remove(socketTryDisconnect);
  197. }
  198. catch (SocketException ex)
  199. {
  200. Console.WriteLine(ex.Message);
  201. Console.WriteLine(ex.StackTrace);
  202. }
  203. catch (Exception ex)
  204. {
  205. Console.WriteLine(ex.Message);
  206. Console.WriteLine(ex.StackTrace);
  207. }
  208. }
  209. private readonly Dictionary<Socket, StringBuilder> m_SocketsBuffer = new Dictionary<Socket, StringBuilder>();
  210. private List<Socket> m_Sockets = new List<Socket>();
  211. private byte[] m_Data = new byte[65535];
  212. private IPEndPoint m_EndPoint;
  213. private Socket m_Socket;
  214. public void Dispose()
  215. {
  216. m_Data = null;
  217. m_Socket = null;
  218. m_Sockets = null;
  219. m_EndPoint = null;
  220. GC.Collect();
  221. GC.SuppressFinalize(this);
  222. }
  223. }
  224. public class Client : IDisposable
  225. {
  226. public event ConnectEvent OnConnected;
  227. public event DataReceivedEvent OnDataReceive;
  228. public event DataSendEvent OnDataSent;
  229. public event ShutdownEvent OnShutdown;
  230. public FamilyType SocketFamilyType { get; set; }
  231. public string Destination { get; set; }
  232. public int Port { get; set; }
  233. public String EndToken { get; set; }
  234. public bool Conntected { get { return m_Socket.Connected; } }
  235. public void Connect()
  236. {
  237. if (String.IsNullOrEmpty(SocketFamilyType.ToString()) || Port == 0)
  238. return;
  239. else // I liked this style
  240. {
  241. m_EndPoint = new IPEndPoint(Array.Find(Dns.GetHostAddresses(Destination), a => a.AddressFamily == AddressFamily.InterNetwork), Port);
  242. switch (SocketFamilyType)
  243. {
  244. case FamilyType.Tcp:
  245. m_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  246. break;
  247. case FamilyType.Udp:
  248. m_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
  249. break;
  250. }
  251. m_Socket.BeginConnect(m_EndPoint, CallBack_OnConnected, m_Socket);
  252. }
  253. }
  254. public void Send(String data)
  255. {
  256. data += EndToken;
  257. // Convert the string data to byte data using ASCII encoding.
  258. byte[] byteData = Encoding.ASCII.GetBytes(data);
  259. m_Socket.BeginSend(byteData, 0, byteData.Length, 0, CallBack_OnSend, m_Socket);
  260. }
  261. public void Shutdown()
  262. {
  263. m_Socket.Shutdown(SocketShutdown.Receive);
  264. if (this.OnShutdown != null) OnShutdown(this);
  265. this.Dispose();
  266. }
  267. private void CallBack_OnSend(IAsyncResult ar)
  268. {
  269. try
  270. {
  271. m_Socket.EndSend(ar);
  272. if (this.OnDataSent != null)
  273. OnDataSent(this);
  274. }
  275. catch (Exception ex)
  276. {
  277. Console.WriteLine(ex.Message);
  278. Console.WriteLine(ex.StackTrace);
  279. }
  280. }
  281. private void CallBack_OnConnected(IAsyncResult ar)
  282. {
  283. try
  284. {
  285. m_Socket.EndConnect(ar);
  286. if (OnConnected != null)
  287. OnConnected(this);
  288. m_Socket.BeginReceive(m_Data, 0, m_Data.Length, SocketFlags.None, CallBack_OnReceive, m_Socket);
  289. }
  290. catch (SocketException ex)
  291. {
  292. Console.WriteLine(ex.Message);
  293. Console.WriteLine(ex.StackTrace);
  294. }
  295. catch (Exception ex)
  296. {
  297. Console.WriteLine(ex.Message);
  298. Console.WriteLine(ex.StackTrace);
  299. }
  300. }
  301. private void CallBack_OnReceive(IAsyncResult ar)
  302. {
  303. try
  304. {
  305. Socket socketAccepted = ar.AsyncState as Socket;
  306. int read = socketAccepted.EndReceive(ar);
  307. var sb = new StringBuilder();
  308. if (read > 0)
  309. {
  310. sb.Append(Encoding.ASCII.GetString(m_Data, 0, read));
  311. socketAccepted.BeginReceive(m_Data, 0, m_Data.Length, SocketFlags.None, CallBack_OnReceive, socketAccepted);
  312. }
  313. if (sb.Length > 0)
  314. {
  315. string content = sb.ToString();
  316. if (!String.IsNullOrEmpty(EndToken))
  317. {
  318. int index = content.IndexOf(EndToken);
  319. if (index != -1)
  320. content = content.Substring(0, index);
  321. }
  322. if (OnDataReceive != null)
  323. OnDataReceive(content, socketAccepted, this);
  324. }
  325. }
  326. catch (SocketException ex)
  327. {
  328. Console.WriteLine(ex.Message);
  329. Console.WriteLine(ex.StackTrace);
  330. }
  331. catch (Exception ex)
  332. {
  333. Console.WriteLine(ex.Message);
  334. Console.WriteLine(ex.StackTrace);
  335. }
  336. }
  337. private IPEndPoint m_EndPoint;
  338. private byte[] m_Data = new byte[65535];
  339. private Socket m_Socket;
  340. public void Dispose()
  341. {
  342. this.m_Data = null;
  343. this.m_Socket = null;
  344. this.m_EndPoint = null;
  345. GC.Collect();
  346. GC.SuppressFinalize(this);
  347. }
  348. }
  349. }

comments powered by Disqus