Как сделать http сервер на С#? - C#
Формулировка задачи:
Привет!
Помогите, пожалуйста, сделать http сервер на С#?
нашла здесь http://rsdn.ru/forum/src/322274 код, но не компилируется.
уже установила вирт машину, запустила..
Помогите, пожалуйста, разобраться!!
Решение задачи: «Как сделать http сервер на С#?»
textual
Листинг программы
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Text.RegularExpressions; using System.Threading; namespace ConsoleApplication3 { class Program { static void Main(string[] args) { new Server(8999); } } public class Server { TcpListener Listener; public Server(int Port) { Listener = new TcpListener(IPAddress.Any, Port); Listener.Start(); while (true) { ThreadPool.QueueUserWorkItem(new WaitCallback(ClientThread), Listener.AcceptTcpClient()); } } static void ClientThread(Object StateInfo) { try { var client = new Client(); client.ClientRun((TcpClient)StateInfo); } catch { ((TcpClient)StateInfo).Close(); } } ~Server() { if (Listener != null) { Listener.Stop(); } } } public class Client { const int MAX_LENGTH_HEADER = 8192; private void SendError(TcpClient Client, int Code) { string CodeStr = Code.ToString() + " " + ((HttpStatusCode)Code).ToString(); string Html = "<html><body><h1>" + CodeStr + "</h1></body></html>"; string Str = "HTTP/1.1 " + CodeStr + "\nContent-type: text/html\nContent-Length:" + Html.Length.ToString() + "\n\n" + Html; byte[] Buffer = Encoding.UTF8.GetBytes(Str); Client.GetStream().Write(Buffer, 0, Buffer.Length); Client.Close(); } public void ClientRun(TcpClient Client) { Console.WriteLine("{1} : {0} Connect OK", DateTime.Now, Client.Client.RemoteEndPoint.ToString()); string Request = ""; byte[] Buffer = new byte[8192]; int Count; while ((Count = Client.GetStream().Read(Buffer, 0, Buffer.Length)) > 0) { Request += Encoding.UTF8.GetString(Buffer, 0, Count); if (!Request.Contains("POST")) { if (Request.IndexOf("\r\n\r\n") >= 0 || Request.Length > MAX_LENGTH_HEADER) { //Console.WriteLine(string.Join("", Request.Split(' ').Take(2))); break; } } else { if (Request.Split(new string[] { "\r\n\r\n" }, StringSplitOptions.None).Count() > 1 || Request.Length > MAX_LENGTH_HEADER) { Console.WriteLine(string.Join("", Request.Split(' ').Take(2))); break; } } } var RequestUri = Request.RegexParse(@"^\w+\s+([^\s]+)[^\s]*\s+HTTP/.*|").Split(' ').FirstOrDefault(x => x[0] == '/'); if (string.IsNullOrEmpty(RequestUri)) { SendError(Client, 400); return; } RequestUri = Uri.UnescapeDataString(RequestUri); if (RequestUri.IndexOf("..") >= 0) { SendError(Client, 400); return; } if (RequestUri.Length > 0) { var split = RequestUri.Split('?').ToList(); if (Request.Contains("POST")) { var postData = Request.Split(new string[] { "\r\n\r\n" }, StringSplitOptions.None); split.Insert(1, postData[1]); } var resultString = "Hello"; //Формируем ответ if (string.IsNullOrEmpty(resultString)) { SendError(Client, 404); return; } string Headers = "HTTP/1.1 200 OK\nContent-Type: text/html\nContent-Length: " + resultString.Length + "\n\n"; byte[] HeadersBuffer = Encoding.UTF8.GetBytes(Headers); Client.GetStream().Write(HeadersBuffer, 0, HeadersBuffer.Length); using (var reader = new MemoryStream(Encoding.UTF8.GetBytes(resultString.ToString()))) { while (reader.Position < reader.Length) { Count = reader.Read(Buffer, 0, Buffer.Length); Client.GetStream().Write(Buffer, 0, Count); } Client.Close(); } } Client.Close(); } } public static class ext { public static string RegexParse(this string data, string pattern) { var result = ""; var regex = new Regex(pattern); if (regex.IsMatch(data)) result = regex.Match(data).ToString(); return result; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д