C# .Net เชซเซเชฐเซ‡เชฎเชตเชฐเซเช• เชชเชฐ เช†เชงเชพเชฐเชฟเชค เชเชกเชตเชพเชจเซเชธเซเชก เชธเชพเชฏเช•เชฒเชฟเช‚เช— เช…เชฅเชตเชพ เช•เซเชฒเชพเชฏเช‚เชŸ-เชธเชฐเซเชตเชฐ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ

เชชเชฐเชฟเชšเชฏ

เช† เชฌเชงเซเช‚ เชคเซเชฏเชพเชฐเซ‡ เชถเชฐเซ‚ เชฅเชฏเซเช‚ เชœเซเชฏเชพเชฐเซ‡ เชเช• เชธเชพเชฅเซ€เชฆเชพเชฐเซ‡ เชฎเชจเซ‡ เชเช• เชจเชพเชจเซ€ เชตเซ‡เชฌ เชธเซ‡เชตเชพ เชฌเชจเชพเชตเชตเชพเชจเซเช‚ เชธเซ‚เชšเชจ เช•เชฐเซเชฏเซเช‚. เชคเซ‡ เชŸเชฟเชจเซเชกเชฐ เชœเซ‡เชตเซเช‚ เช•เช‚เชˆเช• เชฌเชจเชตเชพเชจเซเช‚ เชนเชคเซเช‚, เชชเชฐเช‚เชคเซ IT เชญเซ€เชก เชฎเชพเชŸเซ‡. เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพ เช…เชคเซเชฏเช‚เชค เชธเชฐเชณ เช›เซ‡, เชคเชฎเซ‡ เชจเซ‹เช‚เชงเชฃเซ€ เช•เชฐเซ‹, เชชเซเชฐเซ‹เชซเชพเช‡เชฒ เชญเชฐเซ‹ เช…เชจเซ‡ เชฎเซเช–เซเชฏ เชฎเซเชฆเซเชฆเชพ เชชเชฐ เช†เช—เชณ เชตเชงเซ‹, เชเชŸเชฒเซ‡ เช•เซ‡ เชตเชพเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชเช• เชตเซเชฏเช•เซเชคเชฟ เชถเซ‹เชงเซ‹ เช…เชจเซ‡ เชคเชฎเชพเชฐเชพ เชœเซ‹เชกเชพเชฃเซ‹เชจเซ‡ เชตเชฟเชธเซเชคเซƒเชค เช•เชฐเซ‹ เช…เชจเซ‡ เชจเชตเชพ เชชเชฐเชฟเชšเชฟเชคเซ‹ เชฌเชจเชพเชตเซ‹.

เช…เชนเซ€เช‚ เชฎเชพเชฐเซ‡ เชเช• เชชเซ€เช›เซ‡เชนเช  เช•เชฐเชตเซ€ เชœเซ‹เชˆเช เช…เชจเซ‡ เชฎเชพเชฐเชพ เชตเชฟเชถเซ‡ เชฅเซ‹เชกเซเช‚ เช•เชนเซ‡เชตเซเช‚ เชœเซ‹เชˆเช, เชœเซ‡เชฅเซ€ เชญเชตเชฟเชทเซเชฏเชฎเชพเช‚ เชคเซ‡ เชตเชงเซ เชธเซเชชเชทเซเชŸ เชฅเชพเชฏ เช•เซ‡ เชฎเซ‡เช‚ เชตเชฟเช•เชพเชธเชฎเชพเช‚ เช†เชตเชพ เชชเช—เชฒเชพเช‚ เชถเชพ เชฎเชพเชŸเซ‡ เชฒเซ€เชงเชพเช‚.

เช† เช•เซเชทเชฃเซ‡ เชนเซเช‚ เชเช• เช—เซ‡เชฎ เชธเซเชŸเซเชกเชฟเชฏเซ‹เชฎเชพเช‚ เชŸเซ‡เช•เชจเชฟเช•เชฒ เช†เชฐเซเชŸเชฟเชธเซเชŸเชจเซ‹ เชนเซ‹เชฆเซเชฆเซ‹ เชงเชฐเชพเชตเซ‡ เช›เซ‡, C# เชฎเชพเช‚ เชฎเชพเชฐเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เช…เชจเซเชญเชต เชซเช•เซเชค เชฏเซเชจเชฟเชŸเซ€ เชฎเชพเชŸเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซเชธ เช…เชจเซ‡ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“ เชฒเช–เชตเชพ เชชเชฐ เช…เชจเซ‡ เช† เช‰เชชเชฐเชพเช‚เชค, Android เช‰เชชเช•เชฐเชฃเซ‹ เชธเชพเชฅเซ‡ เชจเชฟเชฎเซเชจ-เชธเซเชคเชฐเชจเชพ เช•เชพเชฐเซเชฏ เชฎเชพเชŸเซ‡ เชชเซเชฒเช—เช‡เชจเซเชธ เชฌเชจเชพเชตเชตเชพ เชชเชฐ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹. เชนเซเช‚ เชนเชœเซ€ เช† เชจเชพเชจเช•เชกเซ€ เชฆเซเชจเชฟเชฏเชพเชฅเซ€ เช†เช—เชณ เชตเชงเซเชฏเซ‹ เชจ เชนเชคเซ‹, เช…เชจเซ‡ เชชเช›เซ€ เช†เชตเซ€ เชคเช• เชŠเชญเซ€ เชฅเชˆ.

เชญเชพเช— 1. เชซเซเชฐเซ‡เชฎ เชชเซเชฐเซ‹เชŸเซ‹เชŸเชพเช‡เชชเชฟเช‚เช—

เช† เชธเซ‡เชตเชพ เช•เซ‡เชตเซ€ เชนเชถเซ‡ เชคเซ‡ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชฎเซ‡เช‚ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชฎเชพเชŸเซ‡เชจเชพ เชตเชฟเช•เชฒเซเชชเซ‹ เชถเซ‹เชงเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซเชฏเซเช‚. เชธเซŒเชฅเซ€ เชธเชฐเชณ เชฌเชพเชฌเชค เช เช›เซ‡ เช•เซ‡ เช•เซ‹เชˆ เชชเซเชฐเช•เชพเชฐเชจเซ‹ เชคเซˆเชฏเชพเชฐ เช‰เช•เซ‡เชฒ เชถเซ‹เชงเชตเซ‹, เชœเซ‡เชจเชพ เชชเชฐ, เชตเชฟเชถเซเชต เชชเชฐเชจเชพ เช˜เซเชตเชกเชจเซ€ เชœเซ‡เชฎ, เช†เชชเชฃเชพ เชฎเชฟเช•เซ‡เชจเชฟเช•เซเชธเชจเซ‡ เช–เซ‡เช‚เชšเซ€ เชถเช•เชพเชฏ เช…เชจเซ‡ เช†เช–เซ€ เชตเชธเซเชคเซเชจเซ‡ เชœเชพเชนเซ‡เชฐ เชจเชฟเช‚เชฆเชพเชจเซ‹ เชธเชพเชฎเชจเซ‹ เช•เชฐเซ€ เชถเช•เชพเชฏ.
เชชเชฐเช‚เชคเซ เช† เชฐเชธเชชเซเชฐเชฆ เชจเชฅเซ€, เชฎเชจเซ‡ เชคเซ‡เชฎเชพเช‚ เช•เซ‹เชˆ เชชเชกเช•เชพเชฐ เช…เชฅเชตเชพ เช…เชฐเซเชฅ เชฆเซ‡เช–เชพเชคเซ‹ เชจเชฅเซ€, เช…เชจเซ‡ เชคเซ‡เชฅเซ€ เชฎเซ‡เช‚ เชตเซ‡เชฌ เชคเช•เชจเซ€เช•เซ‹ เช…เชจเซ‡ เชคเซ‡เชฎเชจเซ€ เชธเชพเชฅเซ‡ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพเชจเซ€ เชชเชฆเซเชงเชคเชฟเช“เชจเซ‹ เช…เชญเซเชฏเชพเชธ เช•เชฐเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซเชฏเซเช‚.

เชฎเซ‡เช‚ C# .Net เชชเชฐ เชฒเซ‡เช–เซ‹ เช…เชจเซ‡ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ‹ เชœเซ‹เชˆเชจเซ‡ เช…เชญเซเชฏเชพเชธ เชถเชฐเซ‚ เช•เชฐเซเชฏเซ‹. เช…เชนเซ€เช‚ เชฎเชจเซ‡ เช•เชพเชฐเซเชฏ เชชเซ‚เชฐเซเชฃ เช•เชฐเชตเชพเชจเซ€ เชตเชฟเชตเชฟเชง เชฐเซ€เชคเซ‹ เชฎเชณเซ€. ASP.Net เช…เชฅเชตเชพ Azure เชธเซ‡เชตเชพเช“ เชœเซ‡เชตเชพ เชธเช‚เชชเซ‚เชฐเซเชฃ เช‰เช•เซ‡เชฒเซ‹เชฅเซ€ เชฎเชพเช‚เชกเซ€เชจเซ‡ TcpHttp เช•เชจเซ‡เช•เซเชถเชจเซเชธ เชธเชพเชฅเซ‡ เชธเซ€เชงเซ€ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชจเซ‡เชŸเชตเชฐเซเช• เชธเชพเชฅเซ‡ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช˜เชฃเซ€ เชชเชฆเซเชงเชคเชฟเช“ เช›เซ‡.

ASP เชธเชพเชฅเซ‡ เชฎเชพเชฐเซ‹ เชชเซเชฐเชฅเชฎ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชฎเซ‡เช‚ เชคเชฐเชค เชœ เชคเซ‡เชจเซ‡ เชจเช•เชพเชฐเซ€ เช•เชพเชขเซเชฏเซเช‚; เชฎเชพเชฐเชพ เชฎเชคเซ‡, เช…เชฎเชพเชฐเซ€ เชธเซ‡เชตเชพ เชฎเชพเชŸเซ‡ เช† เชจเชฟเชฐเซเชฃเชฏ เช–เซ‚เชฌ เชฎเซเชถเซเช•เซ‡เชฒ เชนเชคเซ‹. เช…เชฎเซ‡ เช† เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎเชจเซ€ เช•เซเชทเชฎเชคเชพเชจเชพ เชคเซเชฐเซ€เชœเชพ เชญเชพเช—เชจเซ‹ เชชเชฃ เช‰เชชเชฏเซ‹เช— เชจเชนเซ€เช‚ เช•เชฐเซ€เช, เชคเซ‡เชฅเซ€ เชฎเซ‡เช‚ เชฎเชพเชฐเซ€ เชถเซ‹เชง เชšเชพเชฒเซ เชฐเชพเช–เซ€. เชชเชธเช‚เชฆเช—เซ€ TCP เช…เชจเซ‡ Http เช•เซเชฒเชพเชฏเช‚เชŸ-เชธเชฐเซเชตเชฐ เชตเชšเซเชšเซ‡ เชนเชคเซ€. เช…เชนเซ€เช‚, เชนเชพเชฌเซเชฐเซ‡ เชชเชฐ, เชฎเชจเซ‡ เชคเซ‡เชจเชพ เชตเชฟเชถเซ‡ เชเช• เชฒเซ‡เช– เชฎเชณเซเชฏเซ‹ เชฎเชฒเซเชŸเชฟเชฅเซเชฐเซ‡เชกเซ‡เชก เชธเชฐเซเชตเชฐ, เชคเซ‡เชจเซ‡ เชเช•เชคเซเชฐเชฟเชค เช…เชจเซ‡ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชฎเซ‡เช‚ เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ TCP เช•เชจเซ‡เช•เซเชถเชจเซเชธ เชธเชพเชฅเซ‡เชจเซ€ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เชชเชฐ เชงเซเชฏเชพเชจ เช•เซ‡เชจเซเชฆเซเชฐเชฟเชค เช•เชฐเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚, เช•เซ‡เชŸเชฒเชพเช• เช•เชพเชฐเชฃเซ‹เชธเชฐ เชฎเซ‡เช‚ เชตเชฟเชšเชพเชฐเซเชฏเซเช‚ เช•เซ‡ http เชฎเชจเซ‡ เช•เซเชฐเซ‹เชธ-เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎ เชธเซ‹เชฒเซเชฏเซเชถเชจ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเชถเซ‡ เชจเชนเซ€เช‚.

เชธเชฐเซเชตเชฐเชจเชพ เชชเซเชฐเชฅเชฎ เชธเช‚เชธเซเช•เชฐเชฃเชฎเชพเช‚ เช•เชจเซ‡เช•เซเชถเชจ เชชเซเชฐเซ‹เชธเซ‡เชธเชฟเช‚เช—, เชธเซเชฅเชฟเชฐ เชตเซ‡เชฌ เชชเซ‡เชœเชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€ เช…เชจเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชกเซ‡เชŸเชพเชฌเซ‡เชเชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡. เช…เชจเซ‡ เชถเชฐเซ‚ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชฎเซ‡เช‚ เชธเชพเช‡เชŸ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพ เชฌเชจเชพเชตเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚, เชœเซ‡เชฅเซ€ เชนเซเช‚ เชชเช›เซ€เชฅเซ€ Android เช…เชจเซ‡ iOS เชชเชฐ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช‰เชฎเซ‡เชฐเซ€ เชถเช•เซเช‚.

เช…เชนเซ€เช‚ เช•เซ‡เชŸเชฒเชพเช• เช•เซ‹เชก เช›เซ‡
เช…เช‚เชคเชนเซ€เชจ เชฒเซ‚เชชเชฎเชพเช‚ เช—เซเชฐเชพเชนเช•เซ‹เชจเซ‡ เชชเซเชฐเชพเชชเซเชค เช•เชฐเชจเชพเชฐ เชฎเซเช–เซเชฏ เชฅเซเชฐเซ‡เชก:

using System;
using System.Net.Sockets;
using System.Net;
using System.Threading;

namespace ClearServer
{

    class Server
    {
        TcpListener Listener;
        public Server(int Port)
        {
            Listener = new TcpListener(IPAddress.Any, Port);
            Listener.Start();

            while (true)
            {
                TcpClient Client = Listener.AcceptTcpClient();
                Thread Thread = new Thread(new ParameterizedThreadStart(ClientThread));
                Thread.Start(Client);
            }
        }

        static void ClientThread(Object StateInfo)
        {
            new Client((TcpClient)StateInfo);
        }

        ~Server()
        {
            if (Listener != null)
            {
                Listener.Stop();
            }
        }

        static void Main(string[] args)
        {
            DatabaseWorker sqlBase = DatabaseWorker.GetInstance;

            new Server(80);
        }
    }
}

เช•เซเชฒเชพเชฏเช‚เชŸ เชนเซ‡เชจเซเชกเชฒเชฐ เชชเซ‹เชคเซ‡:

using System;
using System.IO;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;

namespace ClearServer
{
    class Client
    {


        public Client(TcpClient Client)
        {

            string Message = "";
            byte[] Buffer = new byte[1024];
            int Count;
            while ((Count = Client.GetStream().Read(Buffer, 0, Buffer.Length)) > 0)
            {
                Message += Encoding.UTF8.GetString(Buffer, 0, Count);

                if (Message.IndexOf("rnrn") >= 0 || Message.Length > 4096)
                {
                    Console.WriteLine(Message);
                    break;
                }
            }

            Match ReqMatch = Regex.Match(Message, @"^w+s+([^s?]+)[^s]*s+HTTP/.*|");
            if (ReqMatch == Match.Empty)
            {
                ErrorWorker.SendError(Client, 400);
                return;
            }
            string RequestUri = ReqMatch.Groups[1].Value;
            RequestUri = Uri.UnescapeDataString(RequestUri);
            if (RequestUri.IndexOf("..") >= 0)
            {
                ErrorWorker.SendError(Client, 400);
                return;
            }
            if (RequestUri.EndsWith("/"))
            {
                RequestUri += "index.html";
            }

            string FilePath =

quot;D:/Web/TestSite{RequestUri}";

if (!File.Exists(FilePath))
{
ErrorWorker.SendError(Client, 404);
return;
}

string Extension = RequestUri.Substring(RequestUri.LastIndexOf('.'));

string ContentType = "";

switch (Extension)
{
case ".htm":
case ".html":
ContentType = "text/html";
break;
case ".css":
ContentType = "text/css";
break;
case ".js":
ContentType = "text/javascript";
break;
case ".jpg":
ContentType = "image/jpeg";
break;
case ".jpeg":
case ".png":
case ".gif":
ContentType =

quot;image/{Extension.Substring(1)}";
break;
default:
if (Extension.Length > 1)
{
ContentType =

quot;application/{Extension.Substring(1)}";
}
else
{
ContentType = "application/unknown";
}
break;
}

FileStream FS;
try
{
FS = new FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.Read);
}
catch (Exception)
{
ErrorWorker.SendError(Client, 500);
return;
}

string Headers =

quot;HTTP/1.1 200 OKnContent-Type: {ContentType}nContent-Length: {FS.Length}nn";
byte[] HeadersBuffer = Encoding.ASCII.GetBytes(Headers);
Client.GetStream().Write(HeadersBuffer, 0, HeadersBuffer.Length);

while (FS.Position < FS.Length)
{
Count = FS.Read(Buffer, 0, Buffer.Length);
Client.GetStream().Write(Buffer, 0, Count);
}

FS.Close();
Client.Close();
}
}
}


เช…เชจเซ‡ เชธเซเชฅเชพเชจเชฟเช• SQL เชชเชฐ เชฌเชจเซ‡เชฒ เชชเซเชฐเชฅเชฎ เชกเซ‡เชŸเชพเชฌเซ‡เช:
using System;
using System.Data.Linq;
namespace ClearServer
{
    class DatabaseWorker
    {

        private static DatabaseWorker instance;

        public static DatabaseWorker GetInstance
        {
            get
            {
                if (instance == null)
                    instance = new DatabaseWorker();
                return instance;
            }
        }


        private DatabaseWorker()
        {
            string connectionStr = databasePath;
            using (DataContext db = new DataContext(connectionStr))
            {
                Table<User> users = db.GetTable<User>();
                foreach (var item in users)
                {
                    Console.WriteLine(

quot;{item.login} {item.password}");
}
}
}
}
}


เชœเซ‡เชฎ เชคเชฎเซ‡ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹, เช† เชธเช‚เชธเซเช•เชฐเชฃ เชฒเซ‡เช–เชฎเชพเช‚เชจเชพ เชธเช‚เชธเซเช•เชฐเชฃเชฅเซ€ เชฅเซ‹เชกเซเช‚ เช…เชฒเช— เช›เซ‡. เชตเชพเชธเซเชคเชตเชฎเชพเช‚, เช…เชนเซ€เช‚ เช…เชฎเซ‡ เช•เชฎเซเชชเซเชฏเซเชŸเชฐ เชชเชฐเชจเชพ เชซเซ‹เชฒเซเชกเชฐ เช…เชจเซ‡ เชกเซ‡เชŸเชพเชฌเซ‡เชเชฎเชพเช‚เชฅเซ€ เชชเซƒเชทเซเช เซ‹เชจเซเช‚ เชฒเซ‹เชกเชฟเช‚เช— เช‰เชฎเซ‡เชฐเซเชฏเซเช‚ เช›เซ‡ (เชœเซ‡, เชฎเชพเชฐเซเช— เชฆเซเชตเชพเชฐเชพ, เช–เซ‹เชŸเชพ เช•เชจเซ‡เช•เซเชถเชจ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเชจเซ‡ เช•เชพเชฐเชฃเซ‡ เช† เชธเช‚เชธเซเช•เชฐเชฃเชฎเชพเช‚ เช•เชพเชฎ เช•เชฐเชคเซเช‚ เชจเชฅเซ€).

เชชเซเชฐเช•เชฐเชฃ 2. เชตเซเชนเซ€เชฒเซเชธเชจเซ‡ เชธเซเช•เซเชฐเซ‚ เช•เชฐเชตเซ€

เชธเชฐเซเชตเชฐเชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชนเซเช‚ เชจเชฟเชทเซเช•เชฐเซเชท เชชเชฐ เช†เชตเซเชฏเซ‹ เช•เซ‡ เช† เชเช• เช‰เชคเซเชคเชฎ เช‰เช•เซ‡เชฒ เชนเชถเซ‡(เชฌเช—เชพเชกเชจเชพเชฐ: เชจเชพ), เช…เชฎเชพเชฐเซ€ เชธเซ‡เชตเชพ เชฎเชพเชŸเซ‡, เชคเซ‡เชฅเซ€ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเซ‡ เชคเชฐเซเช• เชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซเชฏเซเช‚.
เชงเซ€เชฎเซ‡ เชงเซ€เชฎเซ‡, เชจเชตเชพ เชฎเซ‹เชกเซเชฏเซเชฒเซ‹ เชฆเซ‡เช–เชพเชตเชพ เชฒเชพเช—เซเชฏเชพ เช…เชจเซ‡ เชธเชฐเซเชตเชฐเชจเซ€ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพ เชตเชฟเชธเซเชคเชฐเชคเซ€ เช—เชˆ. เชธเชฐเซเชตเชฐเซ‡ เชเช• เชŸเซ‡เชธเซเชŸ เชกเซ‹เชฎเซ‡เชจ เชฎเซ‡เชณเชตเซเชฏเซเช‚ เช…เชจเซ‡ เชเชธเชเชธเชเชฒ เช•เชจเซ‡เช•เซเชถเชจ เชเชจเซเช•เซเชฐเชฟเชชเซเชถเชจ.

เชธเชฐเซเชตเชฐ เช…เชจเซ‡ เช•เซเชฒเชพเชฏเช‚เชŸ เชชเซเชฐเซ‹เชธเซ‡เชธเชฟเช‚เช—เชจเชพ เชคเชฐเซเช•เชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเชคเซ‹ เชฅเซ‹เชกเซ‹ เชตเชงเซ เช•เซ‹เชก
เชธเชฐเซเชตเชฐเชจเซเช‚ เช…เชชเชกเซ‡เชŸเซ‡เชก เชตเชฐเซเชเชจ เชœเซ‡เชฎเชพเช‚ เชชเซเชฐเชฎเชพเชฃเชชเชคเซเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เชถเชพเชฎเซ‡เชฒ เช›เซ‡.

using System;
using System.Net;
using System.Net.Sockets;
using System.Reflection;
using System.Security;
using System.Security.Cryptography.X509Certificates;
using System.Security.Permissions;
using System.Security.Policy;
using System.Threading;


namespace ClearServer
{

    sealed class Server
    {
        readonly bool ServerRunning = true;
        readonly TcpListener sslListner;
        public static X509Certificate serverCertificate = null;
        Server()
        {
            serverCertificate = X509Certificate.CreateFromSignedFile(@"C:sslitinder.online.crt");
            sslListner = new TcpListener(IPAddress.Any, 443);
            sslListner.Start();
            Console.WriteLine("Starting server.." + serverCertificate.Subject + "n" + Assembly.GetExecutingAssembly().Location);
            while (ServerRunning)
            {
                TcpClient SslClient = sslListner.AcceptTcpClient();
                Thread SslThread = new Thread(new ParameterizedThreadStart(ClientThread));
                SslThread.Start(SslClient);
            }
            
        }
        static void ClientThread(Object StateInfo)
        {
            new Client((TcpClient)StateInfo);
        }

        ~Server()
        {
            if (sslListner != null)
            {
                sslListner.Stop();
            }
        }

        public static void Main(string[] args)
        {
            if (AppDomain.CurrentDomain.IsDefaultAppDomain())
            {
                Console.WriteLine("Switching another domain");
                new AppDomainSetup
                {
                    ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase
                };
                var current = AppDomain.CurrentDomain;
                var strongNames = new StrongName[0];
                var domain = AppDomain.CreateDomain(
                    "ClearServer", null,
                    current.SetupInformation, new PermissionSet(PermissionState.Unrestricted),
                    strongNames);
                domain.ExecuteAssembly(Assembly.GetExecutingAssembly().Location);
            }
            new Server();
        }
    }
}

เช…เชจเซ‡ SSL เช…เชงเชฟเช•เซƒเชคเชคเชพ เชธเชพเชฅเซ‡ เชเช• เชจเชตเซ‹ เช•เซเชฒเชพเชฏเช‚เชŸ เชนเซ‡เชจเซเชกเชฒเชฐ เชชเชฃ:

using ClearServer.Core.Requester;
using System;
using System.Net.Security;
using System.Net.Sockets;

namespace ClearServer
{
    public class Client
    {
        public Client(TcpClient Client)
        {
            SslStream SSlClientStream = new SslStream(Client.GetStream(), false);
            try
            {
                SSlClientStream.AuthenticateAsServer(Server.serverCertificate, clientCertificateRequired: false, checkCertificateRevocation: true);
            }
            catch (Exception e)
            {
                Console.WriteLine(
                    "---------------------------------------------------------------------n" +

quot;|{DateTime.Now:g}n|------------n|{Client.Client.RemoteEndPoint}n|------------n|Exception: {e.Message}n|------------n|Authentication failed - closing the connection.n" +
"---------------------------------------------------------------------n");
SSlClientStream.Close();
Client.Close();
}
new RequestContext(SSlClientStream, Client);
}

}
}


เชชเชฐเช‚เชคเซ เชธเชฐเซเชตเชฐ เชซเช•เซเชค TCP เช•เชจเซ‡เช•เซเชถเชจ เชชเชฐ เชœ เชšเชพเชฒเชคเซเช‚ เชนเซ‹เชตเชพเชฅเซ€, เชตเชฟเชจเช‚เชคเซ€เชจเชพ เชธเช‚เชฆเชฐเซเชญเชจเซ‡ เช“เชณเช–เซ€ เชถเช•เซ‡ เชคเซ‡เชตเซเช‚ เชฎเซ‹เชกเซเชฏเซเชฒ เชฌเชจเชพเชตเชตเซเช‚ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡. เชฎเซ‡เช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚ เช›เซ‡ เช•เซ‡ เช…เชนเซ€เช‚ เชเช• เชชเชพเชฐเซเชธเชฐ เชฏเซ‹เช—เซเชฏ เชนเชถเซ‡ เชœเซ‡ เช•เซเชฒเชพเชฏเชจเซเชŸเชจเซ€ เชตเชฟเชจเช‚เชคเซ€เชจเซ‡ เช…เชฒเช— เชญเชพเช—เซ‹เชฎเชพเช‚ เชตเชฟเชญเชพเชœเชฟเชค เช•เชฐเชถเซ‡ เชœเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เชนเซเช‚ เช•เซเชฒเชพเชฏเชจเซเชŸเชจเซ‡ เชœเชฐเซ‚เชฐเซ€ เชœเชตเชพเชฌเซ‹ เช†เชชเชตเชพ เชฎเชพเชŸเซ‡ เชธเช‚เชชเชฐเซเช• เช•เชฐเซ€ เชถเช•เซเช‚.

เชชเชพเชฐเซเชธเชฐ

using ClearServer.Core.UserController;
using ReServer.Core.Classes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Security;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;

namespace ClearServer.Core.Requester
{
    public class RequestContext
    {
        public string Message = "";
        private readonly byte[] buffer = new byte[1024];
        public string RequestMethod;
        public string RequestUrl;
        public User RequestProfile;
        public User CurrentUser = null;
        public List<RequestValues> HeadersValues;
        public List<RequestValues> FormValues;
        private TcpClient TcpClient;

        private event Action<SslStream, RequestContext> OnRead = RequestHandler.OnHandle;

        DatabaseWorker databaseWorker = new DatabaseWorker();

        public RequestContext(SslStream ClientStream, TcpClient Client)
        {

            this.TcpClient = Client;
            try
            {
                ClientStream.BeginRead(buffer, 0, buffer.Length, ClientRead, ClientStream);
            }
            catch { return; }
        }
        private void ClientRead(IAsyncResult ar)
        {
            SslStream ClientStream = (SslStream)ar.AsyncState;

            if (ar.IsCompleted)
            {
                Message = Encoding.UTF8.GetString(buffer);
                Message = Uri.UnescapeDataString(Message);
                Console.WriteLine(

quot;n{DateTime.Now:g} Client IP:{TcpClient.Client.RemoteEndPoint}n{Message}");
RequestParse();
HeadersValues = HeaderValues();
FormValues = ContentValues();
UserParse();
ProfileParse();
OnRead?.Invoke(ClientStream, this);
}
}

private void RequestParse()
{
Match methodParse = Regex.Match(Message, @"(^w+)s+([^s?]+)[^s]*s+HTTP/.*|");
RequestMethod = methodParse.Groups[1].Value.Trim();
RequestUrl = methodParse.Groups[2].Value.Trim();
}
private void UserParse()
{
string cookie;
try
{
if (HeadersValues.Any(x => x.Name.Contains("Cookie")))
{
cookie = HeadersValues.FirstOrDefault(x => x.Name.Contains("Cookie")).Value;
try
{
CurrentUser = databaseWorker.CookieValidate(cookie);
}
catch { }
}
}
catch { }

}
private List<RequestValues> HeaderValues()
{
var values = new List<RequestValues>();
var parse = Regex.Matches(Message, @"(.*?): (.*?)n");
foreach (Match match in parse)
{
values.Add(new RequestValues()
{
Name = match.Groups[1].Value.Trim(),
Value = match.Groups[2].Value.Trim()
});
}
return values;
}

private void ProfileParse()
{
if (RequestUrl.Contains("@"))
{
RequestProfile = databaseWorker.FindUser(RequestUrl.Substring(2));
RequestUrl = "/profile";
}
}
private List<RequestValues> ContentValues()
{
var values = new List<RequestValues>();
var output = Message.Trim('n').Split().Last();
var parse = Regex.Matches(output, @"([^&].*?)=([^&]*b)");
foreach (Match match in parse)
{
values.Add(new RequestValues()
{
Name = match.Groups[1].Value.Trim(),
Value = match.Groups[2].Value.Trim().Replace('+', ' ')
});
}
return values;
}
}
}


เชคเซ‡เชจเซ‹ เชธเชพเชฐ เชจเชฟเชฏเชฎเชฟเชค เช…เชญเชฟเชตเซเชฏเช•เซเชคเชฟเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชตเชฟเชจเช‚เชคเซ€เชจเซ‡ เชญเชพเช—เซ‹เชฎเชพเช‚ เชคเซ‹เชกเชตเชพเชจเซ‹ เช›เซ‡. เช…เชฎเชจเซ‡ เช•เซเชฒเชพเชฏเช‚เชŸ เชคเชฐเชซเชฅเซ€ เชธเช‚เชฆเซ‡เชถ เชชเซเชฐเชพเชชเซเชค เชฅเชพเชฏ เช›เซ‡, เชชเซเชฐเชฅเชฎ เชฒเชพเช‡เชจ เชชเชธเช‚เชฆ เช•เชฐเซ‹, เชœเซ‡เชฎเชพเช‚ เชชเชฆเซเชงเชคเชฟ เช…เชจเซ‡ เชตเชฟเชจเช‚เชคเซ€ url เชถเชพเชฎเซ‡เชฒ เช›เซ‡. เชชเช›เซ€ เช†เชชเชฃเซ‡ เชฎเชฅเชพเชณเชพเช“ เชตเชพเช‚เชšเซ€เช เช›เซ€เช, เชœเซ‡เชจเซ‡ เช†เชชเชฃเซ‡ HeaderName=Content เชซเซ‹เชฐเซเชฎเชจเซ€ เชเชฐเซ‡เชฎเชพเช‚ เชฎเซ‚เช•เซ€เช เช›เซ€เช, เช…เชจเซ‡ เชœเซ‹ เช‰เชชเชฒเชฌเซเชง เชนเซ‹เชฏ เชคเซ‹, เชคเซ‡เชจเซ€ เชธเชพเชฅเซ‡เชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช•เซเชตเซ‡เชฐเซ€เชธเซเชŸเซเชฐเชฟเช‚เช—) เชชเชฃ เชถเซ‹เชงเซ€เช เช›เซ€เช เชœเซ‡ เช†เชชเชฃเซ‡ เชธเชฎเชพเชจ เชเชฐเซ‡เชฎเชพเช‚ เชชเชฃ เชฎเซ‚เช•เซ€เช เช›เซ€เช. เชตเชงเซเชฎเชพเช‚, เชตเชฟเชถเซเชฒเซ‡เชทเช• เชตเชฐเซเชคเชฎเชพเชจ เช•เซเชฒเชพเชฏเช‚เชŸ เช…เชงเชฟเช•เซƒเชค เช›เซ‡ เช•เซ‡ เช•เซ‡เชฎ เชคเซ‡ เชถเซ‹เชงเซ€ เช•เชพเชขเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‹ เชกเซ‡เชŸเชพ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเซ‡ เช›เซ‡. เช…เชงเชฟเช•เซƒเชค เช•เซเชฒเชพเชฏเช‚เชŸเชจเซ€ เชคเชฎเชพเชฎ เชตเชฟเชจเช‚เชคเซ€เช“เชฎเชพเช‚ เชเช• เช…เชงเชฟเช•เซƒเชคเชคเชพ เชนเซ‡เชถ เชนเซ‹เชฏ เช›เซ‡, เชœเซ‡ เช•เซ‚เช•เซ€เชเชฎเชพเช‚ เชธเช‚เช—เซเชฐเชนเชฟเชค เชนเซ‹เชฏ เช›เซ‡, เช†เชจเซ‡ เช•เชพเชฐเชฃเซ‡ เชฌเซ‡ เชชเซเชฐเช•เชพเชฐเชจเชพ เช•เซเชฒเชพเชฏเช‚เชŸ เชฎเชพเชŸเซ‡ เชตเชงเซ เช“เชชเชฐเซ‡เชŸเชฟเช‚เช— เชฒเซ‹เชœเซ€เช•เชจเซ‡ เช…เชฒเช— เช•เชฐเชตเชพเชจเซเช‚ เช…เชจเซ‡ เชคเซ‡เชฎเชจเซ‡ เชธเชพเชšเชพ เชœเชตเชพเชฌเซ‹ เช†เชชเชตเชพเชจเซเช‚ เชถเช•เซเชฏ เช›เซ‡.

เชธเชพเชฐเซเช‚, เชเช• เชจเชพเชจเซเช‚, เชธเชฐเชธ เชฒเช•เซเชทเชฃ เช•เซ‡ เชœเซ‡ เชเช• เช…เชฒเช— เชฎเซ‹เชกเซเชฏเซเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพ เชฏเซ‹เช—เซเชฏ เชนเชถเซ‡, "site.com/@UserName" เชœเซ‡เชตเชพ เชชเซเชฐเชถเซเชจเซ‹เชจเซ‡ เช—เชคเชฟเชถเซ€เชฒ เชฐเซ€เชคเซ‡ เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ‡เชฒเชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชชเซƒเชทเซเช เซ‹เชฎเชพเช‚ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฟเชค เช•เชฐเชตเชพ. เชตเชฟเชจเช‚เชคเซ€ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชจเซ€เชšเซ‡เชจเชพ เชฎเซ‹เชกเซเชฏเซเชฒเซ‹ เช…เชฎเชฒเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เชชเซเชฐเช•เชฐเชฃ 3. เชธเซเชŸเซ€เช…เชฐเชฟเช‚เช— เชตเซเชนเซ€เชฒ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเซเช‚, เชธเชพเช‚เช•เชณเชจเซเช‚ เชฒเซเชฌเซเชฐเชฟเช•เซ‡เชถเชจ

เชœเชฒเชฆเซ€ เชชเชพเชฐเซเชธเชฐเซ‡ เชคเซ‡เชจเซเช‚ เช•เชพเชฐเซเชฏ เชชเซ‚เชฐเซเชฃ เช•เชฐเซเชฏเซเช‚, เชนเซ‡เชจเซเชกเชฒเชฐ เชฐเชฎเชคเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชธเชฐเซเชตเชฐเชจเซ‡ เชตเชงเซ เชธเซ‚เชšเชจเชพเช“ เช†เชชเซ‡ เช›เซ‡ เช…เชจเซ‡ เชจเชฟเชฏเช‚เชคเซเชฐเชฃเชจเซ‡ เชฌเซ‡ เชญเชพเช—เซ‹เชฎเชพเช‚ เชตเชนเซ‡เช‚เชšเซ‡ เช›เซ‡.

เชธเชฐเชณ เชนเซ‡เชจเซเชกเชฒเชฐ

using ClearServer.Core.UserController;
using System.Net.Security;
namespace ClearServer.Core.Requester
{
    public class RequestHandler
    {
        public static void OnHandle(SslStream ClientStream, RequestContext context)
        {

            if (context.CurrentUser != null)
            {
                new AuthUserController(ClientStream, context);
            }
            else 
            {
                new NonAuthUserController(ClientStream, context);
            };
        }
    }
}

เชตเชพเชธเซเชคเชตเชฎเชพเช‚, เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เช…เชงเชฟเช•เซƒเชคเชคเชพ เชฎเชพเชŸเซ‡ เชฎเชพเชคเซเชฐ เชเช• เชœ เชคเชชเชพเชธ เช›เซ‡, เชœเซ‡เชจเชพ เชชเช›เซ€ เชตเชฟเชจเช‚เชคเซ€เชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชถเชฐเซ‚ เชฅเชพเชฏ เช›เซ‡.

เช•เซเชฒเชพเชฏเชจเซเชŸ เชจเชฟเชฏเช‚เชคเซเชฐเช•เซ‹
เชœเซ‹ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เช…เชงเชฟเช•เซƒเชค เชจเชฅเซ€, เชคเซ‹ เชคเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพ เชซเช•เซเชค เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชชเซเชฐเซ‹เชซเชพเช‡เชฒเซเชธเชจเชพ เชชเซเชฐเชฆเชฐเซเชถเชจ เช…เชจเซ‡ เช…เชงเชฟเช•เซƒเชค เชจเซ‹เช‚เชงเชฃเซ€ เชตเชฟเช‚เชกเซ‹ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เช›เซ‡. เช…เชงเชฟเช•เซƒเชค เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชฎเชพเชŸเซ‡เชจเซ‹ เช•เซ‹เชก เชฒเช—เชญเช— เชธเชฎเชพเชจ เชฆเซ‡เช–เชพเชฏ เช›เซ‡, เชคเซ‡เชฅเซ€ เชฎเชจเซ‡ เชคเซ‡เชจเซ‡ เชกเซเชชเซเชฒเชฟเช•เซ‡เชŸ เช•เชฐเชตเชพเชจเซเช‚ เช•เซ‹เชˆ เช•เชพเชฐเชฃ เชฆเซ‡เช–เชพเชคเซเช‚ เชจเชฅเซ€.

เช…เชจเชงเชฟเช•เซƒเชค เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ

using ClearServer.Core.Requester;
using System.IO;
using System.Net.Security;

namespace ClearServer.Core.UserController
{
    internal class NonAuthUserController
    {
        private readonly SslStream ClientStream;
        private readonly RequestContext Context;
        private readonly WriteController WriteController;
        private readonly AuthorizationController AuthorizationController;

        private readonly string ViewPath = "C:/Users/drdre/source/repos/ClearServer/View";

        public NonAuthUserController(SslStream clientStream, RequestContext context)
        {
            this.ClientStream = clientStream;
            this.Context = context;
            this.WriteController = new WriteController(clientStream);
            this.AuthorizationController = new AuthorizationController(clientStream, context);
            ResourceLoad();
        }

        void ResourceLoad()
        {
            string[] blockextension = new string[] {"cshtml", "html", "htm"};
            bool block = false;
            foreach (var item in blockextension)
            {
                if (Context.RequestUrl.Contains(item))
                {
                    block = true;
                    break;
                }
            }
            string FilePath = "";
            string Header = "";
            var RazorController = new RazorController(Context, ClientStream);
            
            switch (Context.RequestMethod)
            {
                case "GET":
                    switch (Context.RequestUrl)
                    {
                        case "/":
                            FilePath = ViewPath + "/loginForm.html";
                            Header =

quot;HTTP/1.1 200 OKnContent-Type: text/html";
WriteController.DefaultWriter(Header, FilePath);
break;
case "/profile":
RazorController.ProfileLoader(ViewPath);
break;
default:
//ะฒ ะดะฐะฝะฝะพะผ ะฑะปะพะบะต ะบะพะดะฐ ะฟั€ะพะธัั…ะพะดะธั‚ ะพั‚ัะตั‡ะตะฝะธะต ะทะฐะฟั€ะพัะพะฒ ะบ ัะตั€ะฒะตั€ัƒ ะฟะพ ะฟั€ัะผะพะผัƒ ะฐะดั€ะตััƒ ัั‚ั€ะฐะฝะธั†ั‹ ะฒะธะดะฐ site.com/page.html
if (!File.Exists(ViewPath + Context.RequestUrl) | block)
{
RazorController.ErrorLoader(404);

}
else if (Path.HasExtension(Context.RequestUrl) && File.Exists(ViewPath + Context.RequestUrl))
{
Header = WriteController.ContentType(Context.RequestUrl);
FilePath = ViewPath + Context.RequestUrl;
WriteController.DefaultWriter(Header, FilePath);
}
break;
}
break;

case "POST":
AuthorizationController.MethodRecognizer();
break;

}

}

}
}


เช…เชจเซ‡ เช…เชฒเชฌเชคเซเชค, เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช เช…เชฎเซเช• เชชเซเชฐเช•เชพเชฐเชจเซ€ เชชเซƒเชทเซเช  เชธเชพเชฎเช—เซเชฐเซ€ เชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเซ€ เช†เชตเชถเซเชฏเช• เช›เซ‡, เชคเซ‡เชฅเซ€ เชชเซเชฐเชคเชฟเชธเชพเชฆเซ‹ เชฎเชพเชŸเซ‡ เชจเซ€เชšเซ‡เชจเซเช‚ เชฎเซ‹เชกเซเชฏเซเชฒ เช›เซ‡, เชœเซ‡ เชธเช‚เชธเชพเชงเชจ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซ‹ เชœเชตเชพเชฌ เช†เชชเชตเชพ เชฎเชพเชŸเซ‡ เชœเชตเชพเชฌเชฆเชพเชฐ เช›เซ‡.

เชฐเชพเชˆเชŸเชฐ เช•เช‚เชŸเซเชฐเซ‹เชฒเชฐ

using System;
using System.IO;
using System.Net.Security;
using System.Text;

namespace ClearServer.Core.UserController
{
    public class WriteController
    {
        SslStream ClientStream;
        public WriteController(SslStream ClientStream)
        {
            this.ClientStream = ClientStream;
        }

        public void DefaultWriter(string Header, string FilePath)
        {
            FileStream fileStream;
            try
            {
                fileStream = new FileStream(FilePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
                Header =

quot;{Header}nContent-Length: {fileStream.Length}nn";
ClientStream.Write(Encoding.UTF8.GetBytes(Header));
byte[] response = new byte[fileStream.Length];
fileStream.BeginRead(response, 0, response.Length, OnFileRead, response);
}
catch { }
}

public string ContentType(string Uri)
{
string extension = Path.GetExtension(Uri);
string Header = "HTTP/1.1 200 OKnContent-Type:";
switch (extension)
{
case ".html":
case ".htm":
return

quot;{Header} text/html";
case ".css":
return

quot;{Header} text/css";
case ".js":
return

quot;{Header} text/javascript";
case ".jpg":
case ".jpeg":
case ".png":
case ".gif":
return

quot;{Header} image/{extension}";
default:
if (extension.Length > 1)
{
return

quot;{Header} application/" + extension.Substring(1);
}
else
{
return

quot;{Header} application/unknown";
}
}
}

public void OnFileRead(IAsyncResult ar)
{
if (ar.IsCompleted)
{
var file = (byte[])ar.AsyncState;
ClientStream.BeginWrite(file, 0, file.Length, OnClientSend, null);
}
}

public void OnClientSend(IAsyncResult ar)
{
if (ar.IsCompleted)
{
ClientStream.Close();
}
}
}


เชชเชฐเช‚เชคเซ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‡ เชคเซ‡เชจเซ€ เชชเซเชฐเซ‹เชซเชพเช‡เชฒ เช…เชจเซ‡ เช…เชจเซเชฏ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“เชจเซ€ เชชเซเชฐเซ‹เชซเชพเช‡เชฒเซเชธ เชฌเชคเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เชฎเซ‡เช‚ RazorEngine เช…เชฅเชตเชพ เชคเซ‡เชจเชพ เชฌเชฆเชฒเซ‡ เชคเซ‡เชจเซ‹ เชญเชพเช— เชตเชพเชชเชฐเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚. เชคเซ‡เชฎเชพเช‚ เช…เชฎเชพเชจเซเชฏ เชตเชฟเชจเช‚เชคเซ€เช“ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเซ€ เช…เชจเซ‡ เชฏเซ‹เช—เซเชฏ เชญเซ‚เชฒ เช•เซ‹เชก เชœเชพเชฐเซ€ เช•เชฐเชตเชพเชจเซ‹ เชชเชฃ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡.

เชฐเซ‡เชเชฐ เช•เช‚เชŸเซเชฐเซ‹เชฒเชฐ

using ClearServer.Core.Requester;
using RazorEngine;
using RazorEngine.Templating;
using System;
using System.IO;
using System.Net;
using System.Net.Security;

namespace ClearServer.Core.UserController
{
    internal class RazorController
    {
        private RequestContext Context;
        private SslStream ClientStream;
        dynamic PageContent;


        public RazorController(RequestContext context, SslStream clientStream)
        {
            this.Context = context;
            this.ClientStream = clientStream;

        }

        public void ProfileLoader(string ViewPath)
        {
            string Filepath = ViewPath + "/profile.cshtml";
            if (Context.RequestProfile != null)
            {
                if (Context.CurrentUser != null && Context.RequestProfile.login == Context.CurrentUser.login)
                {
                    try
                    {
                        PageContent = new { isAuth = true, Name = Context.CurrentUser.name, Login = Context.CurrentUser.login, Skills = Context.CurrentUser.skills };
                        ClientSend(Filepath, Context.CurrentUser.login);
                    }
                    catch (Exception e) { Console.WriteLine(e); }

                }
                else
                {
                    try
                    {
                        PageContent = new { isAuth = false, Name = Context.RequestProfile.name, Login = Context.RequestProfile.login, Skills = Context.RequestProfile.skills };
                        ClientSend(Filepath, "PublicProfile:"+ Context.RequestProfile.login);
                    }
                    catch (Exception e) { Console.WriteLine(e); }
                }
            }
            else
            {
                ErrorLoader(404);
            }


        }

        public void ErrorLoader(int Code)
        {
            try
            {
                PageContent = new { ErrorCode = Code, Message = ((HttpStatusCode)Code).ToString() };
                string ErrorPage = "C:/Users/drdre/source/repos/ClearServer/View/Errors/ErrorPage.cshtml";
                ClientSend(ErrorPage, Code.ToString());
            }
            catch { }

        }

        private void ClientSend(string FilePath, string Key)
        {
            var template = File.ReadAllText(FilePath);
            var result = Engine.Razor.RunCompile(template, Key, null, (object)PageContent);
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(result);
            ClientStream.BeginWrite(buffer, 0, buffer.Length, OnClientSend, ClientStream);
        }

        private void OnClientSend(IAsyncResult ar)
        {
            if (ar.IsCompleted)
            {
                ClientStream.Close();
            }
        }
    }
}

เช…เชจเซ‡ เช…เชฒเชฌเชคเซเชค, เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช…เชงเชฟเช•เซƒเชค เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“เชจเซ€ เชšเช•เชพเชธเชฃเซ€ เชฎเชพเชŸเซ‡, เช…เชงเชฟเช•เซƒเชคเชคเชพ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡. เช…เชงเชฟเช•เซƒเชคเชคเชพ เชฎเซ‹เชกเซเชฏเซเชฒ เชกเซ‡เชŸเชพเชฌเซ‡เช เชธเชพเชฅเซ‡ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เช•เชฐเซ‡ เช›เซ‡. เชธเชพเช‡เชŸ เชชเชฐเชจเชพ เชซเซ‹เชฐเซเชฎเซเชธเชฎเชพเช‚เชฅเซ€ เชชเซเชฐเชพเชชเซเชค เชกเซ‡เชŸเชพเชจเซ‡ เชธเช‚เชฆเชฐเซเชญเชฎเชพเช‚เชฅเซ€ เชตเชฟเชถเซเชฒเซ‡เชทเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชธเชพเชšเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชฌเชฆเชฒเชพเชฎเชพเช‚ เช•เซ‚เช•เซ€เช เช…เชจเซ‡ เชธเซ‡เชตเชพเชจเซ€ เชเช•เซเชธเซ‡เชธ เชฎเซ‡เชณเชตเซ‡ เช›เซ‡.

เช…เชงเชฟเช•เซƒเชคเชคเชพ เชฎเซ‹เชกเซเชฏเซเชฒ

using ClearServer.Core.Cookies;
using ClearServer.Core.Requester;
using ClearServer.Core.Security;
using System;
using System.Linq;
using System.Net.Security;
using System.Text;

namespace ClearServer.Core.UserController
{
    internal class AuthorizationController
    {
        private SslStream ClientStream;
        private RequestContext Context;
        private UserCookies cookies;
        private WriteController WriteController;
        DatabaseWorker DatabaseWorker;
        RazorController RazorController;
        PasswordHasher PasswordHasher;
        public AuthorizationController(SslStream clientStream, RequestContext context)
        {
            ClientStream = clientStream;
            Context = context;
            DatabaseWorker = new DatabaseWorker();
            WriteController = new WriteController(ClientStream);
            RazorController = new RazorController(context, clientStream);
            PasswordHasher = new PasswordHasher();
        }

        internal void MethodRecognizer()
        {
            if (Context.FormValues.Count == 2 && Context.FormValues.Any(x => x.Name == "password")) Authorize();
            else if (Context.FormValues.Count == 3 && Context.FormValues.Any(x => x.Name == "regPass")) Registration();
            else
            {
                RazorController.ErrorLoader(401);
            }
        }

        private void Authorize()
        {
            var values = Context.FormValues;
            var user = new User()
            {
                login = values[0].Value,
                password = PasswordHasher.PasswordHash(values[1].Value)
            };
            user = DatabaseWorker.UserAuth(user);
            if (user != null)
            {
                cookies = new UserCookies(user.login, user.password);
                user.cookie = cookies.AuthCookie;
                DatabaseWorker.UserUpdate(user);
                var response = Encoding.UTF8.GetBytes(

quot;HTTP/1.1 301 Moved PermanentlynLocation: /@{user.login}nSet-Cookie: {cookies.AuthCookie}; Expires={DateTime.Now.AddDays(2):R}; Secure; HttpOnlynn");
ClientStream.BeginWrite(response, 0, response.Length, WriteController.OnClientSend, null);

}
else
{
RazorController.ErrorLoader(401);

}
}

private void Registration()
{
var values = Context.FormValues;
var user = new User()
{
name = values[0].Value,
login = values[1].Value,
password = PasswordHasher.PasswordHash(values[2].Value),
};
cookies = new UserCookies(user.login, user.password);
user.cookie = cookies.AuthCookie;
if (DatabaseWorker.LoginValidate(user.login))
{
Console.WriteLine("User ready");
Console.WriteLine(

quot;{user.password} {user.password.Trim().Length}");
DatabaseWorker.UserRegister(user);
var response = Encoding.UTF8.GetBytes(

quot;HTTP/1.1 301 Moved PermanentlynLocation: /@{user.login}nSet-Cookie: {user.cookie}; Expires={DateTime.Now.AddDays(2):R}; Secure; HttpOnlynn");
ClientStream.BeginWrite(response, 0, response.Length, WriteController.OnClientSend, null);
}
else
{
RazorController.ErrorLoader(401);
}
}
}
}


เช…เชจเซ‡ เชกเซ‡เชŸเชพเชฌเซ‡เช เชชเซเชฐเซ‹เชธเซ‡เชธเชฟเช‚เช— เช†เชจเชพ เชœเซ‡เชตเซเช‚ เชฆเซ‡เช–เชพเชฏ เช›เซ‡:

เชกเซ‡เชŸเชพเชฌเซ‡เช

using ClearServer.Core.UserController;
using System;
using System.Data.Linq;
using System.Linq;

namespace ClearServer
{
    class DatabaseWorker
    {

        private readonly Table<User> users = null;
        private readonly DataContext DataBase = null;
        private const string connectionStr = @"ะฟัƒั‚ัŒะบะฑะฐะทะต";

        public DatabaseWorker()
        {
            DataBase = new DataContext(connectionStr);
            users = DataBase.GetTable<User>();
        }

        public User UserAuth(User User)
        {
            try
            {
                var user = users.SingleOrDefault(t => t.login.ToLower() == User.login.ToLower() && t.password == User.password);
                if (user != null)
                    return user;
                else
                    return null;
            }
            catch (Exception)
            {
                return null;
            }

        }

        public void UserRegister(User user)
        {
            try
            {
                users.InsertOnSubmit(user);
                DataBase.SubmitChanges();
                Console.WriteLine(

quot;User{user.name} with id {user.uid} added");
foreach (var item in users)
{
Console.WriteLine(item.login + "n");
}
}
catch (Exception e)
{
Console.WriteLine(e);
}

}

public bool LoginValidate(string login)
{
if (users.Any(x => x.login.ToLower() == login.ToLower()))
{
Console.WriteLine("Login already exists");
return false;
}
return true;
}
public void UserUpdate(User user)
{
var UserToUpdate = users.FirstOrDefault(x => x.uid == user.uid);
UserToUpdate = user;
DataBase.SubmitChanges();
Console.WriteLine(

quot;User {UserToUpdate.name} with id {UserToUpdate.uid} updated");
foreach (var item in users)
{
Console.WriteLine(item.login + "n");
}
}
public User CookieValidate(string CookieInput)
{
User user = null;
try
{
user = users.SingleOrDefault(x => x.cookie == CookieInput);
}
catch
{
return null;
}
if (user != null) return user;
else return null;
}
public User FindUser(string login)
{
User user = null;
try
{
user = users.Single(x => x.login.ToLower() == login.ToLower());
if (user != null)
{
return user;
}
else
{
return null;
}
}
catch (Exception)
{
return null;
}
}
}
}


เช…เชจเซ‡ เชฌเชงเซเช‚ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡ เชœเซ‡เชฎ เช•เซ‡ เช˜เชกเชฟเชฏเชพเชณเชจเซเช‚ เช•เชพเชฎ, เช…เชงเชฟเช•เซƒเชคเชคเชพ เช…เชจเซ‡ เชจเซ‹เช‚เชงเชฃเซ€ เช•เชพเชฐเซเชฏ, เชธเซ‡เชตเชพเชจเซ‡ เชเช•เซเชธเซ‡เชธ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชฒเช˜เซเชคเซเชคเชฎ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เช›เซ‡ เช…เชจเซ‡ เชธเชฎเชฏ เช†เชตเซ€ เช—เชฏเซ‹ เช›เซ‡ เช•เซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฒเช–เซ‹ เช…เชจเซ‡ เช†เช–เซ€ เชตเชธเซเชคเซเชจเซ‡ เชฎเซเช–เซเชฏ เช•เชพเชฐเซเชฏเซ‹ เชธเชพเชฅเซ‡ เชœเซ‹เชกเซ‹ เช•เซ‡ เชœเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เชฌเชงเซเช‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡.

เชชเซเชฐเช•เชฐเชฃ 4. เชฌเชพเช‡เช•เชจเซ‡ เชซเซ‡เช‚เช•เซ€ เชฆเซ‡เชตเซเช‚

เชฌเซ‡ เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎ เชฎเชพเชŸเซ‡ เชฌเซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฒเช–เชตเชพเชจเชพ เชฎเชœเซ‚เชฐเซ€ เช–เชฐเซเชšเชจเซ‡ เช˜เชŸเชพเชกเชตเชพ เชฎเชพเชŸเซ‡, เชฎเซ‡เช‚ Xamarin.Forms เชชเชฐ เช•เซเชฐเซ‹เชธ-เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎ เชฌเชจเชพเชตเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚. เชซเชฐเซ€เชฅเซ€, เช เชนเช•เซ€เช•เชค เชฎเชพเชŸเซ‡ เช†เชญเชพเชฐ เช•เซ‡ เชคเซ‡ C# เชฎเชพเช‚ เช›เซ‡. เชเช• เชชเชฐเซ€เช•เซเชทเชฃ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฌเชจเชพเชตเซเชฏเชพ เชœเซ‡ เชธเชฐเซเชตเชฐเชจเซ‡ เชซเช•เซเชค เชกเซ‡เชŸเชพ เชฎเซ‹เช•เชฒเซ‡ เช›เซ‡, เชฎเชจเซ‡ เชเช• เชฐเชธเชชเซเชฐเชฆ เชฎเซเชฆเซเชฆเซ‹ เชฎเชณเซเชฏเซ‹. เช‰เชชเช•เชฐเชฃเชจเซ€ เชตเชฟเชจเช‚เชคเซ€ เชฎเชพเชŸเซ‡, เช†เชจเช‚เชฆ เชฎเชพเชŸเซ‡, เชฎเซ‡เช‚ เชคเซ‡เชจเซ‡ HttpClient เชชเชฐ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เซเชฏเซเช‚ เช…เชจเซ‡ HttpRequestMessage เชธเชฐเซเชตเชฐ เชชเชฐ เชฎเซ‹เช•เชฒเซเชฏเซเช‚, เชœเซ‡เชฎเชพเช‚ json เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ เช…เชงเชฟเช•เซƒเชคเชคเชพ เชซเซ‹เชฐเซเชฎเชฎเชพเช‚เชฅเซ€ เชกเซ‡เชŸเชพ เชถเชพเชฎเซ‡เชฒ เช›เซ‡. เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ เช•เช‚เชˆเชชเชฃ เช…เชชเซ‡เช•เซเชทเชพ เชฐเชพเช–เซเชฏเชพ เชตเชฟเชจเชพ, เชฎเซ‡เช‚ เชธเชฐเซเชตเชฐ เชฒเซ‹เช— เช–เซ‹เชฒเซเชฏเซ‹ เช…เชจเซ‡ เชคเซเชฏเชพเช‚ เชคเชฎเชพเชฎ เชกเซ‡เชŸเชพ เชธเชพเชฅเซ‡ เช‰เชชเช•เชฐเชฃเชจเซ€ เชตเชฟเชจเช‚เชคเซ€ เชœเซ‹เชˆ. เชธเชนเซ‡เชœ เชฎเซ‚เชฐเซเช–เชคเชพ, เช›เซ‡เชฒเซเชฒเชพ 3 เช…เช เชตเชพเชกเชฟเชฏเชพเชฎเชพเช‚ เชจเชฟเชธเซเชคเซ‡เชœ เชธเชพเช‚เชœเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒเซ€ เชฆเชฐเซ‡เช• เชตเชธเซเชคเซเชจเซ€ เชœเชพเช—เซƒเชคเชฟ. เชฎเซ‹เช•เชฒเซ‡เชฒเชพ เชกเซ‡เชŸเชพเชจเซ€ เชšเซ‹เช•เชธเชพเชˆ เชคเชชเชพเชธเชตเชพ เชฎเชพเชŸเซ‡, เชฎเซ‡เช‚ HttpListner เชชเชฐ เชเช• เชŸเซ‡เชธเซเชŸ เชธเชฐเซเชตเชฐ เชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเซเชฏเซเช‚. เชคเซ‡เชจเชพ เชชเชฐ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชฌเซ€เชœเซ€ เชตเชฟเชจเช‚เชคเซ€ เชชเซเชฐเชพเชชเซเชค เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชฎเซ‡เช‚ เชคเซ‡เชจเซ‡ เช•เซ‹เชกเชจเซ€ เชฌเซ‡ เชฒเซ€เชŸเซ€เช“เชฎเชพเช‚ เช…เชฒเช— เช•เชฐเซ€ เช…เชจเซ‡ เชซเซ‹เชฐเซเชฎเชฎเชพเช‚เชฅเซ€ เชกเซ‡เชŸเชพเชจเซ€ เช•เซ€เชตเซ‡เชฒเซเชฏเซเชชเซ‡เชฏเชฐ เชชเซเชฐเชพเชชเซเชค เช•เชฐเซ€. เช•เซเชตเซ‡เชฐเซ€เชจเซเช‚ เชชเชพเชฐเซเชธเชฟเช‚เช— เชฌเซ‡ เชฒเซ€เชŸเซ€เช“เชฎเชพเช‚ เช˜เชŸเชพเชกเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚.

เชฎเซ‡เช‚ เชตเชงเซ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซเชฏเซเช‚, เชคเซ‡เชจเซ‹ เช…เช—เชพเช‰ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชจ เชนเชคเซ‹, เชชเชฐเช‚เชคเซ เช…เช—เชพเช‰เชจเชพ เชธเชฐเซเชตเชฐ เชชเชฐ เชฎเซ‡เช‚ เชตเซ‡เชฌเชธเซ‹เช•เซ‡เชŸเซเชธ เชชเชฐ เชฌเชจเซ‡เชฒเซ€ เชšเซ‡เชŸเชจเซ‡ เชชเชฃ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เซ€ เชนเชคเซ€. เชคเซ‡ เช–เซ‚เชฌ เชœ เชธเชพเชฐเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฎ เช•เชฐเซเชฏเซเช‚, เชชเชฐเช‚เชคเซ Tcp เชฆเซเชตเชพเชฐเชพ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพเชจเซ‹ เชธเชฟเชฆเซเชงเชพเช‚เชค เชจเชฟเชฐเชพเชถเชพเชœเชจเช• เชนเชคเซ‹; เชชเชคเซเชฐเชตเซเชฏเชตเชนเชพเชฐ เชฒเซ‹เช— เชธเชพเชฅเซ‡ เชฌเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“เชจเซ€ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เชธเช•เซเชทเชฎ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช–เซ‚เชฌ เชœ เชฌเชฟเชจเชœเชฐเซ‚เชฐเซ€ เช•เชพเชฎ เช•เชฐเชตเซเช‚ เชชเชกเซเชฏเซเช‚. เช†เชฎเชพเช‚ เช•เชจเซ‡เช•เซเชถเชจเชจเซ‡ เชธเซเชตเชฟเชš เช•เชฐเชตเชพเชจเซ€ เชตเชฟเชจเช‚เชคเซ€เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช…เชจเซ‡ RFC 6455 เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเชตเชพเชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡. เชคเซ‡เชฅเซ€, เชŸเซ‡เชธเซเชŸ เชธเชฐเซเชตเชฐเชฎเชพเช‚, เชฎเซ‡เช‚ เชเช• เชธเชฐเชณ เชตเซ‡เชฌเชธเซ‹เช•เซ‡เชŸ เช•เชจเซ‡เช•เซเชถเชจ เชฌเชจเชพเชตเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚. เชฎเชพเชคเซเชฐ เช†เชจเช‚เชฆ เชฎเชพเชŸเซ‡.

เชšเซ‡เชŸ เชธเชพเชฅเซ‡ เชœเซ‹เชกเชพเช“

 private static async void HandleWebsocket(HttpListenerContext context)
        {
            var socketContext = await context.AcceptWebSocketAsync(null);
            var socket = socketContext.WebSocket;
            Locker.EnterWriteLock();
            try
            {
                Clients.Add(socket);
            }
            finally
            {
                Locker.ExitWriteLock();
            }

            while (true)
            {
                var buffer = new ArraySegment<byte>(new byte[1024]);
                var result = await socket.ReceiveAsync(buffer, CancellationToken.None);
                var str = Encoding.Default.GetString(buffer);
                Console.WriteLine(str);

                for (int i = 0; i < Clients.Count; i++)
                {
                    WebSocket client = Clients[i];

                    try
                    {
                        if (client.State == WebSocketState.Open)
                        {
                            
                            await client.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
                        }
                    }
                    catch (ObjectDisposedException)
                    {
                        Locker.EnterWriteLock();
                        try
                        {
                            Clients.Remove(client);
                            i--;
                        }
                        finally
                        {
                            Locker.ExitWriteLock();
                        }
                    }
                }
            }
        }

เช…เชจเซ‡ เชคเซ‡ เช•เชพเชฎ เช•เชฐเซเชฏเซเช‚. เชธเชฐเซเชตเชฐเซ‡ เชชเซ‹เชคเซ‡ เช•เชจเซ‡เช•เซเชถเชจ เช—เซ‹เช เชตเซเชฏเซเช‚ เช…เชจเซ‡ เชชเซเชฐเชคเชฟเชญเชพเชต เช•เซ€ เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ€. เชฎเชพเชฐเซ‡ SSL เชฆเซเชตเชพเชฐเชพ เชธเชฐเซเชตเชฐ เชจเซ‹เช‚เชงเชฃเซ€เชจเซ‡ เช…เชฒเช—เชฅเซ€ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชฟเชค เช•เชฐเชตเชพเชจเซ€ เชชเชฃ เชœเชฐเซ‚เชฐ เชจเชนเซ‹เชคเซ€; เชคเซ‡ เชชเซ‚เชฐเชคเซเช‚ เชนเชคเซเช‚ เช•เซ‡ เชธเชฟเชธเซเชŸเชฎ เชชเชพเชธเซ‡ เช†เชตเชถเซเชฏเช• เชชเซ‹เชฐเซเชŸ เชชเชฐ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชชเซเชฐเชฎเชพเชฃเชชเชคเซเชฐ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‡เชฒเซเช‚ เชนเชคเซเช‚.

เช‰เชชเช•เชฐเชฃ เชฌเชพเชœเซ เช…เชจเซ‡ เชธเชพเช‡เชŸ เชฌเชพเชœเซ เชชเชฐ, เชฌเซ‡ เช•เซเชฒเชพเชฏเชจเซเชŸเซเชธ เชธเช‚เชฆเซ‡เชถเชพเช“เชจเซ€ เช†เชชเชฒเซ‡ เช•เชฐเซ‡ เช›เซ‡, เช† เชฌเชงเซเช‚ เชฒเซ‹เช— เชฅเชฏเซ‡เชฒ เชนเชคเซเช‚. เชธเชฐเซเชตเชฐเชจเซ‡ เชงเซ€เชฎเซเช‚ เช•เชฐเชคเซเช‚ เช•เซ‹เชˆ เชตเชฟเชถเชพเชณ เชชเชพเชฐเซเชธเชฐเซเชธ เชจเชฅเซ€, เช†เชฎเชพเช‚เชฅเซ€ เช•เซ‹เชˆเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€. เชชเซเชฐเชคเชฟเชญเชพเชต เชธเชฎเชฏ 200ms เชฅเซ€ เช˜เชŸเซ€เชจเซ‡ 40-30ms เชฅเชฏเซ‹ เช›เซ‡. เช…เชจเซ‡ เชนเซเช‚ เชเช•เชฎเชพเชคเซเชฐ เชธเชพเชšเซ‹ เชจเชฟเชฐเซเชฃเชฏ เชชเชฐ เช†เชตเซเชฏเซ‹.

C# .Net เชซเซเชฐเซ‡เชฎเชตเชฐเซเช• เชชเชฐ เช†เชงเชพเชฐเชฟเชค เชเชกเชตเชพเชจเซเชธเซเชก เชธเชพเชฏเช•เชฒเชฟเช‚เช— เช…เชฅเชตเชพ เช•เซเชฒเชพเชฏเช‚เชŸ-เชธเชฐเซเชตเชฐ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ

Tcp เชชเชฐ เชตเชฐเซเชคเชฎเชพเชจ เชธเชฐเซเชตเชฐ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซ‡ เชซเซ‡เช‚เช•เซ€ เชฆเซ‹ เช…เชจเซ‡ Http เชนเซ‡เช เชณ เชฌเชงเซเช‚ เชซเชฐเซ€เชฅเซ€ เชฒเช–เซ‹. เชนเชตเซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชซเชฐเซ€เชฅเซ€ เชกเชฟเชเชพเช‡เชจ เชคเชฌเช•เซเช•เชพเชฎเชพเช‚ เช›เซ‡, เชชเชฐเช‚เชคเซ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพเชจเชพ เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เช…เชฒเช— เชธเชฟเชฆเซเชงเชพเช‚เชคเซ‹ เช…เชจเซเชธเชพเชฐ. เช‰เชชเช•เชฐเชฃเซ‹ เช…เชจเซ‡ เชธเชพเช‡เชŸเชจเซเช‚ เชธเช‚เชšเชพเชฒเชจ เชธเชฎเชจเซเชตเชฏเชฟเชค เช…เชจเซ‡ เชกเซ€เชฌเช— เชฅเชฏเซ‡เชฒ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‹ เชเช• เชธเชพเชฎเชพเชจเซเชฏ เช–เซเชฏเชพเชฒ เช›เซ‡, เชฎเชพเชคเซเชฐ เชเชŸเชฒเซ‹ เชœ เชคเชซเชพเชตเชค เช›เซ‡ เช•เซ‡ เช‰เชชเช•เชฐเชฃเซ‹ เชฎเชพเชŸเซ‡ HTML เชชเซƒเชทเซเช เซ‹ เชœเชจเชฐเซ‡เชŸ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€.

เชจเชฟเชทเซเช•เชฐเซเชท

"เชœเซ‹ เชคเชฎเซ‡ เชซเซ‹เชฐเซเชกเชจเซ‡ เชœเชพเชฃเชคเชพ เชจเชฅเซ€, เชคเซ‹ เชชเชพเชฃเซ€เชฎเชพเช‚ เชœเชถเซ‹ เชจเชนเซ€เช‚" เชฎเชจเซ‡ เชฒเชพเช—เซ‡ เช›เซ‡ เช•เซ‡ เช•เชพเชฎ เชถเชฐเซ‚ เช•เชฐเชคเชพ เชชเชนเซ‡เชฒเชพ, เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชตเชงเซ เชธเซเชชเชทเซเชŸ เชฐเซ€เชคเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เชงเซเชฏเซ‡เชฏเซ‹ เช…เชจเซ‡ เช‰เชฆเซเชฆเซ‡เชถเซเชฏเซ‹ เชนเซ‹เชตเชพ เชœเซ‹เชˆเช, เชคเซ‡เชฎเชœ เชตเชฟเชตเชฟเชง เช—เซเชฐเชพเชนเช•เซ‹ เชชเชฐ เชคเซ‡เชฎเชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เชคเช•เชจเซ€เช•เซ‹ เช…เชจเซ‡ เชชเชฆเซเชงเชคเชฟเช“เชจเซ‹ เช…เชญเซเชฏเชพเชธ เช•เชฐเชตเซ‹ เชœเซ‹เชˆเช. เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชชเซ‚เชฐเซเชฃเชคเชพเชจเซ‡ เช†เชฐเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เช•เชฆเชพเชš เชนเซเช‚ เช•เซ‡เชŸเชฒเซ€เช• เชตเชธเซเชคเซเช“เชจเซ‡ เชซเชฐเซ€เชฅเซ€ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชธเชพเชšเชตเซ€ เชคเซ‡ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเชตเชพ เชชเชพเช›เซ‹ เช†เชตเซ€เชถ. เชตเชฟเช•เชพเชธเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชนเซเช‚ เช˜เชฃเซเช‚ เชถเซ€เช–เซเชฏเซ‹ เช›เซเช‚, เชชเชฐเช‚เชคเซ เชญเชตเชฟเชทเซเชฏเชฎเชพเช‚ เชนเชœเซ€ เชชเชฃ เช˜เชฃเซเช‚ เชถเซ€เช–เชตเชพเชจเซเช‚ เช›เซ‡. เชœเซ‹ เชคเชฎเซ‡ เช†เชŸเชฒเซเช‚ เชตเชพเช‚เชšเซเชฏเซเช‚ เชนเซ‹เชฏ, เชคเซ‹ เช†เชฎ เช•เชฐเชตเชพ เชฌเชฆเชฒ เช†เชญเชพเชฐ.

เชธเซ‹เชฐเซเชธ: www.habr.com