You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

64 lines
2.5 KiB
C#

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);
}
}
}