SimpleServer.cs
上传用户:wdhx888
上传日期:2017-06-08
资源大小:112k
文件大小:3k
源码类别:

WEB邮件程序

开发平台:

C#

  1. using System;
  2. using System.Net;
  3. using System.Net.Sockets;
  4. using System.Threading;
  5. using log4net;
  6. using EricDaugherty.CSES.Common;
  7. using EricDaugherty.CSES.SmtpServer;
  8. namespace EricDaugherty.CSES.Net
  9. {
  10. /// <summary>
  11. /// The delegate that is called when to process a new connection (Socket).
  12. /// </summary>
  13. public delegate void ConnectionProcessor( Socket socket );
  14. /// <summary>
  15. /// This class provides a bare bones implementation
  16. /// of a Server to allow the SMTPProcessor or POP3Processor
  17. /// to handle incoming socket connections.
  18. /// </summary>
  19. /// <remarks>
  20. /// This class provides a very simple server implementation that accepts
  21. /// incoming Socket connections and passes the call to SMTPProcessor or
  22. /// POP3Processor for processing.  This code is for example/test use only
  23. /// and should not be considered a production solution.  
  24. /// </remarks>
  25. public class SimpleServer
  26. {
  27. #region Variables
  28. private bool isRunning = false;
  29. private TcpListener listener;
  30. private int port;
  31. private ConnectionProcessor processor;
  32. private static ILog log = LogManager.GetLogger( typeof( SimpleServer ) );
  33. #endregion
  34. #region Constructors
  35. /// <summary>
  36. /// Creates a new SimpleServer that listens on a specific
  37. /// port for connections and passes them to the specified delagat
  38. /// </summary>
  39. /// <param name="port">The port to listen on.</param>
  40. /// <param name="processor">The ConnectionProcessor that will handle the incoming connections.</param>
  41. public SimpleServer( int port, ConnectionProcessor processor )
  42. {
  43. this.port = port;
  44. this.processor = processor;
  45. }
  46. #endregion
  47. #region Public Methods
  48. /// <summary>
  49. /// Listens for new connections and starts a new thread to handle each
  50. /// new connection.  Loops infinitely.
  51. /// </summary>
  52. public void Start()
  53. {
  54. IPEndPoint endPoint = new IPEndPoint( IPAddress.Any, port );
  55. listener = new TcpListener( endPoint );
  56. listener.Start();
  57. isRunning = true;
  58. while( isRunning )
  59. {
  60. try
  61. {
  62. Socket socket = listener.AcceptSocket();
  63. ConnectionWrapper handler = new ConnectionWrapper( processor, socket );
  64. new Thread( new ThreadStart( handler.Start ) ).Start();
  65. }
  66. catch {}
  67. }
  68. }
  69. /// <summary>
  70. /// Stop the server.  This notifies the listener to stop accepting new connections
  71. /// and that the loop should exit.
  72. /// </summary>
  73. public void Stop()
  74. {
  75. isRunning = false;
  76. if( listener != null )
  77. {
  78. listener.Stop();
  79. }
  80. }
  81. #endregion
  82. }
  83. /// <summary>
  84. /// Wraps the ConnectionProcessor and Socket to allow a new thread to be
  85. /// started that kicks off the ConnectionProcessor's process( Socket) method.
  86. /// </summary>
  87. public class ConnectionWrapper
  88. {
  89. private ConnectionProcessor processor;
  90. private Socket socket;
  91. /// <summary>
  92. /// Create a ConnectionWrapper to allow for a thread start.
  93. /// </summary>
  94. /// <param name="processor"></param>
  95. /// <param name="socket"></param>
  96. public ConnectionWrapper( ConnectionProcessor processor, Socket socket )
  97. {
  98. this.processor = processor;
  99. this.socket = socket;
  100. }
  101. /// <summary>
  102. /// Entry point for the Thread that will handle this Socket connection.
  103. /// </summary>
  104. public void Start()
  105. {
  106. processor( socket );
  107. }
  108. }
  109. }