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

برنامه‌نویسی شبکه (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) استفاده شده است.

پیشنهاد ویژه یادگیری
دسترسی نامحدود به بیش از ۴,۰۰۰ ویدئوی آموزشی تخصصی

با تهیه یک اشتراک ماهانه در پلتفرم Elimi|علیمی، بدون محدودیت به تمام دوره‌ها، پروژه‌ها و مسیرهای یادگیری دسترسی پیدا کنید.

۳. برنامه‌نویسی 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 برای ارتباط زنده و دوطرفه استفاده کنید.

برنامه‌نویسی شبکه (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 برای ارتباط زنده و دوطرفه استفاده کنید.

کلید واژه‌ها: برنامه‌نویسی شبکه (Networking) در #C-سی شارپ-

پیشنهاد ویژه یادگیری
دسترسی نامحدود به بیش از ۴,۰۰۰ ویدئوی آموزشی تخصصی

با تهیه یک اشتراک ماهانه در پلتفرم Elimi|علیمی، بدون محدودیت به تمام دوره‌ها، پروژه‌ها و مسیرهای یادگیری دسترسی پیدا کنید.