lista kontaktów

0

Cześć :)
Załóżmy, że klient ma listę kontaktów ( innych klientów). Każdy klient może mieć dwa statusy- połączony albo rozłączony.
Teraz pytanie jak zoorganizować taką listę? Tzn. Co jaki czas mam aktualizować listę? Wiąże się to z ciągłym przeglądaniem listy i zapytaniami do serwera. Planuję stworzyć osobny wątek po stronie klienta do aktualizowania listy.
Ale czy to nie będzie zbyt mało wydajne? Przecież jak wielu klientów zacznie sobie takie sprawdzanie...
Ale ja nie mam inaczej pomysłu. Nie będę przecież wysyłał informacji z serwera to wszystkich klientów.
Pomóżcie :)

1

W zdarzeniu obslugi zmiany statusu klienta informuj o tym wszystkich zainteresowanych.

0

wymaga to ode mnie przetrzymywania listy kontaktów każdego usera na serwerze, a czegoś takiego nie planuję. W tym przypadku tez muszę mieć osobny wątek, tyle że na serwerze. Tak byłoby najprościej na zmianę sygnał zmiany statusu, ale co jeśli komuś nagle zerwie neta i będzie zawsze połączony?

1

1)

Bob, the client napisał(a)

Hi Steve, i've just logged in!

Steve, the server napisał(a)

Hey guys, check this out, Bob is logged in!

2)

Bob, the client napisał(a)

I have to go, bye guys, see you later Steve.

Steve, the server napisał(a)

Ok. Guys, say goodbye to Bob, he just logged out.

3)

Steve, the server napisał(a)

Bob... (30s later) BOOOOB! Crap. Ok. Guys, say goodbye to Bob, he just logged out.

0
    Steve, the server:
    Ok. Guys, say goodbye to client, he just logged out.

A co jeżeli Steve się grzecznie nie wyloguje, bo mu rozłączy internet?

Takie podejście wymaga ode mnie przetrzymywania wszystkich klientów, którzy mają w kontaktach Boba. Wiem, że musi istnieć jakieś rozwiązanie, które nie wymaga przetrzymywania kontaktów każdego klienta na servie ponieważ GG kiedyś nie trzymało kontaktów na servie.

1

serwer może co określony czas wysyłać do każdego klienta o statusie "zalogowany" najprostsze zapytanie- "hey Bob, are you still there?". jeśli uzyska odpowiedź, oznacza to, że bob cały czas tam jest. jeśli nie, to znaczy, że nie ma go tam i należy zmienić jego status.

spróbuję Ci udowodnić, że przechowywanie skrzynek adresowych na serwerze nie jest głupie:

pierwsza opcja: na serwerze masz tylko plik z danymi wszystkich klientów. w przypadku zmiany statusu któregokolwiek z nich, serwer będzie przesyłał komunikat "Bob has just logged in/out" do każdego zalogowanego klienta. jeśli klient ma, no już uczepmy się tego Boba, w swoich kontaktach, na jego liście status Boba zmieni się. natomiast, jeśli jakiś klient Boba w swoich kontaktach nie ma, informację będzie mógł po prostu zignorować. jest to proste wyjście, pod warunkiem, że grono użytkowników jest niewielkie. przy wielu tysiącach klientów, gdy status każdego z nich będzie się bezustannie zmieniał, całe łącze zostanie zablokowane przez komunikaty, które większości klientów nie przydadzą się do niczego, bo np Nikolę ma w swoich kontaktach tylko pięćdziesięciu klientów, a informacja "Nicola has just logged in/out" dotrze do każdego. teraz wyobraź sobie, że naraz wylogowało się dwustu użytkowników. pozostali zalogowani będą mieli zabite na jakiś czas łącze, bo będzie każdy jeden komunikat przetwarzać i szukać użytkownika o danym ID w swoich kontaktach, aby się okazało, że tego typa w kontaktach nie ma i informację można zignorować. robi się nieciekawie. inna rzecz, że serwer mieli w kółko jeden plik i szuka zalogowanych oraz zmian statusu. niefajnie...

druga opcja to klient stale pytający serwer o status użytkowników z jego listy kontaktów. nawet przy stu klientach, z których zalogowana jest połowa, serwer będzie dość mocno obciążony pytaniami(no i ciągle mieli w kółko jeden plik, tak jak powyżej). kto by chciał tworzyć komunikację, która przy niewielu użytkownikach dość mocno obciążałaby serwer, zawalając go zapytaniami? nie ja;)

i wreszcie trzecia opcja- tworzysz w serwerze bazę danych, gdzie masz łatwy dostęp do powiązań między listami kontaktów każdego użytkownika i w przypadku zmiany statusu tego użytkownika wysyłasz stosowną informację tylko tym, którzy mają go w swoich kontaktach.
a nawet nie tak- można prościej: serwer ma tylko listy kontaktów każdego użytkownika i wysyła każdemu znajomemu z listy informację "wylogowałem się" oznaczoną, jako wychodząca od danego klienta(przy założeniu, że jeśli jeden klient ma drugiego w kontaktach, to drugi ma w nich pierwszego). natomiast klient wtedy tylko przy logowaniu jeden raz pyta o status wszystkich użytkowników z jego skrzynki. proste, nie zabierające wiele łącza, mniej obciążające serwer niż ciągłe wertowanie jednej listy w tę i nazad(w pamięci RAM serwera można trzymać wszystko co potrzebne do działania, a do plików dostępu wymagać tylko przy zapytaniu ze strony logującego się klienta albo przy wylogowaniu któregoś z nich) i jeszcze jedna zaleta- logujący się klient może w takim razie pobrać wprost z serwera swoją listę kontaktów, a więc zalogować może się z wielu urządzeń, a w przypadku zniszczenia urządzenia, jego lista kontaktów pozostaje bezpieczna.

udało mi się kolegę przekonać co do trzymania plików jednak na serwerze? :)

0

pierwsza opcja: na serwerze masz tylko plik z danymi wszystkich klientów. w przypadku zmiany statusu któregokolwiek z nich, serwer będzie przesyłał komunikat "Bob has just logged in/out" do każdego zalogowanego klienta. jeśli klient ma, no już uczepmy się tego Boba, w swoich kontaktach, na jego liście status Boba zmieni się. natomiast, jeśli jakiś klient Boba w swoich kontaktach nie ma, informację będzie mógł po prostu zignorować. jest to proste wyjście, pod warunkiem, że grono użytkowników jest niewielkie. przy wielu tysiącach klientów, gdy status każdego z nich będzie się bezustannie zmieniał, całe łącze zostanie zablokowane przez komunikaty, które większości klientów nie przydadzą się do niczego, bo np Nikolę ma w swoich kontaktach tylko pięćdziesięciu klientów, a informacja "Nicola has just logged in/out" dotrze do każdego. teraz wyobraź sobie, że naraz wylogowało się dwustu użytkowników. pozostali zalogowani będą mieli zabite na jakiś czas łącze, bo będzie każdy jeden komunikat przetwarzać i szukać użytkownika o danym ID w swoich kontaktach, aby się okazało, że tego typa w kontaktach nie ma i informację można zignorować. robi się nieciekawie. inna rzecz, że serwer mieli w kółko jeden plik i szuka zalogowanych oraz zmian statusu. niefajnie...

Dokładnie tak to rozwiązałem :).
A co do tego czy jestem przekonany. Tak, jestem przekonany i już teraz wiem, że moje obecne rozwiązanie nie jest najlepsze, ale samo w sobie projektowanie takiej bazy danych byłoby dla mnie trudne, dla tego odpuściłem.
Dzięki :)

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