Как сделать 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;
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.769 из 5
Похожие ответы