Baaskiil heer sare ah ama codsi adeegaha macmiilka oo ku salaysan qaabka C # .Net

entry

Dhammaantood waxay bilaabeen markii saaxiibkii ii soo jeediyay inaan sameeyo adeeg yar oo shabakad ah. Waxay ahayd inay noqoto wax sida tinder, laakiin loogu talagalay hangout IT. Shaqayntu gabi ahaanba waa sahlan tahay, waad is diiwaan gelisaa, buuxisaa profile oo u gudub meesha ugu muhiimsan, taas oo ah, helitaanka interlocutor iyo ballaarinta isku xirkaaga iyo samaynta isbarasho cusub.

Halkan waa in aan hoos u dhigaa oo aan wax yar ka sheegaa nafteyda, si mustaqbalka ay u cadaato sababta aan u qaaday tallaabooyinkan horumarinta.

Waqtigan xaadirka ah waxaan hayaa booska Farshaxanka Farsamada ee istuudiyaha ciyaarta, waayo-aragnimadayda barnaamijka C # waxay ku saleysan tahay oo keliya qorista qoraallada iyo adeegyada Midnimada iyo, marka lagu daro tan, abuurista plugins ee shaqada heerka hoose ee aaladaha android. Dunidan dibaddeeda, weli maan dooran ka dibna fursadan oo kale maan dooran.

Qaybta 1. Qaab-dhismeedka

Markii aan go'aansaday sida adeeggani noqon doono, waxaan bilaabay inaan raadiyo ikhtiyaarka hirgelinta. Habka ugu fudud ayaa noqon doona in la helo nooc ka mid ah xal diyaarsan, kaas oo, sida guumays globe ah, aad jiidi karto makaanikadayada oo aad wax walba u dejiso cayda dadweynaha.
Laakiin tani maaha mid xiiso leh, ma aanan arkin wax caqabad ah iyo dareenka tan, sidaas darteed waxaan bilaabay inaan barto tignoolajiyada shabakada iyo hababka la falgalka iyaga.

Daraasaddu waxay ku bilaabatay daawashada maqaallada iyo dukumeentiyada C # .Net. Halkan waxaan ka helay habab kala duwan oo aan hawsha ku gudan karo. Waxaa jira habab badan oo lagula macaamilayo shabakada, laga bilaabo xalal buuxa sida adeegyada ASP.Net ama Azure, si toos ah ula falgalka isku xirka TcpHttp.

Markii aan isku daygii ugu horreeyay la sameeyay ASP, isla markiiba waan joojiyay, fikradayda waxay ahayd mid aad ugu adag go'aanka adeeggayaga. Ma isticmaali doono xitaa seddex meelood meel awoodaha goobtan, sidaas darteed waxaan sii waday raadintayda. Doorashadu waxay kacday TCP iyo Http macmiilka-server. Halkan, HabrΓ©, waxaan la kulmay maqaal ku saabsan server-ka badan, Markii aan aruuriyay oo aan tijaabiyay, waxaan go'aansaday in aan diirada saaro la falgalka isku xirka TCP, sabab qaar ka mid ah waxaan u maleeyay in http aysan ii ogolaan doonin inaan abuuro xal iskutallaab ah.

Nuqulkii ugu horreeyay ee serferka waxa ka mid ahaa maaraynta isku xidhka, u adeegida waxa ku jira bogga mareegaha, iyo ay ku jirto xogta macluumaadka isticmaalaha. Bilawga, waxaan go'aansaday in aan dhiso hawlwadeenka la shaqaynta goobta, si aan hadhow ugu xidho codsiga codsiga ee android iyo macruufka halkan.

Waa kan kood
Dufanka ugu weyn ee aqbala macaamiisha sidde aan dhammaad lahayn:

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

Maamulaha macmiilka laftiisa:

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

Iyo keydkii ugu horreeyay ee lagu dhisay SQL maxalliga ah:

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

Sida aad arki karto, noocani wax yar ayuu kaga duwan yahay kan maqaalka. Dhab ahaantii, kaliya rarista boggaga gal kombuyuutarka iyo xogta xogta ayaa halkan lagu daray (taas oo, habka, ma shaqeynin noocaan, sababtoo ah qaabka isku xirka khaldan).

Cutubka 2aad

Kadib markii aan tijaabiyay server-ka, waxaan imid gabagabada in tani ay noqon doonto xal weyn (qaswade: maya), adeeggayaga, sidaas darteed mashruucu wuxuu bilaabay inuu helo caqli-gal.
Tallaabo tallaabo ah, cutubyo cusub ayaa billaabay inay soo baxaan, waxaana koray shaqada server-ka. Seerfarku waxa uu helay xayndaab tijaabo ah iyo isku xidhka ssl.

Wax yar oo kood ah oo qeexaya macquulnimada server-ka iyo habaynta macaamiisha
Nuqulka serverka oo la cusboonaysiiyay, oo ay ku jirto isticmaalka shahaado.

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

Iyo sidoo kale maamule cusub oo macmiil ah oo ogolaansho ka haysta 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);
}

}
}

Laakiin maadaama adeeguhu uu si gaar ah ugu shaqeeyo xidhiidhka TCP, waa lagama maarmaan in la abuuro cutub aqoonsan kara macnaha codsiga. Waxaan go'aansaday in parser ku haboon yahay halkan kaas oo jebin doona codsiga macmiilka qaybo kala duwan oo aan la falgeli karo si aan u siiyo macmiilka jawaabaha lagama maarmaanka ah.

falanqeeye

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

Nuxurkeedu wuxuu ku jiraa xaqiiqda ah in iyadoo la kaashanayo tibaaxaha caadiga ah si loo jebiyo codsiga qaybo ka mid ah. Waxaan fariin ka helnaa macmiilka, dooro khadka ugu horeeya, kaas oo ka kooban habka iyo codsi url. Kadibna waxaanu akhrinay madax-madaxeedyada, kuwaas oo aanu ku dhex galno qaabka HeaderName = Content, sidoo kale waxaan helnaa, haddii ay jiraan, nuxurka la socda (tusaale, querystring) kaas oo aan sidoo kale u galno array la mid ah. Intaa waxaa dheer, baareeyaha ayaa ogaanaya haddii macmiilka hadda la oggol yahay oo uu kaydiyo xogtiisa. Dhammaan codsiyada macaamiisha la oggolaaday waxay ka kooban yihiin xashiish oggolaansho, kaas oo lagu kaydiyo cookies, taas oo ay ugu mahadcelinayaan taas oo ay suurtagal tahay in la kala saaro caqli-gal shaqo oo dheeraad ah oo loogu talagalay laba nooc oo macaamiisha ah oo la siiyo jawaabaha saxda ah.

Hagaag, sifo yar oo wanaagsan oo loo raro qayb gaar ah, una beddeleysa codsiyada sida "site.com/@UserName" bogag isticmaale oo firfircooni leh. Ka dib habaynta codsiga, qaybaha soo socda ayaa soo galaya ciyaarta.

Cutubka 3. Ku rakibida birta gacanta, saliidaynta silsiladda

Isla marka uu falanqeeyaha dhammeeyo, maamulaha ayaa soo galaya ciyaarta, isaga oo siinaya tilmaamo dheeraad ah server-ka oo u qaybinaya xakamaynta laba qaybood.

fududeeye

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

Dhab ahaantii, waxaa jira hal jeeg oo kaliya oo loogu talagalay oggolaanshaha isticmaalaha, ka dib markaa ka baaraandegida codsiga ayaa bilaabmaya.

Xakamaynta macaamiisha
Haddii isticmaaluhu aan la oggolayn, markaa isaga shaqadiisa waxay ku saleysan tahay oo keliya bandhigga profiles user iyo daaqada diiwaangelinta oggolaanshaha. Koodhka isticmaale idman waxa uu u eeg yahay isku mid, markaa ma arko sabab aan ku koobiyo.

Isticmaale aan la fasaxin

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;

}

}

}
}

Dabcan, isticmaaluhu waa inuu helaa qaar ka mid ah boggaga, markaa jawaabaha waxaa jira cutubka soo socda, kaas oo mas'uul ka ah ka jawaabista codsiga kheyraadka.

Maamule Qoraa

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

Laakiin si aan u tuso isticmaalaha muuqaalkiisa iyo muuqaalada isticmaaleyaasha kale, waxaan go'aansaday inaan isticmaalo RazorEngine, ama qayb ka mid ah. Waxa kale oo ka mid ah maaraynta codsiyada xun iyo soo saarista koodka khaladka ku habboon.

Kontoroolka Razor

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

Dabcan, si loo xaqiijiyo isticmaalayaasha idman inay shaqeeyaan, oggolaansho ayaa loo baahan yahay. Qaybta oggolaanshaha ayaa la falgala xogta xogta. Xogta laga helay foomamka ku yaal goobta ayaa laga soo minguuriyay macnaha guud, isticmaaluhu waa la keydiyay wuxuuna helayaa cookies iyo helitaanka adeegga beddelka.

Qaybta oggolaanshaha

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

Oo sidan waa sida kaydku u eg yahay:

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


Wax walbana waxay u shaqeeyaan sida saacadaha shaqada, ogolaanshaha iyo shaqada diiwaangelinta, shaqeynta ugu yar ee helitaanka adeegga ayaa horeyba loo heli karaa waana waqtigii la qori lahaa arji oo lagu xiro dhammaan hawlaha ugu muhiimsan ee wax walba loo qabto.

Cutubka 4-aad

Si loo yareeyo kharashka shaqada ee qorista laba codsi oo loogu talagalay laba goobood, waxaan go'aansaday inaan ka sameeyo xamarin.Forms. Mar labaad, mahadsanid xaqiiqda ah inay ku jirto C #. Markii aan sameeyay codsi tijaabo ah oo si fudud xogta ugu soo diraya server-ka, waxaan ku dhex orday hal daqiiqo oo xiiso leh. Codsiga qalabka, madadaalo, waxaan ka hirgeliyay HttpClient oo ku tuuray server-ka HttpRequestMessage kaas oo ka kooban xogta foomka oggolaanshaha ee qaabka json. Anigoon wax gaar ah ka fileyn, waxaan furay diiwaanka server-ka oo waxaan arkay codsi ka yimid aaladda oo wadata dhammaan xogta halkaas. Nacas fudud, ka warqabka wax kasta oo la sameeyay 3dii toddobaad ee la soo dhaafay ee fiidkii. Si loo hubiyo saxnaanta xogta la soo diray, waxaan ku ururiyay server-ka tijaabada HttpListner. Ka dib markii aan helay codsiga xiga ee horeba, waxaan u kala soocay dhowr sadar oo kood ah, waxaan ka helay xogta KeyValuePair foomka. Falanqaynta weydiinta ayaa laga dhigay laba sadar.

Waxaan bilaabay tijaabin dheeraad ah, hore looma sheegin, laakiin server-kii hore waxaan wali hirgeliyay sheeko lagu dhisay websockets. Waxay u shaqeysay si wanaagsan, laakiin mabda'a isdhexgalka iyada oo loo marayo Tcp waxay ahayd mid niyad-jab ah, wax badan oo dheeri ah ayaa la soo saaray si si sax ah loo dhiso isdhexgalka labada isticmaale ee diiwaangelinta waraaqaha. Tan waxaa ka mid ah kala saarista codsiga beddelka isku xirka iyo ururinta jawaabta iyadoo la adeegsanayo hab-maamuuska RFC 6455. Sidaa darteed, server-ka tijaabada ah, waxaan go'aansaday inaan abuuro xiriiriye fudud oo websocket ah. Kaliya danta awgeed.

Xiriirinta wada sheekaysiga

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

Wayna shaqaysay. Serferka laftiisa ayaa dejisay isku xirka, waxa uu soo saaray furaha jawaabta. Xitaa uma baahnid inaan si gooni ah u habeeyo diiwaangelinta server-ka ssl, waa ku filan in nidaamku mar horeba shahaado ku rakibay dekedda loo baahan yahay.

Dhinaca qalabka iyo dhinaca goobta, laba macmiil ayaa is dhaafsaday fariimo, waxaas oo dhan waa la galiyay. Ma jiro baarayaal aad u weyn oo hoos u dhigaya seerfarka, midna looma baahnayn. Waqtiga jawaabta ayaa laga dhigay 200ms ilaa 40-30ms. Waxaana imid go'aanka kaliya ee saxda ah.

Baaskiil heer sare ah ama codsi adeegaha macmiilka oo ku salaysan qaabka C # .Net

Ku tuur hirgelinta server-ka hadda Tcp oo dib ugu qor wax kasta oo hoos yimaada Http. Hadda mashruucu wuxuu ku yaalaa marxaladda dib-u-qaabaynta, laakiin sida waafaqsan mabaadi'da gebi ahaanba kala duwan ee isdhexgalka. Qalabaynta aaladaha iyo goobta waa la is waafajiyaa waana la tirtiray waxayna leedahay fikrad guud, iyada oo farqiga kaliya ee aaladaha aysan u baahnayn inay abuuraan bogag html ah.

gunaanad

"Adiga oo aan garanayn ford-ka, madaxaaga ha gelin biyaha" Waxaan u maleynayaa, ka hor intaanan shaqada bilaabin, waa inaan si cad u qeexaa yoolalka iyo ujeedooyinka, iyo sidoo kale inaan u fiirsado daraasadda tignoolajiyada lagama maarmaanka ah iyo hababka hirgelinta ee macaamiisha kala duwan. Mashruucu mar hore ayuu gebogebo ku dhow yahay, laakiin waxaa laga yaabaa inaan u soo noqdo si aan uga hadlo sida aan mar kale u qallafiyay waxyaabaha qaarkood. Wax badan ayaan bartay intii lagu jiray habka horumarinta, laakiin waxaa jira wax badan oo aan baran doono mustaqbalka. Haddii aad akhriday ilaa hadda, markaa waad ku mahadsan tahay akhrinta.

Source: www.habr.com