400-028-6601
建站资讯

网站建设资讯

为你提供网站建设行业资讯、网站优化知识、主机域名邮箱、网站开发常见问题等。

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

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

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


本文题目:C#异步套接字实现浅析
当前地址:http://www.hnjierui.cn/article/dhcesij.html

其他资讯