Chat wieloosobowy

0

Witajcie.
Wykonuje aktualnie projekt czatu wielosobowego, czyli n uzytkownikow do n uzytkownikow.
Nie mam problemu ze zrobieniem rozmowy 1 uzytkownik do 1 uzytkownik.

W przypadku rozmowy tylko pomiedzy 1 uzytkownikiem a innym uzywam pol w DB takich jak idOd, idDo, Odebrany, Data, Wiadomosc

i jak mozna sie domyslec jesli aplikacja wykryje nowy rekord dla aktualnie zalogowanego uzytkownika z Odebrany = false to pokauje okienko czata z wiadomoscia. i zmienia Odebrany na true

Problem polega na tym ze jam mam wiecej osob to 1 osoba wysyla n wiadomosci do innych, i wtedy sie twrzy n rekordow z odebrany false i idDo Id uzytkownikow z ktorymi chce sie rozmawiac.
Wiadomosc do nich dociera, ale oni wtedy nie wiedza ze sa inni uzytkownicy w rozmowe. Jak to najlepiej zrobic?

0

Hm. Chcesz zrobić wieloosobowy czat i używasz do tego bazy? Czyli rozumiem, że potrzebujesz utrwalania czatu i dostępu do treści wysłanych za naszej nieobecności? Jeśli tak, to bardziej przypomina to tablicę ogłoszeniową, ew. forum.

Wtedy kwestię zaznaczania "odebranych" wiadomości można próbować rozwiązać przez rejestrowanie czasu za-/wylogowania i potem odpowiednie filtrowanie postów do wyświetlenia.

Jeśli jednak chcesz napisać zwykłego czata, w którym wiadomości są ulotne a wymagany jest dostęp tylko do wiadomości przychodzących podczas trwania przyłączenia (klasyczny czat), to radziłbym zrezygnować z bazy danych. Wystarczy zwykły serwer broadcastujący wiadomości do wszystkich połączonych. Albo możesz skorzystać z sieci pseudo P2P za pomocą WCF (przykład)</url>

0

Ja bym tutaj skorzystał z remotingu w trybie singleton.
Obiekt na serwerze przechowywałby wtedy wszystkie wiadomości, i użytkownik logujący się bez problemu mógłby wszystko odczytywać.

0

ok, dzieki ale mi chodzi jak zrobic zeby cos takiego:
Mamy:

  1. Piotrek
  2. Krzysiek
  3. Maciej

Piotrek robi konferencje i zaprasza krzyska i macieja
Piotrka wysylawiadomosci do krzyska i macieja one diecieraja
jak teraz zrobic zeby krzysiek i maciej tez mogli ze soba pisac?
Bo oni siebie nie widza, widza tylko ze wiadomosc naplynela od piotra.

0

No właśnie tutaj obiekt singleton na serwerze już sam oto zadba, wystarczy że klienci podłączą się do serwera i po sprawie ;) Poczytaj proszę o remotingu. W przypadku takiego chatu sprawa powinna być całkiem prosta.

0

P2P mesh w WCF załatwia problem komunikacji. Hosty przyłączają się do sieci na różne sposoby, m. in. tzw local discovery.

0

W projekcie juz uzywam WebService. Musi to dzialac jakos przez niego.

0

Nie no, panowie, nie komplikujcie prostego tematu.

Jesli potrafisz obsluzyc wiele rownoczesnych czatow jeden-do-jeden w jednym procesie, to z rozmowa wieloosobowa nie powinno byc problemu.

Robiac to na bazie danych, dodaj sobie osobna tabele: nazwijmy ja DYSKUSJA i druga UCZESTNICY_DYSKUSJI

DYSKUSJA
----
ID
DATA_ROZPOCZECIA
... inne detale
UCZESTNICY_DYSKUSJI
----
DYSKUSJA_ID
UZYTKOWNIK_ID

...a swoja tabele wiadomosci rozszerz o kolumne DYSKUSJA_ID; jesli wiadomosc wyslana jest jako czesc dyskusji, kolumna ta wskazuje jej ID, a gdy w rozmowie jeden-do-jeden jest null. Mozesz pojsc jeszcze dalej i traktowac czat jeden-do-jeden tez jako dyskusje wieloosobowa tylko z dwoma uzytkownikami (wtedy kolumna ta musi byc not null).

Uzytkownikowi przychodzi do odebrania wiadomosc stanowiaca czesc dyskujsji 1234, wiec pyta serwer, kto jeszcze w niej uczestniczy (i ewentualnie jakie sa jej szczegoly):

SELECT * FROM DYSKUSJA WHERE (ID = 1234)
SELECT UZYTKOWNIK_ID FROM UCZESTNICY_DYSKUSJI WHERE (DYSKUSJA_ID = 1234)

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