Jestem w trakcie tworzenia czatu działającego na zasadzie czat ruletki jak omegle.com
- Użytkownik wchodzi na serwer (jeśli nikt w kolejce nie oczekuje zostaje on do niej dodany i tworzy nową grupę OnConnected)
- Jeśli w kolejce ktoś się znajduje zostanie z niej wyciągnięty, a użytkownik, który własnie się połączył dołącza do grupy użytkownika z kolejki
- Mogą czatować ze sobą i w przypadku kiedy dołączy ktoś trzeci proces powtarza się
Kod:
public class UserGroup
{
public string GroupName { get; set; }
}
public class ChatHub : Hub
{
public static Queue<UserGroup> Users = new Queue<UserGroup>();
public static string Group { get; set; }
public Task JoinGroup(string groupName)
{
return Groups.Add(Context.ConnectionId, groupName);
}
public override System.Threading.Tasks.Task OnConnected()
{
if(Users.Count == 0)
{
var user = new UserGroup { GroupName = Context.ConnectionId };
Users.Enqueue(user);
Group = user.GroupName;
JoinGroup(user.GroupName);
}
else
{
JoinGroup(Users.Peek().GroupName);
Group = Users.Peek().GroupName;
Users.Dequeue();
}
return base.OnConnected();
}
public void SayHello(string name, string helloMsg)
{
Clients.Caller.Hello(name, helloMsg);
}
public void Send(string msg)
{
//Clients.All.SendMessage(msg);
// Clients.Users(new string[] { User1, User2 }).SendMessage(msg);
Clients.Group(Group).SendMessage(msg);
}
}
Problem jest jednak taki, że w przypadku kiedy dołączy ktoś trzeci i napisze coś na czacie wszystko się psuje, całość przestaje działać bo sypią się grupy.
Obstawiam, że jest to problem tej natury, że grupa jest statyczna (współdzielona na poziomie wszystkich instancji klasy) jednak w inny sposób to niestety nie działa.
Chciałem to rozwiązać w taki sposób, że stworzę bezę danych i podczas połaczenia się użytkownika będzie on w niej zapisywany, a następnie partner a podczas rozłącznie rekord będzie usuwany, jednak nie wiem czy jest to dobre rozwiązanie i wolałbym pozostać przy tym wyżej ale jakoś to naprawić.
Pomóżcie :)