SocketResponder.cs 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using System;
  2. using System.Globalization;
  3. using System.IO;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Text;
  7. using System.Threading;
  8. public delegate string SocketRequestHandler ();
  9. public class SocketResponder : IDisposable
  10. {
  11. private TcpListener tcpListener;
  12. private readonly IPEndPoint _localEndPoint;
  13. private Thread listenThread;
  14. private SocketRequestHandler _requestHandler;
  15. public SocketResponder (IPEndPoint localEP, SocketRequestHandler requestHandler)
  16. {
  17. _localEndPoint = localEP;
  18. _requestHandler = requestHandler;
  19. }
  20. public IPEndPoint LocalEndPoint
  21. {
  22. get { return _localEndPoint; }
  23. }
  24. public void Dispose ()
  25. {
  26. Stop ();
  27. }
  28. public void Start ()
  29. {
  30. tcpListener = new TcpListener (LocalEndPoint);
  31. tcpListener.Start ();
  32. listenThread = new Thread (new ThreadStart (Listen));
  33. listenThread.Start ();
  34. }
  35. public void Stop ()
  36. {
  37. if (tcpListener != null)
  38. tcpListener.Stop ();
  39. try {
  40. if (listenThread != null && listenThread.ThreadState == ThreadState.Running) {
  41. listenThread.Abort ();
  42. }
  43. } catch {
  44. }
  45. }
  46. private void Listen ()
  47. {
  48. Socket socket = tcpListener.AcceptSocket ();
  49. string content = _requestHandler ();
  50. MemoryStream outputStream = new MemoryStream ();
  51. StreamWriter sw = new StreamWriter (outputStream, Encoding.UTF8);
  52. sw.WriteLine ("HTTP/1.1 200 OK");
  53. sw.WriteLine ("Content-Type: text/xml");
  54. sw.WriteLine ("Content-Length: " + content.Length.ToString (CultureInfo.InvariantCulture));
  55. sw.WriteLine ();
  56. sw.Write (content);
  57. sw.Flush ();
  58. outputStream.Position = 0;
  59. using (StreamReader sr = new StreamReader (outputStream)) {
  60. byte [] buffer = Encoding.UTF8.GetBytes (sr.ReadToEnd ());
  61. socket.Send (buffer);
  62. }
  63. }
  64. }