C#异步套接字实现浅析

C#异步套接字实现是如何的呢?让我们开始从实例开始:

下面的C#异步套接字实现实例程序创建一个连接到服务器的客户端。该客户端是用C#异步套接字生成的,因此在等待服务器返回响应时不挂起客户端应用程序的执行。该应用程序将字符串发送到服务器,然后在控制台显示该服务器返回的字符串。

 
 
 
  1. using System; 
  2. using System.Net; 
  3. using System.Net.Sockets; 
  4. using System.Threading; 
  5. using System.Text; 
  6. // State object for receiving data from remote device. 
  7. public class StateObject { 
  8. // Client socket. 
  9. public Socket workSocket = null; 
  10. // Size of receive buffer. 
  11. public const int BufferSize = 256; 
  12. // Receive buffer. 
  13. public byte[] buffer = new byte[BufferSize]; 
  14. // Received data string. 
  15. public StringBuilder sb = new StringBuilder(); 
  16. public class AsynchronousClient { 
  17. // The port number for the remote device. 
  18. private const int port = 11000; 
  19. // ManualResetEvent instances signal completion. 
  20. private static ManualResetEvent connectDone = 
  21. new ManualResetEvent(false); 
  22. private static ManualResetEvent sendDone = 
  23. new ManualResetEvent(false); 
  24. private static ManualResetEvent receiveDone = 
  25. new ManualResetEvent(false); 
  26. // The response from the remote device. 
  27. private static String response = String.Empty; 
  28. private static void StartClient() { 
  29. // Connect to a remote device. 
  30. try { 
  31. // Establish the remote endpoint for the socket. 
  32. // The name of the 
  33. // remote device is "host.contoso.com". 
  34. IPHostEntry ipHostInfo = Dns.Resolve("host.contoso.com"); 
  35. IPAddress ipAddress = ipHostInfo.AddressList[0]; 
  36. IPEndPoint remoteEP = new IPEndPoint(ipAddress, port); 
  37. // Create a TCP/IP socket. 
  38. Socket client = new Socket(AddressFamily.InterNetwork, 
  39. SocketType.Stream, ProtocolType.Tcp); 
  40. // Connect to the remote endpoint. 
  41. client.BeginConnect( remoteEP, 
  42. new AsyncCallback(ConnectCallback), client); 
  43. connectDone.WaitOne(); 
  44. // Send test data to the remote device. 
  45. Send(client,"This is a test"); 
  46. sendDone.WaitOne(); 
  47. // Receive the response from the remote device. 
  48. Receive(client); 
  49. receiveDone.WaitOne(); 
  50. // Write the response to the console. 
  51. Console.WriteLine("Response received : {0}", response); 
  52. // Release the socket. 
  53. client.Shutdown(SocketShutdown.Both); 
  54. client.Close(); 
  55. } catch (Exception e) { 
  56. Console.WriteLine(e.ToString()); 
  57. private static void ConnectCallback(IAsyncResult ar) { 
  58. try { 
  59. // Retrieve the socket from the state object. 
  60. Socket client = (Socket) ar.AsyncState; 
  61. // Complete the connection. 
  62. client.EndConnect(ar); 
  63. Console.WriteLine("Socket connected to {0}", 
  64. client.RemoteEndPoint.ToString()); 
  65. // Signal that the connection has been made. 
  66. connectDone.Set(); 
  67. } catch (Exception e) { 
  68. Console.WriteLine(e.ToString()); 
  69. private static void Receive(Socket client) { 
  70. try { 
  71. // Create the state object. 
  72. StateObject state = new StateObject(); 
  73. state.workSocket = client; 
  74. // Begin receiving the data from the remote device. 
  75. client.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0, 
  76. new AsyncCallback(ReceiveCallback), state); 
  77. } catch (Exception e) { 
  78. Console.WriteLine(e.ToString()); 
  79. private static void ReceiveCallback( IAsyncResult ar ) { 
  80. try { 
  81. // Retrieve the state object and the client socket 
  82. // from the asynchronous state object. 
  83. StateObject state = (StateObject) ar.AsyncState; 
  84. Socket client = state.workSocket; 
  85. // Read data from the remote device. 
  86. int bytesRead = client.EndReceive(ar); 
  87. if (bytesRead > 0) { 
  88. // There might be more data, so store the data received so far. 
  89. state.sb.Append(Encoding.ASCII.GetString(
  90. state.buffer,0,bytesRead)); 
  91. // Get the rest of the data. 
  92. client.BeginReceive(state.buffer,0,StateObject.BufferSize,0, 
  93. new AsyncCallback(ReceiveCallback), state); 
  94. } else { 
  95. // All the data has arrived; put it in response. 
  96. if (state.sb.Length > 1) { 
  97. response = state.sb.ToString(); 
  98. // Signal that all bytes have been received. 
  99. receiveDone.Set(); 
  100. } catch (Exception e) { 
  101. Console.WriteLine(e.ToString()); 
  102. private static void Send(Socket client, String data) { 
  103. // Convert the string data to byte data using ASCII encoding. 
  104. byte[] byteData = Encoding.ASCII.GetBytes(data); 
  105. // Begin sending the data to the remote device. 
  106. client.BeginSend(byteData, 0, byteData.Length, 0, 
  107. new AsyncCallback(SendCallback), client); 
  108. private static void SendCallback(IAsyncResult ar) { 
  109. try { 
  110. // Retrieve the socket from the state object. 
  111. Socket client = (Socket) ar.AsyncState; 
  112. // Complete sending the data to the remote device. 
  113. int bytesSent = client.EndSend(ar); 
  114. Console.WriteLine("Sent {0} bytes to server.", bytesSent); 
  115. // Signal that all bytes have been sent. 
  116. sendDone.Set(); 
  117. } catch (Exception e) { 
  118. Console.WriteLine(e.ToString()); 
  119. public static int Main(String[] args) { 
  120. StartClient(); 
  121. return 0; 

C#异步套接字在服务器的示例 下面的示例程序创建一个接收来自客户端的连接请求的服务器。该服务器是用C#异步套接字生成的

因此在等待来自客户端的连接时不挂起服务器应用程序的执行。该应用程序接收来自客户端的字符串

在控制台显示该字符串,然后将该字符串回显到客户端。来自客户端的字符串必须包含字符串“

以发出表示消息结尾的信号。

 
 
 
  1. using System; 
  2. using System.Net; 
  3. using System.Net.Sockets; 
  4. using System.Text; 
  5. using System.Threading; 
  6. // State object for reading client data asynchronously 
  7. public class StateObject { 
  8. // Client socket. 
  9. public Socket workSocket = null; 
  10. // Size of receive buffer. 
  11. public const int BufferSize = 1024; 
  12. // Receive buffer. 
  13. public byte[] buffer = new byte[BufferSize]; 
  14. // Received data string. 
  15. public StringBuilder sb = new StringBuilder(); 
  16. public class AsynchronousSocketListener { 
  17. // Thread signal. 
  18. public static ManualResetEvent allDone = 
  19. new ManualResetEvent(false); 
  20. public AsynchronousSocketListener() { 
  21. public static void StartListening() { 
  22. // Data buffer for incoming data. 
  23. byte[] bytes = new Byte[1024]; 
  24. // Establish the local endpoint for the socket. 
  25. // The DNS name of the computer 
  26. // running the listener is "host.contoso.com". 
  27. IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName()); 
  28. IPAddress ipAddress = ipHostInfo.AddressList[0]; 
  29. IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000); 
  30. // Create a TCP/IP socket. 
  31. Socket listener = new Socket(AddressFamily.InterNetwork, 
  32. SocketType.Stream, ProtocolType.Tcp ); 
  33. // Bind the socket to the local 
  34. //endpoint and listen for incoming connections. 
  35. try { 
  36. listener.Bind(localEndPoint); 
  37. listener.Listen(100); 
  38. while (true) { 
  39. // Set the event to nonsignaled state. 
  40. allDone.Reset(); 
  41. // Start an asynchronous socket to listen for connections. 
  42. Console.WriteLine("Waiting for a connection..."); 
  43. listener.BeginAccept( 
  44. new AsyncCallback(AcceptCallback), 
  45. listener ); 
  46. // Wait until a connection is made before continuing. 
  47. allDone.WaitOne(); 
  48. } catch (Exception e) { 
  49. Console.WriteLine(e.ToString()); 
  50. Console.WriteLine("\nPress ENTER to continue..."); 
  51. Console.Read(); 
  52. public static void AcceptCallback(IAsyncResult ar) { 
  53. // Signal the main thread to continue. 
  54. allDone.Set(); 
  55. // Get the socket that handles the client request. 
  56. Socket listener = (Socket) ar.AsyncState; 
  57. Socket handler = listener.EndAccept(ar); 
  58. // Create the state object. 
  59. StateObject state = new StateObject(); 
  60. state.workSocket = handler; 
  61. handler.BeginReceive( state.buffer, 
  62. 0, StateObject.BufferSize, 0, 
  63. new AsyncCallback(ReadCallback), state); 
  64. public static void ReadCallback(IAsyncResult ar) { 
  65. String content = String.Empty; 
  66. // Retrieve the state object and the handler socket 
  67. // from the asynchronous state object. 
  68. StateObject state = (StateObject) ar.AsyncState; 
  69. Socket handler = state.workSocket; 
  70. // Read data from the client socket. 
  71. int bytesRead = handler.EndReceive(ar); 
  72. if (bytesRead > 0) { 
  73. // There might be more data, so store the data received so far. 
  74. state.sb.Append(Encoding.ASCII.GetString( 
  75. state.buffer,0,bytesRead)); 
  76. // Check for end-of-file tag. If it is not there, read 
  77. // more data. 
  78. content = state.sb.ToString(); 
  79. if (content.IndexOf("") > -1) { 
  80. // All the data has been read from the 
  81. // client. Display it on the console. 
  82. Console.WriteLine("Read {0} bytes from socket. \n Data : {1}", 
  83. content.Length, content ); 
  84. // Echo the data back to the client. 
  85. Send(handler, content); 
  86. } else { 
  87. // Not all data received. Get more. 
  88. handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, 
  89. new AsyncCallback(ReadCallback), state); 
  90. private static void Send(Socket handler, String data) { 
  91. // Convert the string data to byte data using ASCII encoding. 
  92. byte[] byteData = Encoding.ASCII.GetBytes(data); 
  93. // Begin sending the data to the remote device. 
  94. handler.BeginSend(byteData, 0, byteData.Length, 0, 
  95. new AsyncCallback(SendCallback), handler); 
  96. private static void SendCallback(IAsyncResult ar) { 
  97. try { 
  98. // Retrieve the socket from the state object. 
  99. Socket handler = (Socket) ar.AsyncState; 
  100. // Complete sending the data to the remote device. 
  101. int bytesSent = handler.EndSend(ar); 
  102. Console.WriteLine("Sent {0} bytes to client.", bytesSent); 
  103. handler.Shutdown(SocketShutdown.Both); 
  104. handler.Close(); 
  105. } catch (Exception e) { 
  106. Console.WriteLine(e.ToString()); 
  107. public static int Main(String[] args) { 
  108. StartListening(); 
  109. return 0; 
  110. }

C#异步套接字的相关内容就向你介绍到这里,希望对你了解和学习C#异步套接字有所帮助。

本文题目:C#异步套接字实现浅析
标题URL:http://www.shufengxianlan.com/qtweb/news21/439771.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联