C# .Net เดซเตเดฐเต†เดฏเดฟเด‚เดตเตผเด•เตเด•เต เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟเดฏเตเดณเตเดณ เดตเดฟเดชเตเดฒเดฎเดพเดฏ เดธเตˆเด•เตเดฒเดฟเด‚เด—เต เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด•เตเดฒเดฏเดจเตเดฑเต-เดธเต†เตผเดตเตผ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป

เดŽเตปเดŸเตเดฐเดฟ

เด’เดฐเต เดšเต†เดฑเดฟเดฏ เดตเต†เดฌเต เดธเต‡เดตเดจเด‚ เด‰เดฃเตเดŸเดพเด•เตเด•เดพเตป เด’เดฐเต เดธเดนเดชเตเดฐเดตเตผเดคเตเดคเด•เตป เดจเดฟเตผเดฆเตเดฆเต‡เดถเดฟเดšเตเดšเดคเต‹เดŸเต†เดฏเดพเดฃเต เด‡เดคเต†เดฒเตเดฒเดพเด‚ เด†เดฐเด‚เดญเดฟเดšเตเดšเดคเต. เด‡เดคเต เด’เดฐเต เดŸเดฟเตปเดกเตผ เดชเต‹เดฒเต†เดฏเดพเดฏเดฟเดฐเดฟเด•เตเด•เดฃเด‚, เดชเด•เตเดทเต‡ เด’เดฐเต เดเดŸเดฟ เดนเดพเด‚เด—เตเด”เดŸเตเดŸเดฟเดจเดพเดฏเดฟ. เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เดตเดณเดฐเต† เดฒเดณเดฟเดคเดฎเดพเดฃเต, เดจเดฟเด™เตเด™เตพ เดฐเดœเดฟเดธเตเดฑเตเดฑเตผ เดšเต†เดฏเตเดฏเตเด•, เด’เดฐเต เดชเตเดฐเตŠเดซเตˆเตฝ เดชเต‚เดฐเดฟเดชเตเดชเดฟเดšเตเดšเต เดชเตเดฐเดงเดพเดจ เดชเต‹เดฏเดฟเดจเตเดฑเดฟเดฒเต‡เด•เตเด•เต เดจเต€เด™เตเด™เตเด•, เด…เดคเดพเดฏเดคเต, เด’เดฐเต เด‡เดจเตเดฑเตผเดฒเต‹เด•เตเด•เตเดŸเตเดŸเตผ เด•เดฃเตเดŸเต†เดคเตเดคเตเด•เดฏเตเด‚ เดจเดฟเด™เตเด™เดณเตเดŸเต† เด•เดฃเด•เตเดทเดจเตเด•เตพ เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดชเตเดคเดฟเดฏ เดชเดฐเดฟเดšเดฏเด•เตเด•เดพเดฐเต† เด‰เดฃเตเดŸเดพเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด•.

เด‡เดตเดฟเดŸเต† เดžเดพเตป เดตเตเดฏเดคเดฟเดšเดฒเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดŽเดจเตเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เด•เตเดฑเดšเตเดšเต เดชเดฑเดฏเตเด•เดฏเตเด‚ เดตเต‡เดฃเด‚, เด…เดคเตเดตเดดเดฟ เดžเดพเตป เดตเดฟเด•เดธเดจเดคเตเดคเดฟเตฝ เดŽเดจเตเดคเตเด•เตŠเดฃเตเดŸเดพเดฃเต เด…เดคเตเดคเดฐเด‚ เดจเดŸเดชเดŸเดฟเด•เตพ เดธเตเดตเต€เด•เดฐเดฟเดšเตเดšเดคเต†เดจเตเดจเต เดญเดพเดตเดฟเดฏเดฟเตฝ เด•เต‚เดŸเตเดคเตฝ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด‚.

เด‡เดชเตเดชเต‹เตพ เดžเดพเตป เด’เดฐเต เด—เต†เดฏเดฟเด‚ เดธเตเดฑเตเดฑเตเดกเดฟเดฏเต‹เดฏเดฟเตฝ เดŸเต†เด•เตโ€Œเดจเดฟเด•เตเด•เตฝ เด†เตผเดŸเตเดŸเดฟเดธเตโ€Œเดฑเตเดฑเดฟเดจเตเดฑเต† เดธเตเดฅเดพเดจเด‚ เดตเดนเดฟเด•เตเด•เตเดจเตเดจเต, เดŽเดจเตเดฑเต† เดธเดฟ# เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต เด…เดจเตเดญเดตเด‚ เดฏเตเดฃเดฟเดฑเตเดฑเดฟเดฏเตโ€Œเด•เตเด•เดพเดฏเดฟ เดธเตโ€Œเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เดณเตเด‚ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เดณเตเด‚ เดŽเดดเตเดคเตเดจเตเดจเดคเดฟเตฝ เดฎเดพเดคเตเดฐเด‚ เด…เดงเดฟเดทเตโ€Œเด เดฟเดคเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต†, เด†เตปเดกเตเดฐเต‹เดฏเดฟเดกเต เด‰เดชเด•เดฐเดฃเด™เตเด™เดณเดฟเตฝ เดคเดพเดดเตเดจเตเดจ เดจเดฟเดฒเดฏเดฟเดฒเตเดณเตเดณ เดœเต‹เดฒเดฟเด•เตพเด•เตเด•เดพเดฏเดฟ เดชเตเดฒเด—เดฟเดจเตเด•เตพ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเดจเตเดจเต. เดˆ เดฒเต‹เด•เดคเตเดคเดฟเดจเต เดชเตเดฑเดคเตเดคเต, เดžเดพเตป เด‡เดคเตเดตเดฐเต† เด…เดคเตเดคเดฐเดฎเตŠเดฐเต เด…เดตเดธเดฐเด‚ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเดคเตเดคเดฟเดŸเตเดŸเดฟเดฒเตเดฒ.

เดญเดพเด—เด‚ 1. เดซเตเดฐเต†เดฏเดฟเด‚ เดชเตเดฐเต‹เดŸเตเดŸเต‹เดŸเตˆเดชเตเดชเดฟเด‚เด—เต

เดˆ เดธเต‡เดตเดจเด‚ เดŽเด™เตเด™เดจเต†เดฏเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเดฎเต†เดจเตเดจเต เดคเต€เดฐเตเดฎเดพเดจเดฟเดšเตเดš เดถเต‡เดทเด‚, เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด“เดชเตเดทเดจเตเด•เตพ เดžเดพเตป เดจเต‹เด•เตเด•เดพเตป เดคเตเดŸเด™เตเด™เดฟ. เด’เดฐเตเดคเดฐเด‚ เดฑเต†เดกเดฟเดฎเต†เดฏเตเดกเต เดชเดฐเดฟเดนเดพเดฐเด‚ เด•เดฃเตเดŸเต†เดคเตเดคเตเด• เดŽเดจเตเดจเดคเดพเดฃเต เดเดฑเตเดฑเดตเตเด‚ เดŽเดณเตเดชเตเดชเดฎเตเดณเตเดณ เดฎเดพเตผเด—เด‚, เด…เดคเดฟเตฝ, เด’เดฐเต เดญเต‚เด—เต‹เดณเดคเตเดคเดฟเดฒเต† เด’เดฐเต เดฎเต‚เด™เตเด™เดฏเต†เดชเตเดชเต‹เดฒเต†, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดžเด™เตเด™เดณเตเดŸเต† เดฎเต†เด•เตเด•เดพเดจเดฟเด•เตเด•เตเด•เตพ เดตเดฒเดฟเดšเตเดšเต†เดฑเดฟเดฏเดพเดจเตเด‚ เดชเตŠเดคเตเดœเดจเดพเดญเดฟเดชเตเดฐเดพเดฏเดคเตเดคเดฟเดจเดพเดฏเดฟ เดŽเดฒเตเดฒเดพเด‚ เดจเดฟเดฐเดคเตเดคเดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚.
เดŽเดจเตเดจเดพเตฝ เด‡เดคเต เดฐเดธเด•เดฐเดฎเดฒเตเดฒ, เด‡เดคเดฟเตฝ เด’เดฐเต เดตเต†เดฒเตเดฒเตเดตเดฟเดณเดฟเดฏเตเด‚ เด…เตผเดคเตเดฅเดตเตเด‚ เดžเดพเตป เด•เดฃเตเดŸเดฟเดฒเตเดฒ, เด…เดคเดฟเดจเดพเตฝ เดžเดพเตป เดตเต†เดฌเต เดธเดพเด™เตเด•เต‡เดคเดฟเด•เดตเดฟเดฆเตเดฏเด•เดณเตเด‚ เด…เดตเดฐเตเดฎเดพเดฏเดฟ เด‡เดŸเดชเดดเด•เตเดจเตเดจ เดฐเต€เดคเดฟเด•เดณเตเด‚ เดชเด เดฟเด•เตเด•เดพเตป เดคเตเดŸเด™เตเด™เดฟ.

C # .Net-เดฒเต† เดฒเต‡เด–เดจเด™เตเด™เดณเตเด‚ เดกเต‹เด•เตเดฏเตเดฎเต†เดจเตเดฑเต‡เดทเดจเตเด•เดณเตเด‚ เด•เดฃเตเดŸเดพเดฃเต เดชเด เดจเด‚ เด†เดฐเด‚เดญเดฟเดšเตเดšเดคเต. เด‡เดตเดฟเดŸเต† เดžเดพเตป เดšเตเดฎเดคเดฒ เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เตเด•เดพเตป เดตเดฟเดตเดฟเดง เดฎเดพเตผเด—เด™เตเด™เตพ เด•เดฃเตเดŸเต†เดคเตเดคเดฟ. ASP.Net เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ Azure เดธเต‡เดตเดจเด™เตเด™เตพ เดชเต‹เดฒเต†เดฏเตเดณเตเดณ เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏ เดชเดฐเดฟเดนเดพเดฐเด™เตเด™เตพ เดฎเตเดคเตฝ TcpHttp เด•เดฃเด•เตเดทเดจเตเด•เดณเตเดฎเดพเดฏเตเดณเตเดณ เดจเต‡เดฐเดฟเดŸเตเดŸเตเดณเตเดณ เด‡เดŸเดชเต†เดŸเตฝ เดตเดฐเต† เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เตเดฎเดพเดฏเดฟ เดธเด‚เดตเดฆเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดจเดฟเดฐเดตเดงเดฟ เดธเด‚เดตเดฟเดงเดพเดจเด™เตเด™เดณเตเดฃเตเดŸเต.

เดŽเดŽเดธเตเดชเดฟเดฏเตเดฎเดพเดฏเดฟ เด†เดฆเตเดฏ เดถเตเดฐเดฎเด‚ เดจเดŸเดคเตเดคเดฟเดฏเดคเดฟเดจเดพเตฝ, เดžเดพเตป เด…เดคเต เด‰เดŸเตป เดฑเดฆเตเดฆเดพเด•เตเด•เดฟ, เดžเด™เตเด™เดณเตเดŸเต† เดธเต‡เดตเดจเดคเตเดคเดฟเดจเต เด‡เดคเต เดตเดณเดฐเต† เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเตเดณเตเดณ เดคเต€เดฐเตเดฎเดพเดจเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต. เดˆ เดชเตเดฒเดพเดฑเตเดฑเตโ€Œเดซเต‹เดฎเดฟเดจเตเดฑเต† เดถเต‡เดทเดฟเดฏเตเดŸเต† เดฎเต‚เดจเตเดจเดฟเดฒเตŠเดจเตเดจเต เดชเต‹เดฒเตเด‚ เดžเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดฟเดฒเตเดฒ, เด…เดคเดฟเดจเดพเตฝ เดžเดพเตป เดŽเดจเตเดฑเต† เดคเดฟเดฐเดฏเตฝ เดคเตเดŸเตผเดจเตเดจเต. เดŸเดฟเดธเดฟเดชเดฟ, เดŽเดšเตเดšเตเดŸเดฟเดŸเดฟเดชเดฟ เด•เตเดฒเดฏเดจเตเดฑเต-เดธเต†เตผเดตเตผ เดŽเดจเตเดจเดฟเดตเดฏเตเด•เตเด•เดฟเดŸเดฏเดฟเดฒเดพเดฃเต เดคเดฟเดฐเดžเตเดžเต†เดŸเตเดชเตเดชเต. เด‡เดตเดฟเดŸเต†, เดนเดฌเตเดฐเต†เดฏเดฟเตฝ, เด…เดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เด’เดฐเต เดฒเต‡เด–เดจเด‚ เดžเดพเตป เด•เดฃเตเดŸเต เดฎเตพเดŸเตเดŸเดฟเดคเตเดฐเต†เดกเต เดธเต†เตผเดตเตผ, เดถเต‡เด–เดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดค เดถเต‡เดทเด‚, เดŸเดฟเดธเดฟเดชเดฟ เด•เดฃเด•เตเดทเดจเตเด•เดณเตเดฎเดพเดฏเดฟ เด‡เดŸเดชเดดเด•เตเดจเตเดจเดคเดฟเตฝ เดถเตเดฐเดฆเตเดง เด•เต‡เดจเตเดฆเตเดฐเต€เด•เดฐเดฟเด•เตเด•เดพเตป เดžเดพเตป เดคเต€เดฐเตเดฎเดพเดจเดฟเดšเตเดšเต, เดšเดฟเดฒ เด•เดพเดฐเดฃเด™เตเด™เดณเดพเตฝ 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

เดธเต†เตผเดตเตผ เดชเดฐเดฟเดถเต‹เดงเดฟเดšเตเดš เดถเต‡เดทเด‚, เด‡เดคเต เด’เดฐเต เดฎเดฟเด•เดšเตเดš เดชเดฐเดฟเดนเดพเดฐเดฎเดพเด•เตเดฎเต†เดจเตเดจ เดจเดฟเด—เดฎเดจเดคเตเดคเดฟเตฝ เดžเดพเตป เดŽเดคเตเดคเดฟ (เดธเตโ€Œเดชเต‹เดฏเดฟเดฒเตผ: เด‡เดฒเตเดฒ), เดžเด™เตเด™เดณเตเดŸเต† เดธเต‡เดตเดจเดคเตเดคเดฟเดจเดพเดฏเดฟ, เด…เดคเดฟเดจเดพเตฝ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดฒเต‹เดœเดฟเด•เต เดธเตเดตเดจเตเดคเดฎเดพเด•เตเด•เดพเตป เดคเตเดŸเด™เตเด™เดฟ.
เด˜เดŸเตเดŸเด‚ เด˜เดŸเตเดŸเดฎเดพเดฏเดฟ, เดชเตเดคเดฟเดฏ เดฎเตŠเดกเตเดฏเต‚เดณเตเด•เตพ เดชเตเดฐเดคเตเดฏเด•เตเดทเดชเตเดชเต†เดŸเดพเตป เดคเตเดŸเด™เตเด™เดฟ, เดธเต†เตผเดตเดฑเดฟเดจเตเดฑเต† เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เดตเตผเดฆเตเดงเดฟเดšเตเดšเต. เดธเต†เตผเดตเดฑเดฟเดจเต เด’เดฐเต เดŸเต†เดธเตเดฑเตเดฑเต เดกเตŠเดฎเต†เดฏเตโ€Œเดจเตเด‚ ssl เด•เดฃเด•เตเดทเตป เดŽเตปเด•เตเดฐเดฟเดชเตเดทเดจเตเด‚ เดฒเดญเดฟเดšเตเดšเต.

เดธเต†เตผเดตเดฑเดฟเดจเตเดฑเต† เดฏเตเด•เตเดคเดฟเดฏเตเด‚ เด•เตเดฒเดฏเดจเตเดฑเตเด•เดณเตเดŸเต† เดชเตเดฐเต‹เดธเดธเตเดธเดฟเด‚เด—เตเด‚ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจ เด•เตเดฑเดšเตเดšเตเด•เต‚เดŸเดฟ เด•เต‹เดกเต
เด’เดฐเต เดธเตผเดŸเตเดŸเดฟเดซเดฟเด•เตเด•เดฑเตเดฑเดฟเดจเตเดฑเต† เด‰เดชเดฏเต‹เด—เด‚ เด‰เตพเดชเตเดชเต†เดŸเต† เดธเต†เตผเดตเดฑเดฟเดจเตเดฑเต† เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตโ€Œเดค เดชเดคเดฟเดชเตเดชเต.

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);
}

}
}

เดŽเดจเตเดจเดพเตฝ เดธเต†เตผเดตเตผ เด’เดฐเต เดŸเดฟเดธเดฟเดชเดฟ เด•เดฃเด•เตเดทเดจเดฟเตฝ เดฎเดพเดคเตเดฐเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเตฝ, เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดธเดจเตเดฆเตผเดญเด‚ เดคเดฟเดฐเดฟเดšเตเดšเดฑเดฟเดฏเดพเตป เด•เดดเดฟเดฏเตเดจเตเดจ เด’เดฐเต เดฎเตŠเดกเตเดฏเต‚เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเต เด†เดตเดถเตเดฏเดฎเดพเดฃเต. เด•เตเดฒเดฏเดจเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เด…เดญเตเดฏเตผเดคเตเดฅเดจเดฏเต† เดชเตเดฐเดคเตเดฏเต‡เด• เดญเดพเด—เด™เตเด™เดณเดพเดฏเดฟ เดตเดฟเดญเดœเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดชเดพเดดเตเดธเตผ เด‡เดตเดฟเดŸเต† เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเดฃเต†เดจเตเดจเต เดžเดพเตป เดคเต€เดฐเตเดฎเดพเดจเดฟเดšเตเดšเต, เด…เดคเต เด•เตเดฒเดฏเดจเตเดฑเดฟเดจเต เด†เดตเดถเตเดฏเดฎเดพเดฏ เด‰เดคเตเดคเดฐเด™เตเด™เตพ เดจเตฝเด•เตเดจเตเดจเดคเดฟเดจเต เดŽเดจเดฟเด•เตเด•เต เดธเด‚เดตเดฆเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚.

เดชเดพเตผเดธเตผ

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 = เด‰เดณเตเดณเดŸเด•เตเด•เด‚ เดŽเดจเตเดจ เดซเต‹เดฎเดฟเดจเตเดฑเต† เด’เดฐเต เดถเตเดฐเต‡เดฃเดฟเดฏเดฟเดฒเต‡เด•เตเด•เต เดจเดฏเดฟเด•เตเด•เตเด‚, เด•เต‚เดŸเดพเดคเต† เดžเด™เตเด™เตพ เดธเดฎเดพเดจเดฎเดพเดฏ เด…เดฑเต‡เดฏเดฟเดฒเต‡เด•เตเด•เต เดกเตเดฐเตˆเดตเต เดšเต†เดฏเตเดฏเตเดจเตเดจ เด…เดจเตเดฌเดจเตเดง เด‰เดณเตเดณเดŸเด•เตเด•เด‚ (เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด•เตเดตเดฑเดฟเดธเตเดŸเตเดฐเดฟเด‚เด—เต) เด•เดฃเตเดŸเต†เดคเตเดคเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เด•เต‚เดŸเดพเดคเต†, เดจเดฟเดฒเดตเดฟเดฒเต† เด•เตเดฒเดฏเดจเตเดฑเต เด…เด‚เด—เต€เด•เตƒเดคเดฎเดพเดฃเต‹ เดŽเดจเตเดจเต เดชเดพเดดเตโ€Œเดธเตผ เด•เดฃเตเดŸเต†เดคเตเดคเตเด•เดฏเตเด‚ เด…เดตเดจเตเดฑเต† เดกเดพเดฑเตเดฑ เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เด…เด‚เด—เต€เด•เตƒเดค เด•เตเดฒเดฏเดจเตเดฑเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดŽเดฒเตเดฒเดพ เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เดณเดฟเดฒเตเด‚ เด’เดฐเต เด…เด‚เด—เต€เด•เตƒเดค เดนเดพเดทเต เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเต เด•เตเด•เตเด•เดฟเด•เดณเดฟเตฝ เดธเด‚เดญเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เด‡เดคเดฟเดจเต เดจเดจเตเดฆเดฟ, เดฐเดฃเตเดŸเต เดคเดฐเด‚ เด•เตเดฒเดฏเดจเตเดฑเตเด•เตพเด•เตเด•เต เด•เต‚เดŸเตเดคเตฝ เดตเตผเด•เตเด•เต เดฒเต‹เดœเดฟเด•เต เดตเต‡เตผเดคเดฟเดฐเดฟเด•เตเด•เดพเดจเตเด‚ เด…เดตเตผเด•เตเด•เต เดถเดฐเดฟเดฏเดพเดฏ เด‰เดคเตเดคเดฐเด™เตเด™เตพ เดจเตฝเด•เดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚.

เดถเดฐเดฟ, "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-เตฝ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดฟ, json เดซเต‹เตผเดฎเดพเดฑเตเดฑเดฟเดฒเตเดณเตเดณ เด…เด‚เด—เต€เด•เดพเดฐ เดซเต‹เดฎเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดกเดพเดฑเตเดฑ เด…เดŸเด™เตเด™เตเดจเตเดจ HttpRequestMessage เดธเต†เตผเดตเดฑเดฟเตฝ เดŽเดฑเดฟเดžเตเดžเต. เดชเตเดฐเดคเตเดฏเต‡เด•เดฟเดšเตเดšเต เด’เดจเตเดจเตเด‚ เดชเตเดฐเดคเต€เด•เตเดทเดฟเด•เตเด•เดพเดคเต†, เดžเดพเตป เดธเต†เตผเดตเตผ เดฒเต‹เด—เต เดคเตเดฑเดจเตเดจเต เด…เดตเดฟเดŸเต†เดฏเตเดณเตเดณ เดŽเดฒเตเดฒเดพ เดกเดพเดฑเตเดฑเดฏเตเด‚ เด‰เดณเตเดณ เด‰เดชเด•เดฐเดฃเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดฐเต เด…เดญเตเดฏเตผเดคเตเดฅเดจ เด•เดฃเตเดŸเต. เดจเต‡เดฐเดฟเดฏ เดฎเดฏเด•เตเด•เด‚, เด•เดดเดฟเดžเตเดž 3 เด†เดดเตโ€Œเดšเด•เตพ เด•เตเดทเต€เดฃเดฟเดšเตเดš เดธเดพเดฏเดพเดนเตเดจเดคเตเดคเดฟเตฝ เดšเต†เดฏเตโ€Œเดค เดŽเดฒเตเดฒเดพ เด•เดพเดฐเตเดฏเด™เตเด™เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเด‚ เด…เดตเดฌเต‹เดงเด‚. เด…เดฏเดšเตเดš เดกเดพเดฑเตเดฑเดฏเตเดŸเต† เด•เตƒเดคเตเดฏเดค เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเตป, เดžเดพเตป HttpListner-เตฝ เด’เดฐเต เดŸเต†เดธเตเดฑเตเดฑเต เดธเต†เตผเดตเตผ เด…เดธเด‚เดฌเดฟเตพ เดšเต†เดฏเตเดคเต. เด…เดคเดฟเตฝ เด‡เดคเดฟเดจเด•เด‚ เดคเดจเตเดจเต† เด…เดŸเตเดคเตเดค เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดฒเดญเดฟเดšเตเดšเดคเดฟเดจเดพเตฝ, เดžเดพเตป เด…เดคเต เดฐเดฃเตเดŸเต เดตเดฐเดฟ เด•เต‹เดกเตเด•เดณเดพเดฏเดฟ เดฎเดพเดฑเตเดฑเดฟ, เดซเต‹เดฎเดฟเตฝ เดจเดฟเดจเตเดจเต KeyValuePair เดกเดพเดฑเตเดฑ เดฒเดญเดฟเดšเตเดšเต. เด…เดจเตเดตเต‡เดทเดฃ เดชเดพเดดเตโ€Œเดธเดฟเด‚เด—เต เดฐเดฃเตเดŸเต เดตเดฐเดฟเด•เดณเดพเดฏเดฟ เดšเตเดฐเตเด•เตเด•เดฟ.

เดžเดพเตป เด•เต‚เดŸเตเดคเตฝ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เดพเตป เดคเตเดŸเด™เตเด™เดฟ, เด‡เดคเต เดฎเตเดฎเตเดชเต เดธเต‚เดšเดฟเดชเตเดชเดฟเดšเตเดšเดฟเดŸเตเดŸเดฟเดฒเตเดฒ, เดŽเดจเตเดจเดพเตฝ เดฎเตเดฎเตเดชเดคเตเดคเต† เดธเต†เตผเดตเดฑเดฟเตฝ เดžเดพเตป เด‡เดชเตเดชเต‹เดดเตเด‚ เดตเต†เดฌเตโ€Œเดธเต‹เด•เตเด•เดฑเตเดฑเตเด•เดณเดฟเตฝ เดจเดฟเตผเดฎเตเดฎเดฟเดšเตเดš เด’เดฐเต เดšเดพเดฑเตเดฑเต เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดฟ. เด‡เดคเต เดตเดณเดฐเต† เดจเดจเตเดจเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดšเตเดšเต, เดชเด•เตเดทเต‡ 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