ʻO ke kaʻa paikikala kiʻekiʻe a i ʻole ka noi mea kūʻai aku ma muli o ka C# .Net framework

komo

Ua hoʻomaka ia i ka manawa i manaʻo ai kekahi hoa hana e hana wau i kahi lawelawe pūnaewele liʻiliʻi. Ua manaʻo ʻia e like me Tinder, akā no ka lehulehu IT. He mea maʻalahi loa ka hana, hoʻopaʻa inoa ʻoe, hoʻopiha i kahi ʻaoʻao a neʻe i ke kumu nui, ʻo ia ka ʻimi ʻana i kahi kanaka e kamaʻilio ai a hoʻonui i kāu mau pilina a me nā kamaʻāina hou.

Eia ka'u e ho'i hope ai a e hai iki aku no'u iho, i maopopo ia'u ma keia mua aku ke kumu o ko'u hana ana pela i ka ulu ana.

I kēia manawa ke paʻa nei au i ke kūlana ʻo Technical Artist i hoʻokahi studio pāʻani, ua kūkulu ʻia koʻu ʻike papahana ma C # ma ke kākau ʻana i nā palapala a me nā pono hana no Unity a, ma kahi o kēia, e hana ana i nā plugins no ka hana haʻahaʻa me nā polokalamu Android. ʻAʻole wau i hele ma waho o kēia ao liʻiliʻi, a laila ua ala mai kahi manawa kūpono.

Mahele 1. Ka hoʻopololei ʻana i ka pahu

Ma hope o ka hoʻoholo ʻana i ke ʻano o kēia lawelawe, hoʻomaka wau e ʻimi i nā koho no ka hoʻokō. ʻO ka mea maʻalahi ka loaʻa ʻana o kahi ʻano hoʻonā i mākaukau, kahi e like me ka pueo ma ka honua, hiki ke huki ʻia kā mākou mechanics a hiki ke hōʻike ʻia nā mea āpau i ka hoʻopaʻapaʻa lehulehu.
Akā ʻaʻole hoihoi kēia, ʻaʻole wau i ʻike i kahi paʻakikī a i ʻole ka manaʻo i loko, a no laila ua hoʻomaka wau e aʻo i nā ʻenehana pūnaewele a me nā ʻano o ka launa pū ʻana me lākou.

Ua hoʻomaka wau e aʻo ma ka nānā ʻana i nā ʻatikala a me nā palapala ma C # .Net. Maʻaneʻi ua loaʻa iaʻu nā ala like ʻole e hoʻopau ai i ka hana. Nui nā hana no ka launa pū ʻana me ka pūnaewele, mai nā hoʻonā piha piha e like me ASP.Net a i ʻole nā ​​lawelawe Azure, e kuhikuhi i ka pilina me nā pilina TcpHttp.

Ma hope o kaʻu hoʻāʻo mua ʻana me ASP, ua hōʻole koke wau; i koʻu manaʻo, he hoʻoholo paʻakikī loa kēia no kā mākou lawelawe. ʻAʻole mākou e hoʻohana i ka hapakolu o nā mana o kēia kahua, no laila ua hoʻomau wau i kaʻu ʻimi. Aia ke koho ma waena o TCP a me Http client-server. Eia, ma Habré, ua ʻike au i kahi ʻatikala e pili ana server multithreaded, i ka hōʻiliʻili ʻana a hoʻāʻo ʻia, ua hoʻoholo wau e kālele pono i ka pilina me nā pilina TCP, no kekahi kumu ua manaʻo wau ʻaʻole e ʻae ʻo http iaʻu e hana i kahi hopena cross-platform.

ʻO ka ʻaoʻao mua o ke kikowaena ua hoʻopili ʻia ka hoʻopili pili, lawelawe ʻia nā ʻike palapala pūnaewele static, a me kahi waihona mea hoʻohana. A i ka hoʻomaka ʻana, ua hoʻoholo wau e kūkulu i nā hana no ka hana ʻana me ka pūnaewele, i hiki iaʻu ke hoʻohui i ka hoʻoili ʻana o ka noi ma Android a me iOS.

Eia kekahi code
ʻO ka pae nui e loaʻa ai nā mea kūʻai aku i kahi loop pau ʻole:

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

ʻO ka mea kūʻai aku iā ia iho:

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


A ʻo ka waihona mua i kūkulu ʻia ma SQL kūloko:
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}");
}
}
}
}
}


E like me kāu e ʻike ai, ʻokoʻa iki kēia mana mai ka mea ma ka ʻatikala. ʻO ka ʻoiaʻiʻo, ma aneʻi mākou i hoʻohui i ka hoʻouka ʻana i nā ʻaoʻao mai kahi waihona ma ka kamepiula a me kahi waihona (ʻo ia, ma ke ala, ʻaʻole i hana i kēia mana ma muli o ka hoʻolālā pili hewa).

Mokuna 2. Ka wili i na huila

Ma hope o ka hoʻāʻo ʻana i ke kikowaena, ua hiki iaʻu i ka hopena he hopena maikaʻi loa kēia (spoiler: ʻaʻole), no kā mākou lawelawe, no laila ua hoʻomaka ka papahana e loaʻa i ka loiloi.
I kēlā me kēia ʻanuʻu, ua hoʻomaka nā modula hou e ʻike ʻia a ua hoʻonui ʻia ka hana o ke kikowaena. Ua loaʻa i ke kikowaena kahi kikowaena hoʻāʻo a ssl hoʻopāʻālua pili.

ʻO kahi code hou aʻe e wehewehe ana i ka loiloi o ka server a me ka hoʻoili ʻana o ka mea kūʻai aku
He mana hou o ke kikowaena me ka hoʻohana ʻana i kahi palapala hōʻoia.

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

A he mea hoʻohana mea kūʻai hou me ka mana 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);
}

}
}


Akā no ka holo wale ʻana o ke kikowaena ma kahi pilina TCP, pono e hana i kahi module e hiki ke ʻike i ke ʻano o ka noi. Ua hoʻoholo wau e kūpono kahi parser ma ʻaneʻi e wāwahi i ka noi mai ka mea kūʻai aku i nā ʻāpana ʻokoʻa i hiki iaʻu ke launa pū i mea e hāʻawi ai i ka mea kūʻai aku i nā pane kūpono.

Parser

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


ʻO kāna kumu, ʻo ia ka wāwahi i ka noi i mau ʻāpana me ka hoʻohana ʻana i nā ʻōlelo maʻamau. Loaʻa iā mākou kahi leka mai ka mea kūʻai aku, koho i ka laina mua, aia i ke ʻano a me ka noi url. A laila heluhelu mākou i nā poʻomanaʻo, a mākou e hoʻokomo ai i kahi ʻano o ke ʻano HeaderName=Content, a ʻike pū mākou, inā loaʻa, nā ʻike e pili ana (e laʻa, querystring) a mākou e hoʻokomo ai i kahi ʻano like. Eia kekahi, ʻike ka parser inā ʻae ʻia ka mea kūʻai aku i kēia manawa a mālama i kāna ʻikepili. Loaʻa nā noi āpau mai nā mea kūʻai aku i kahi hash ʻae, i mālama ʻia i loko o nā kuki, mahalo i kēia hiki ke hoʻokaʻawale i ka loiloi hana hou no nā ʻano mea kūʻai ʻelua a hāʻawi iā lākou i nā pane pololei.

ʻAe, kahi hiʻohiʻona liʻiliʻi a maikaʻi e pono ke hoʻokomo ʻia i loko o kahi module kaʻawale, ka hoʻololi ʻana o nā nīnau e like me "site.com/@UserName" i loko o nā ʻaoʻao mea hoʻohana dynamically. Ma hope o ka hoʻoponopono ʻana i ka noi, hoʻokomo ʻia nā modula aʻe.

Mokuna 3. Hoʻokomo i ka huila hoʻokele, lubrication o ke kaulahao

Ke hoʻopau koke ka parser i kāna hana, hoʻomaka ka mea lawelawe, hāʻawi i nā ʻōlelo aʻo hou i ke kikowaena a hoʻokaʻawale i ka mana i ʻelua ʻāpana.

Mea lawelawe maʻalahi

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

ʻO kaʻoiaʻiʻo, hoʻokahi wale nō nānā no ka ʻae ʻana i ka mea hoʻohana, a laila hoʻomaka ka hana ʻana o ka noi.

Nā mea kūʻai aku
Inā ʻaʻole ʻae ʻia ka mea hoʻohana, a laila hoʻokumu ʻia ka hana no ia ma ka hōʻike ʻana i nā profiles mea hoʻohana a me ka puka hoʻopaʻa inoa ʻae. ʻIke like ke code no ka mea hoʻohana i ʻae ʻia, no laila ʻaʻole au i ʻike i ke kumu e hana kope ai.

Mea hoʻohana ʻae ʻole

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;

}

}

}
}


A ʻoiaʻiʻo, pono e loaʻa i ka mea hoʻohana kekahi ʻano o ka ʻaoʻao ʻaoʻao, no laila no nā pane aia ka module aʻe, nona ke kuleana no ka pane ʻana i nā noi waiwai.

Mea hooponopono

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


Akā i mea e hōʻike ai i ka mea hoʻohana i kāna ʻaoʻao a me nā ʻaoʻao o nā mea hoʻohana ʻē aʻe, ua hoʻoholo wau e hoʻohana iā RazorEngine, a i ʻole kekahi hapa o ia mea. Aia pū kekahi i ka hoʻoponopono ʻana i nā noi kūpono ʻole a me ka hoʻopuka ʻana i kahi code hewa kūpono.

Hoʻoponopono ʻo RazorController

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

A ʻoiaʻiʻo, no ka hōʻoia ʻana o nā mea hoʻohana i ʻae ʻia e hana, pono ka ʻae. Hoʻopili ka module ʻae me ka waihona. Hoʻopili ʻia ka ʻikepili i loaʻa mai nā palapala ma ka pūnaewele mai ka pōʻaiapili, mālama ʻia ka mea hoʻohana a ma ka hoʻihoʻi e loaʻa nā kuki a me ke komo ʻana i ka lawelawe.

Module mana

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


A eia ke ʻano o ka hoʻoili ʻikepili:

Database

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


A hana nā mea a pau e like me ka clockwork, ka ʻae a me ka hana hoʻopaʻa inoa, ʻo ka hana liʻiliʻi loa no ke komo ʻana i ka lawelawe aia i laila a ua hiki mai ka manawa e kākau ai i kahi noi a hoʻopaʻa i nā mea āpau me nā hana nui e hana ʻia ai nā mea āpau.

Mokuna 4. Kiola i ke kaʻa

No ka ho'ēmiʻana i nā koina hana no ke kākauʻana iʻelua mau noi no nā papahanaʻelua, ua hoʻoholo wau e hana i kahi cross-platform ma Xamarin.Forms. Eia hou, mahalo i ka mea aia ma C #. Ma hope o ka hana ʻana i kahi noi hoʻāʻo e hoʻouna wale i ka ʻikepili i ke kikowaena, ua loaʻa iaʻu kahi mea hoihoi. No kahi noi mai kahi mea hana, no ka leʻaleʻa, ua hoʻokō au iā ia ma HttpClient a hoʻouna iā ia i ka server HttpRequestMessage, aia nā ʻikepili mai ka palapala ʻae i ka format json. Me ka manaʻo ʻole i kekahi mea, ua wehe au i ka log server a ʻike wau i kahi noi mai ka hāmeʻa me nā ʻikepili āpau. ʻO kahi stupor liʻiliʻi, ʻike i nā mea a pau i hana ʻia i nā pule he 3 i hala iho nei i ke ahiahi ʻoluʻolu. No ka nānā ʻana i ka pololei o ka ʻikepili i hoʻouna ʻia, ua hōʻuluʻulu au i kahi kikowaena hoʻāʻo ma HttpListner. Ma hope o ka loaʻa ʻana o kahi noi ʻē aʻe ma luna, ua wehe au iā ia ma nā laina ʻelua o ke code a loaʻa iaʻu kahi KeyValuePair o ka ʻikepili mai ka palapala. Ua hōʻemi ʻia ka ʻimi ʻana i ʻelua laina.

Ua hoʻomaka wau e hoʻāʻo hou, ʻaʻole ia i haʻi ʻia ma mua, akā ma ka server mua ua hoʻokō wau i kahi kamaʻilio i kūkulu ʻia ma nā websockets. Ua hana maikaʻi loa ia, akā ʻo ke kumu o ka launa pū ʻana ma o Tcp he mea kaumaha; nui nā hana pono ʻole i hana ʻia i mea e kūkulu pono ai i ka launa pū ʻana o nā mea hoʻohana ʻelua me kahi log pili. Hoʻopili kēia i kahi noi e hoʻololi i ka pilina a hōʻiliʻili i kahi pane me ka hoʻohana ʻana i ka protocol RFC 6455. No laila, i ka server hoʻāʻo, ua hoʻoholo wau e hana i kahi pilina websocket maʻalahi. No ka leʻaleʻa wale.

Hoʻohui i ke kamaʻilio

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

A ua hana. Na ke kikowaena ponoi i hoʻonohonoho i ka pilina a hana i kahi kī pane. ʻAʻole pono wau e hoʻonohonoho kaʻawale i ka hoʻopaʻa inoa ʻana o ka server ma o SSL; ua lawa ka loaʻa ʻana o ka ʻōnaehana i kahi palapala i kau ʻia ma ke awa i koi ʻia.

Ma ka ʻaoʻao ʻaoʻao a ma ka ʻaoʻao pūnaewele, ua hoʻololi nā mea kūʻai aku ʻelua i nā leka, ua hoʻopaʻa ʻia kēia mau mea āpau. ʻAʻohe parser nui e hoʻolōʻihi i ke kikowaena, ʻaʻohe o kēia i koi ʻia. Ua emi ka manawa pane mai 200ms a i 40-30ms. A hiki iaʻu i ka hoʻoholo kūpono wale nō.

ʻO ke kaʻa paikikala kiʻekiʻe a i ʻole ka noi mea kūʻai aku ma muli o ka C# .Net framework

E kiola i ka hoʻokō kikowaena o kēia manawa ma Tcp a kākau hou i nā mea āpau ma lalo o Http. I kēia manawa aia ka papahana i ka hoʻolālā hou ʻana, akā e like me nā loina like ʻole o ka pilina. Hoʻonohonoho ʻia ka hana o nā mea hana a me ka pūnaewele a hoʻopau ʻia a loaʻa kahi manaʻo maʻamau, ʻo ka ʻokoʻa wale nō ʻaʻole pono e hana i nā ʻaoʻao HTML no nā polokalamu.

hopena

"Inā ʻaʻole ʻoe ʻike i ke ala, mai hele i ka wai" Manaʻo wau ma mua o ka hoʻomaka ʻana i ka hana, pono iaʻu e wehewehe i nā pahuhopu a me nā pahuhopu, a me ka hoʻopaʻa ʻana i ka noiʻi ʻana i nā ʻenehana pono a me nā ʻano hana no kā lākou hoʻokō ʻana i nā mea kūʻai aku. Ua kokoke e hoʻopau ka papahana, akā e hoʻi paha wau e kamaʻilio e pili ana i kaʻu hoʻopakele hou ʻana i kekahi mau mea. Ua aʻo nui au i ka wā o ka hoʻomohala ʻana, akā ʻoi aku ka nui o nā mea e aʻo ai i ka wā e hiki mai ana. Inā ua heluhelu ʻoe i kēia mamao, mahalo no ka hana ʻana pēlā.

Source: www.habr.com

E kūʻai i ka hoʻokipa hilinaʻi no nā pūnaewele me ka pale DDoS, nā kikowaena VPS VDS 🔥 E kūʻai i ka hoʻokipa pūnaewele hilinaʻi me ka pale DDoS, nā kikowaena VPS VDS | ProHoster