C# .Net เจซเจฐเฉ‡เจฎเจตเจฐเจ• 'เจคเฉ‡ เจ†เจงเจพเจฐเจฟเจค เจเจกเจตเจพเจ‚เจธเจก เจธเจพเจˆเจ•เจฒเจฟเฉฐเจ— เจœเจพเจ‚ เจ•เจฒเจพเจ‡เฉฐเจŸ-เจธเจฐเจตเจฐ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ

เจ‡เฉฐเจฆเจฐเจพเจœเจผ

เจ‡เจน เจธเจญ เจ‰เจฆเฉ‹เจ‚ เจธเจผเฉเจฐเฉ‚ เจนเฉ‹เจ‡เจ† เจœเจฆเฉ‹เจ‚ เจ‡เฉฑเจ• เจธเจนเจฟเจ•เจฐเจฎเฉ€ เจจเฉ‡ เจธเฉเจเจพเจ… เจฆเจฟเฉฑเจคเจพ เจ•เจฟ เจฎเฉˆเจ‚ เจ‡เฉฑเจ• เจ›เฉ‹เจŸเฉ€ เจตเฉˆเจฌ เจธเฉ‡เจตเจพ เจฌเจฃเจพเจตเจพเจ‚. เจ‡เจน เจŸเจฟเฉฐเจกเจฐ เจตเจฐเจ—เจพ เจ•เฉเจ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจธเฉ€, เจชเจฐ เจ†เจˆเจŸเฉ€ เจญเฉ€เฉœ เจฒเจˆ. เจ•เจพเจฐเจœเจ•เฉเจธเจผเจฒเจคเจพ เจฌเจนเฉเจค เจนเฉ€ เจธเจงเจพเจฐเจจ เจนเฉˆ, เจคเฉเจธเฉ€เจ‚ เจฐเจœเจฟเจธเจŸเจฐ เจ•เจฐเฉ‹, เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจซเจพเจˆเจฒ เจญเจฐเฉ‹ เจ…เจคเฉ‡ เจฎเฉเฉฑเจ– เจฌเจฟเฉฐเจฆเฉ‚ 'เจคเฉ‡ เจ…เฉฑเจ—เฉ‡ เจตเจงเฉ‹, เจ…เจฐเจฅเจพเจค เจ—เฉฑเจฒ เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจตเจฟเจ…เจ•เจคเฉ€ เจจเฉ‚เฉฐ เจฒเฉฑเจญเจฃเจพ เจ…เจคเฉ‡ เจ†เจชเจฃเฉ‡ เจ•เจจเฉˆเจ•เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจตเจงเจพเจ‰เจฃเจพ เจ…เจคเฉ‡ เจจเจตเฉ‡เจ‚ เจœเจพเจฃเฉ‚ เจฌเจฃเจพเจ‰เจฃเจพเฅค

เจ‡เฉฑเจฅเฉ‡ เจฎเฉˆเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจชเจฟเฉฑเจ›เฉ‡ เจนเจŸเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ†เจชเจฃเฉ‡ เจฌเจพเจฐเฉ‡ เจฅเฉ‹เฉœเจพ เจœเจฟเจนเจพ เจฆเฉฑเจธเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ, เจคเจพเจ‚ เจœเฉ‹ เจญเจตเจฟเฉฑเจ– เจตเจฟเฉฑเจš เจ‡เจน เจธเจชเฉฑเจธเจผเจŸ เจนเฉ‹ เจธเจ•เฉ‡ เจ•เจฟ เจฎเฉˆเจ‚ เจตเจฟเจ•เจพเจธ เจตเจฟเฉฑเจš เจ…เจœเจฟเจนเฉ‡ เจ•เจฆเจฎ เจ•เจฟเจ‰เจ‚ เจšเฉเฉฑเจ•เฉ‡ เจนเจจเฅค

เจ‡เจธ เจธเจฎเฉ‡เจ‚ เจฎเฉ‡เจฐเฉ‡ เจ•เฉ‹เจฒ เจ‡เฉฑเจ• เจ—เฉ‡เจฎ เจธเจŸเฉ‚เจกเฉ€เจ“ เจตเจฟเฉฑเจš เจคเจ•เจจเฉ€เจ•เฉ€ เจ•เจฒเจพเจ•เจพเจฐ เจฆเฉ€ เจธเจฅเจฟเจคเฉ€ เจนเฉˆ, C# เจตเจฟเฉฑเจš เจฎเฉ‡เจฐเจพ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ— เจคเจœเจฐเจฌเจพ เจธเจฟเจฐเจซ เจเจ•เจคเจพ เจฒเจˆ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจ…เจคเฉ‡ เจ‰เจชเจฏเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจฟเจ–เจฃ 'เจคเฉ‡ เจฌเจฃเจพเจ‡เจ† เจ—เจฟเจ† เจธเฉ€ เจ…เจคเฉ‡ เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจเจ‚เจกเจฐเฉŒเจ‡เจก เจกเจฟเจตเจพเจˆเจธเจพเจ‚ เจจเจพเจฒ เจนเฉ‡เจ เจฒเฉ‡-เจชเฉฑเจงเจฐ เจฆเฉ‡ เจ•เฉฐเจฎ เจฒเจˆ เจชเจฒเฉฑเจ—เจ‡เจจ เจฌเจฃเจพเจ‰เจฃเจพ. เจฎเฉˆเจ‚ เจ…เจœเฉ‡ เจ‡เจธ เจจเจฟเฉฑเจ•เฉ€ เจœเจฟเจนเฉ€ เจฆเฉเจจเฉ€เจ†เจ‚ เจคเฉ‹เจ‚ เจ…เฉฑเจ—เฉ‡ เจจเจฟเจ•เจฒเจฟเจ† เจจเจนเฉ€เจ‚ เจธเฉ€ เจ•เจฟ เจ…เจœเจฟเจนเจพ เจฎเฉŒเจ•เจพ เจ† เจ—เจฟเจ†เฅค

เจญเจพเจ— 1. เจซเจฐเฉ‡เจฎ เจชเฉเจฐเฉ‹เจŸเฉ‹เจŸเจพเจˆเจชเจฟเฉฐเจ—

เจ‡เจน เจซเฉˆเจธเจฒเจพ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจ•เจฟ เจ‡เจน เจธเฉ‡เจตเจพ เจ•เจฟเจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเฉ€ เจนเฉ‹เจตเฉ‡เจ—เฉ€, เจฎเฉˆเจ‚ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฒเจˆ เจตเจฟเจ•เจฒเจชเจพเจ‚ เจฆเฉ€ เจ–เฉ‹เจœ เจ•เจฐเจจเฉ€ เจธเจผเฉเจฐเฉ‚ เจ•เจฐ เจฆเจฟเฉฑเจคเฉ€เฅค เจธเจญ เจคเฉ‹เจ‚ เจ†เจธเจพเจจ เจ—เฉฑเจฒ เจ‡เจน เจนเฉ‹เจตเฉ‡เจ—เฉ€ เจ•เจฟ เจ•เฉ‹เจˆ เจ…เจœเจฟเจนเจพ เจคเจฟเจ†เจฐ-เจฌเจฐ-เจคเจฟเจ†เจฐ เจนเฉฑเจฒ เจฒเฉฑเจญ เจฒเจฟเจ† เจœเจพเจตเฉ‡, เจœเจฟเจธ เจฆเฉ‡ เจ†เจงเจพเจฐ 'เจคเฉ‡ เจ—เจฒเฉ‹เจฌ 'เจคเฉ‡ เจ‰เฉฑเจฒเฉ‚ เจตเจพเจ‚เจ— เจธเจพเจกเฉ‡ เจฎเจ•เฉˆเจจเจฟเจ•เจพเจ‚ เจจเฉ‚เฉฐ เจ–เจฟเฉฑเจšเจฟเจ† เจœเจพ เจธเจ•เฉ‡ เจ…เจคเฉ‡ เจธเจพเจฐเฉ€ เจ—เฉฑเจฒ เจจเฉ‚เฉฐ เจœเจจเจคเจ• เจจเจฟเฉฐเจฆเจฟเจ† เจฆเจพ เจธเจพเจนเจฎเจฃเจพ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เฉ‡เฅค
เจชเจฐ เจ‡เจน เจฆเจฟเจฒเจšเจธเจช เจจเจนเฉ€เจ‚ เจนเฉˆ, เจฎเฉˆเจจเฉ‚เฉฐ เจ‡เจธ เจตเจฟเฉฑเจš เจ•เฉ‹เจˆ เจšเฉเจฃเฉŒเจคเฉ€ เจœเจพเจ‚ เจญเจพเจตเจจเจพ เจจเจนเฉ€เจ‚ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฑเจคเฉ€, เจ…เจคเฉ‡ เจ‡เจธเจฒเจˆ เจฎเฉˆเจ‚ เจตเฉˆเจฌ เจคเจ•เจจเจพเจฒเฉ‹เจœเฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจจเจพเจฒ เจ—เฉฑเจฒเจฌเจพเจค เจ•เจฐเจจ เจฆเฉ‡ เจคเจฐเฉ€เจ•เจฟเจ†เจ‚ เจฆเจพ เจ…เจงเจฟเจเจจ เจ•เจฐเจจเจพ เจธเจผเฉเจฐเฉ‚ เจ•เฉ€เจคเจพเฅค

เจฎเฉˆเจ‚ C# .Net 'เจคเฉ‡ เจฒเฉ‡เจ–เจพเจ‚ เจ…เจคเฉ‡ เจฆเจธเจคเจพเจตเฉ‡เจœเจผเจพเจ‚ เจจเฉ‚เฉฐ เจฆเฉ‡เจ– เจ•เฉ‡ เจ…เจงเจฟเจเจจ เจ•เจฐเจจเจพ เจธเจผเฉเจฐเฉ‚ เจ•เฉ€เจคเจพเฅค เจ‡เฉฑเจฅเฉ‡ เจฎเฉˆเจจเฉ‚เฉฐ เจ•เฉฐเจฎ เจจเฉ‚เฉฐ เจชเฉ‚เจฐเจพ เจ•เจฐเจจ เจฆเฉ‡ เจ•เจˆ เจคเจฐเฉ€เจ•เฉ‡ เจฎเจฟเจฒเฉ‡เฅค ASP.Net เจœเจพเจ‚ Azure เจธเฉ‡เจตเจพเจตเจพเจ‚ เจตเจฐเจ—เฉ‡ เจธเฉฐเจชเฉ‚เจฐเจจ เจนเฉฑเจฒเจพเจ‚ เจคเฉ‹เจ‚ เจฒเฉˆ เจ•เฉ‡, TcpHttp เจ•เจจเฉˆเจ•เจธเจผเจจเจพเจ‚ เจจเจพเจฒ เจธเจฟเฉฑเจงเฉ€ เจ—เฉฑเจฒเจฌเจพเจค เจ•เจฐเจจ เจฒเจˆ, เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจจเจพเจฒ เจ‡เฉฐเจŸเจฐเฉˆเจ•เจŸ เจ•เจฐเจจ เจฒเจˆ เจฌเจนเฉเจค เจธเจพเจฐเฉ€เจ†เจ‚ เจตเจฟเจงเฉ€เจ†เจ‚ เจนเจจเฅค

ASP เจจเจพเจฒ เจฎเฉ‡เจฐเฉ€ เจชเจนเจฟเจฒเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจฎเฉˆเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจคเฉเจฐเฉฐเจค เจฐเฉฑเจฆ เจ•เจฐ เจฆเจฟเฉฑเจคเจพ; เจฎเฉ‡เจฐเฉ€ เจฐเจพเจ เจตเจฟเฉฑเจš, เจ‡เจน เจธเจพเจกเฉ€ เจธเฉ‡เจตเจพ เจฒเจˆ เจฌเจนเฉเจค เจฎเฉเจธเจผเจ•เจฒ เจซเฉˆเจธเจฒเจพ เจธเฉ€เฅค เจ…เจธเฉ€เจ‚ เจ‡เจธ เจชเจฒเฉ‡เจŸเจซเจพเจฐเจฎ เจฆเฉ€เจ†เจ‚ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจฆเจพ เจคเฉ€เจœเจพ เจนเจฟเฉฑเจธเจพ เจตเฉ€ เจจเจนเฉ€เจ‚ เจตเจฐเจคเจพเจ‚เจ—เฉ‡, เจ‡เจธ เจฒเจˆ เจฎเฉˆเจ‚ เจ†เจชเจฃเฉ€ เจ–เฉ‹เจœ เจœเจพเจฐเฉ€ เจฐเฉฑเจ–เฉ€เฅค เจšเฉ‹เจฃ TCP เจ…เจคเฉ‡ Http เจ•เจฒเจพเจ‡เฉฐเจŸ-เจธเจฐเจตเจฐ เจตเจฟเจšเจ•เจพเจฐ เจธเฉ€เฅค เจ‡เฉฑเจฅเฉ‡, Habrรฉ 'เจคเฉ‡, เจฎเฉˆเจจเฉ‚เฉฐ เจฌเจพเจฐเฉ‡ เจ‡เฉฑเจ• เจฒเฉ‡เจ– เจญเจฐ เจตเจฟเฉฑเจš เจ†เจ‡เจ† เจธเฉ€ เจฎเจฒเจŸเฉ€เจฅเฉเจฐเฉˆเจกเจก เจธเจฐเจตเจฐ, เจ‡เจธ เจจเฉ‚เฉฐ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจจ เจ…เจคเฉ‡ เจŸเฉˆเจธเจŸ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจฎเฉˆเจ‚ เจ–เจพเจธ เจคเฉŒเจฐ 'เจคเฉ‡ TCP เจ•เจจเฉˆเจ•เจธเจผเจจเจพเจ‚ เจจเจพเจฒ เจ—เฉฑเจฒเจฌเจพเจค เจ•เจฐเจจ 'เจคเฉ‡ เจงเจฟเจ†เจจ เจ•เฉ‡เจ‚เจฆเจฐเจฟเจค เจ•เจฐเจจ เจฆเจพ เจซเฉˆเจธเจฒเจพ เจ•เฉ€เจคเจพ, เจ•เจฟเจธเฉ‡ เจ•เจพเจฐเจจ เจ•เจฐเจ•เฉ‡ เจฎเฉˆเจ‚ เจธเฉ‹เจšเจฟเจ† เจ•เจฟ http เจฎเฉˆเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจ•เจฐเจพเจธ-เจชเจฒเฉ‡เจŸเจซเจพเจฐเจฎ เจนเฉฑเจฒ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจจเจนเฉ€เจ‚ เจฆเฉ‡เจตเฉ‡เจ—เจพ.

เจธเจฐเจตเจฐ เจฆเฉ‡ เจชเจนเจฟเจฒเฉ‡ เจธเฉฐเจธเจ•เจฐเจฃ เจตเจฟเฉฑเจš เจ•เจจเฉˆเจ•เจธเจผเจจ เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฟเฉฐเจ—, เจธเจฅเจฟเจฐ เจตเฉˆเจฌ เจชเฉ‡เจœ เจฆเฉ€ เจธเจฎเจ—เจฐเฉ€ เจฆเฉ€ เจธเฉ‡เจตเจพ, เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจธเจผเจพเจฎเจฒ เจธเฉ€เฅค เจ…เจคเฉ‡ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจจ เจฒเจˆ, เจฎเฉˆเจ‚ เจธเจพเจˆเจŸ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ เจ•เจพเจฐเจœเจ•เฉเจธเจผเจฒเจคเจพ เจฌเจฃเจพเจ‰เจฃ เจฆเจพ เจซเฉˆเจธเจฒเจพ เจ•เฉ€เจคเจพ, เจคเจพเจ‚ เจœเฉ‹ เจฎเฉˆเจ‚ เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš เจเจ‚เจกเจฐเฉŒเจ‡เจก เจ…เจคเฉ‡ เจ†เจˆเจ“เจเจธ 'เจคเฉ‡ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจœเฉ‹เฉœ เจธเจ•เจพเจ‚เฅค

เจ‡เฉฑเจฅเฉ‡ เจ•เฉเจ เจ•เฉ‹เจก เจนเฉˆ
เจ‡เฉฑเจ• เจฌเฉ‡เจ…เฉฐเจค เจฒเฉ‚เจช เจตเจฟเฉฑเจš เจ—เจพเจนเจ•เจพเจ‚ เจจเฉ‚เฉฐ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจตเจพเจฒเจพ เจฎเฉเฉฑเจ– เจฅเฉเจฐเฉˆเจก:

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

}
}

เจชเจฐ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจธเจฐเจตเจฐ เจธเจฟเจฐเจซเจผ เจ‡เฉฑเจ• 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 'เจคเฉ‡ เจ‡เฉฑเจ• เจŸเฉˆเจธเจŸ เจธเจฐเจตเจฐ เจจเฉ‚เฉฐ เจ‡เจ•เฉฑเจ เจพ เจ•เฉ€เจคเจพเฅค เจ‡เจธ 'เจคเฉ‡ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจฌเฉ‡เจจเจคเฉ€ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจฎเฉˆเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจ•เฉ‹เจก เจฆเฉ€เจ†เจ‚ เจ•เฉเจ เจฒเจพเจˆเจจเจพเจ‚ เจตเจฟเฉฑเจš เจตเฉฑเจ– เจ•เจฐ เจฒเจฟเจ† เจ…เจคเฉ‡ เจซเจพเจฐเจฎ เจคเฉ‹เจ‚ เจกเฉ‡เจŸเจพ เจฆเจพ เจ‡เฉฑเจ• 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