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 |