| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- using System;
- using System.Globalization;
- using System.IO;
- using System.Net;
- using System.Net.Sockets;
- using System.Text;
- using System.Threading;
- public delegate string SocketRequestHandler ();
- public class SocketResponder : IDisposable
- {
- private TcpListener tcpListener;
- private readonly IPEndPoint _localEndPoint;
- private Thread listenThread;
- private SocketRequestHandler _requestHandler;
- public SocketResponder (IPEndPoint localEP, SocketRequestHandler requestHandler)
- {
- _localEndPoint = localEP;
- _requestHandler = requestHandler;
- }
- public IPEndPoint LocalEndPoint
- {
- get { return _localEndPoint; }
- }
- public void Dispose ()
- {
- Stop ();
- }
- public void Start ()
- {
- tcpListener = new TcpListener (LocalEndPoint);
- tcpListener.Start ();
- listenThread = new Thread (new ThreadStart (Listen));
- listenThread.Start ();
- }
- public void Stop ()
- {
- if (tcpListener != null)
- tcpListener.Stop ();
- try {
- if (listenThread != null && listenThread.ThreadState == ThreadState.Running) {
- listenThread.Abort ();
- }
- } catch {
- }
- }
- private void Listen ()
- {
- Socket socket = tcpListener.AcceptSocket ();
- string content = _requestHandler ();
- MemoryStream outputStream = new MemoryStream ();
- StreamWriter sw = new StreamWriter (outputStream, Encoding.UTF8);
- sw.WriteLine ("HTTP/1.1 200 OK");
- sw.WriteLine ("Content-Type: text/xml");
- sw.WriteLine ("Content-Length: " + content.Length.ToString (CultureInfo.InvariantCulture));
- sw.WriteLine ();
- sw.Write (content);
- sw.Flush ();
- outputStream.Position = 0;
- using (StreamReader sr = new StreamReader (outputStream)) {
- byte [] buffer = Encoding.UTF8.GetBytes (sr.ReadToEnd ());
- socket.Send (buffer);
- }
- }
- }
|