SignalR - czat w stylu omegle

0

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 :)

0

ja bym to zrobił właśnie z bazą danych. Ewentualnie mieć jakąś globalną listę, np. słownik i potraktować klucz jako jednego usera a wartość jako drugiego.

Zobacz na ten przykład: http://www.codeproject.com/Articles/562023/Asp-Net-SignalR-Chat-Room

0

@ne0 obeszlo się bez bazy.
zrobiłem to na slowniku :)

0

no to spoko :P

jeśli to co piszesz ma być później publicznie (a nie że robisz to tylko aby się nauczyć) to jednak ja bym zrobił to z bazą danych i robił archiwizację czatu na późniejsze problemy z użytkownikami. No i z bazą pewnie też więcej byś się nauczył :)

0

@ne0
Nie wiem :) Moze wrzucę.
Tak tak, będą rozmowy w bazie zapisywane :). Ale to nie ma znaczenia jesli chodzi o prowadzenie rozmów z kimś. :) Dało się bez bazy jest tu zbędna :).

1 użytkowników online, w tym zalogowanych: 0, gości: 1