본문 바로가기
asp.net

[.net framework] Socket 통신(클라이언트)

by TTTGGG 2025. 2. 18.
728x90
반응형
SMALL

.net framework 4.7.2 Console App

 

150개의 클라이언트 인스턴스 생성

각 클라이언트가 10초마다 서버로 데이터 전송

각 클라이언트가 독립적으로 실행되며, 서버와 지속적인 연결 유지

서버와 연결 끊어지면 자동 재연결 

using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleSocketClient
{
    class Program
    {
        private static int clientCount = 150;  // 클라이언트 개수
        private static string serverIp = "127.0.0.1"; // 서버 IP
        private static int serverPort = 5000;  // 서버 포트

        static async Task Main()
        {
            List<Task> clientTasks = new List<Task>();

            Console.WriteLine($"[시작] {clientCount}개의 클라이언트를 실행합니다.");

            for (int i = 1; i <= clientCount; i++)
            {
                int clientId = i; // 클라이언트 ID 유지
                clientTasks.Add(Task.Run(() => RunClient(clientId)));
                //await Task.Delay(100); // 순차적으로 클라이언트 실행 (서버 부하 방지)
            }

            await Task.WhenAll(clientTasks); // 모든 클라이언트가 실행될 때까지 대기
        }

        static async Task RunClient(int clientId)
        {
            while (true)
            {
                try
                {
                    using (TcpClient client = new TcpClient())
                    {
                        Console.WriteLine($"[클라이언트 {clientId}] 서버 연결 시도...");
                        await client.ConnectAsync(serverIp, serverPort);
                        Console.WriteLine($"[클라이언트 {clientId}] 서버 연결 성공!");

                        using (NetworkStream stream = client.GetStream())
                        {
                            var receiveTask = Task.Run(() => ReceiveData(clientId, stream));
                            var sendTask = Task.Run(() => SendData(clientId, stream));

                            await Task.WhenAny(receiveTask, sendTask);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"[클라이언트 {clientId}] 연결 실패: {ex.Message}");
                }

                Console.WriteLine($"[클라이언트 {clientId}] 3초 후 재연결 시도...");
                await Task.Delay(3000);
            }
        }

        static async Task SendData(int clientId, NetworkStream stream)
        {
            while (true)
            {
                try
                {
                    string message = $"[{DateTime.Now:HH:mm:ss}] 클라이언트 {clientId} 데이터";
                    byte[] data = Encoding.UTF8.GetBytes(message);
                    await stream.WriteAsync(data, 0, data.Length);
                    Console.WriteLine($"[클라이언트 {clientId}] 전송: {message}");

                    await Task.Delay(10000); // 10초마다 데이터 전송
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"[클라이언트 {clientId}] 전송 오류: {ex.Message}");
                    break;
                }
            }
        }

        static async Task ReceiveData(int clientId, NetworkStream stream)
        {
            byte[] buffer = new byte[1024];

            while (true)
            {
                try
                {
                    int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
                    if (bytesRead == 0) break;

                    string receivedData = Encoding.UTF8.GetString(buffer, 0, bytesRead);
                    Console.WriteLine($"[클라이언트 {clientId}] 수신: {receivedData}");
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"[클라이언트 {clientId}] 수신 오류: {ex.Message}");
                    break;
                }
            }
        }
    }
}

 

728x90
반응형
LIST

'asp.net' 카테고리의 다른 글

[.net] lock  (0) 2025.02.27
[.net framework] Socket 통신(서버)  (0) 2025.02.18
[.net] 해싱 알고리즘 SHA-256  (0) 2024.11.29
[.net] SSE(Server-Sent-Event)  (0) 2024.11.29
[.net] MvcBuildViews 설정, Web.config 충돌  (0) 2024.11.20