الگوریتم اول

لطفا صبر کنید...

برنامه‌نویسی شبکه (Networking) در #C

برنامه‌نویسی شبکه (Networking) در #C

#C دارای کتابخانه‌های قدرتمندی برای برنامه‌نویسی شبکه است. با استفاده از فضای نام System.Net و System.Net.Sockets می‌توان برنامه‌های ارتباطی مانند کلاینت-سرور، وب‌سرور، دریافت و ارسال داده‌ها از طریق HTTP، TCP و UDP ایجاد کرد.

۱. کار با WebClient برای درخواست‌های HTTP

کلاس WebClient یکی از ساده‌ترین راه‌ها برای ارسال درخواست‌های HTTP و دریافت پاسخ از وب‌سرورها است.

مثال: دانلود یک صفحه وب

using System;
using System.Net;

class Program
{
    static void Main()
    {
        using (WebClient client = new WebClient())
        {
            string content = client.DownloadString("https://www.example.com");
            Console.WriteLine(content);
        }
    }
}

🔹 ()DownloadString محتوای یک URL را دریافت می‌کند.
🔹 این روش برای درخواست‌های ساده مناسب است، اما در نسخه‌های جدید #C استفاده از HttpClient توصیه می‌شود.

۲. استفاده از HttpClient برای ارتباطات HTTP

HttpClient گزینه‌ای مدرن‌تر و انعطاف‌پذیرتر برای ارسال درخواست‌های HTTP است.

مثال: دریافت داده از یک API

using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using (HttpClient client = new HttpClient())
        {
            HttpResponseMessage response = await client.GetAsync("https://jsonplaceholder.typicode.com/posts/1");
            string content = await response.Content.ReadAsStringAsync();
            Console.WriteLine(content);
        }
    }
}

🔹 ()GetAsync درخواست HTTP GET ارسال می‌کند.
🔹 ()ReadAsStringAsync محتوای پاسخ را به صورت متن دریافت می‌کند.
🔹 از await برای اجرای عملیات به صورت ناهمزمان (async) استفاده شده است.

۳. برنامه‌نویسی TCP (کلاینت-سرور)

برای ارتباط از طریق TCP می‌توان از کلاس‌های TcpClient و TcpListener استفاده کرد.

مثال: سرور TCP ساده

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Program
{
    static void Main()
    {
        TcpListener server = new TcpListener(IPAddress.Any, 5000);
        server.Start();
        Console.WriteLine("سرور آماده است...");

        while (true)
        {
            TcpClient client = server.AcceptTcpClient();
            NetworkStream stream = client.GetStream();
            byte[] buffer = Encoding.UTF8.GetBytes("به سرور خوش آمدید!");
            stream.Write(buffer, 0, buffer.Length);
            client.Close();
        }
    }
}

🔹 TcpListener یک سرور TCP ایجاد می‌کند.
🔹 ()AcceptTcpClient منتظر اتصال کلاینت می‌ماند.
🔹 NetworkStream برای ارسال داده استفاده می‌شود.

مثال: کلاینت TCP ساده

using System;
using System.Net.Sockets;
using System.Text;

class Program
{
    static void Main()
    {
        TcpClient client = new TcpClient("127.0.0.1", 5000);
        NetworkStream stream = client.GetStream();

        byte[] buffer = new byte[256];
        int bytesRead = stream.Read(buffer, 0, buffer.Length);
        string response = Encoding.UTF8.GetString(buffer, 0, bytesRead);

        Console.WriteLine("پیام از سرور: " + response);
        client.Close();
    }
}

🔹 TcpClient برای اتصال به سرور استفاده شده است.
🔹 ()Read داده دریافتی را خوانده و نمایش می‌دهد.

۴. ارتباط از طریق UDP

UDP برخلاف TCP بدون اتصال است و برای ارسال داده‌های سریع و بدون تأخیر (مانند بازی‌های آنلاین) استفاده می‌شود.

مثال: سرور UDP

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Program
{
    static void Main()
    {
        UdpClient udpServer = new UdpClient(5000);
        IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);

        Console.WriteLine("سرور UDP در حال اجرا...");

        while (true)
        {
            byte[] receivedData = udpServer.Receive(ref remoteEP);
            string message = Encoding.UTF8.GetString(receivedData);
            Console.WriteLine($"دریافت شد: {message}");

            byte[] response = Encoding.UTF8.GetBytes("پیام دریافت شد!");
            udpServer.Send(response, response.Length, remoteEP);
        }
    }
}

🔹 UdpClient یک سرور UDP راه‌اندازی می‌کند.
🔹 ()Receive برای دریافت پیام از کلاینت استفاده شده است.
🔹 ()Send پاسخ را ارسال می‌کند.

مثال: کلاینت UDP

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Program
{
    static void Main()
    {
        UdpClient udpClient = new UdpClient();
        IPEndPoint serverEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5000);

        byte[] data = Encoding.UTF8.GetBytes("سلام سرور!");
        udpClient.Send(data, data.Length, serverEP);

        IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
        byte[] receivedData = udpClient.Receive(ref remoteEP);
        string response = Encoding.UTF8.GetString(receivedData);

        Console.WriteLine("پاسخ از سرور: " + response);
    }
}

🔹 ()Send پیام را به سرور ارسال می‌کند.
🔹 ()Receive پاسخ را دریافت و نمایش می‌دهد.

۵. استفاده از WebSockets برای ارتباطات زنده

WebSocket برای ارتباطات دوطرفه زنده (مثلاً چت آنلاین) استفاده می‌شود.

مثال: سرور WebSocket با ASP.NET Core

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

var builder = WebApplication.CreateBuilder();
var app = builder.Build();

app.UseWebSockets();
app.Map("/", async (HttpContext context) =>
{
    if (context.WebSockets.IsWebSocketRequest)
    {
        WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();
        await Echo(webSocket);
    }
    else
    {
        context.Response.StatusCode = 400;
    }
});

async Task Echo(WebSocket webSocket)
{
    byte[] buffer = new byte[1024];
    while (webSocket.State == WebSocketState.Open)
    {
        var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
        string message = Encoding.UTF8.GetString(buffer, 0, result.Count);
        Console.WriteLine("پیام دریافت شد: " + message);

        await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count),
            result.MessageType, result.EndOfMessage, CancellationToken.None);
    }
}

app.Run();

()app.Run;

🔹 WebSocket ارتباط دوطرفه دائمی را فراهم می‌کند.
🔹 ()ReceiveAsync داده را دریافت می‌کند.
🔹 ()SendAsync پاسخ را ارسال می‌کند.

جمع‌بندی

#C ابزارهای مختلفی برای برنامه‌نویسی شبکه دارد. بسته به نیاز خود می‌توانید از HttpClient برای درخواست‌های HTTP، TcpClient و TcpListener برای ارتباط TCP، UdpClient برای ارتباط UDP، و WebSockets برای ارتباط زنده و دوطرفه استفاده کنید.