using System; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.SignalR; namespace BlazorChat { public class BlazorChatSampleHub : Hub { public const string HubUrl = "/chat"; // 최대 접속 인원 수를 정의합니다. private const int MaxUsers = 1; // 현재 접속된 사용자 수를 추적하는 static 변수입니다. private static int _connectedUsers = 0; public async Task Broadcast(string username, string message) { await Clients.All.SendAsync("Broadcast", username, message); } public override async Task OnConnectedAsync() { Console.WriteLine($"Current connected users count: {_connectedUsers}"); // 현재 접속된 사용자 수가 최대값을 초과하는지 확인합니다. if (_connectedUsers >= MaxUsers) { // 클라이언트로 오류 메시지를 전송합니다. await Clients.Caller.SendAsync("Error", "최대 접속 인원을 초과했습니다."); //// 최대값을 초과하면 연결을 거부합니다. Context.Abort(); //// Task를 반환하여 함수 실행을 종료합니다. Console.WriteLine($"Current connected users count: {_connectedUsers}"); await Task.CompletedTask; // DisconnectedAsync로 이동함.. return; // 최대값을 초과하면 연결을 거부하는 예외를 던집니다. //Console.WriteLine($"Current connected users count: {_connectedUsers}"); //throw new HubException("최대 접속 인원을 초과했습니다."); //return; } Interlocked.Increment(ref _connectedUsers); Console.WriteLine($"Current connected users count: {_connectedUsers}"); Console.WriteLine($"{Context.ConnectionId} connected"); await base.OnConnectedAsync(); //return base.OnConnectedAsync(); } public override async Task OnDisconnectedAsync(Exception e) { // 접속된 사용자 수를 감소시킵니다. Interlocked.Decrement(ref _connectedUsers); Console.WriteLine($"Disconnected {e?.Message} {Context.ConnectionId}"); Console.WriteLine($"Current connected users count: {_connectedUsers}"); await base.OnDisconnectedAsync(e); } } }