Komunikator dla "niewidocznych"

0

Witam, chce napisac komunikator do mojego programu. Myslalem nad tym sporo, poczytalem i zastanawiam sie jak rozwiazac jedno zagadnienie, mianowicie nie mialbym problemu z userami, ktorzy maja publiczne ip, schody zaczynaja sie, gdy w gre wchodza userzy, ktorzy nie maja publicznego ip (gra jest warta swieczki, gdyz w moim przypadku sporo ich bedzie, jednak obsluga takich osob calkowicie zmienia mechanizmy rzadzace tym programem). Do dyspozycji mam baze mysql, dlatego tez utworzylem w niej 3 tabele:
komunikator_lista (przechowywani wszyscy uzytkownicy z unikatowymi numerami)
komunikator_aktywni (lista dostepnych userow)
komunikator_wiadomosci (przechowywane nieodebrane wiadomosci dla kazdego unikatowego numeru(usera))

Jesli program zostanie uruchomiony no to dodaj usera do tabeli aktywnych, jesli program zostanie wylaczony no to usun usera z tej tabeli. (gorzej jesli podczas dzialania programu zostanie utracone polaczenie z internetem, albo ktos wylaczy zasilanie od kompa :) )

Jesli user nie ma publicznego ip to niemozliwe jest, aby serwer wyslal do niego wiadomosc, dlatego tez to user bedzie musial sprawdzac czy nie ma dla niego nowej wiadomosci (uzylbym tu timerka, ktory sprawdzal by czy nie ma nowych wiadomosci dla usera w bazie danych, jednak sadze, ze takie rozwiazanie jest troche obciazliwe i prymitywne).

Interesuje mnie jak waszym zdaniem powinny wygladac ogolne mechanizmy rzadzace tego typu komunikatorem. Z gory dziekuje za posty, serdecznie pozdrawiam

0

eeee wystarczy postawić gdzieś na publicznym IP serwer, który będzie kierował przepływem komunikatów user-user. W momencie jeśli user połączy się z Twoim serwerem (obojętnie czy ma publiczne IP czy nie) to masz już do niego połączenie i spokoinie nowe wiadomości możesz mu wysyłać. Odpada też niezbyt mądry pomysł zapisywania aktywnych do bazy (to naprawdę nie zdaje egzaminu). Jedyne sensowne rozwiązanie takiego problemu to zamiast łączyć się user <-> user musisz zrobic komunikację user <-> serwer (z publicznym IP) <-> user i wszystkie Twoje problemy zostają rozwiązane

0

Ok postaram sie zrobic jak piszesz.

0
dRum napisał(a)

Ok postaram sie zrobic jak piszesz.

to może najpierw sobie to przemyśl, czy masz aby możliwości techniczne (serwer z publicznym IP i windowsem), poczekaj, może ktoś da Ci inne rozwiązanie, ...

0

Wszystko jest :] , uwazam, ze twoje rozwiazanie nadaje sie idealnie. Teraz tylko mysle jak by to dokladnie mialo wygladac, dzieki za pomoc, pozdrawiam.

0

Kiedyś robiłem taki komunikatorek i mogę wtrącić trzy grosze :)

  1. założyłem sobie konto na FTP
  2. na tym koncie dla każdego usera umieszczam plik o nazwie nicka z danymi np. hasło IP itd.

W programie zaszyfrowałem dane odnośnie zalogowania na serwer np:
pasword:= @#$%$@' a potem w procedurach odszyfrowane dane podstawiam dla komponentów IdFTP (to w kwesti zabezpieczenia)

  1. wpisuje nicka
  2. komponentem IdFTP pobieram plik o nazwie tego nicka - a w tym pliku sprawdzam czy są prawidłowe dane . Jeśli nie, lub brak pliku - to do widzenia :)
  3. po prawidłowym pobraniu pliku rejestracyjnego, wysyłam pusty plik o nazwie nicka do katalogu "Nicki" znajdującego się na serwerze
  4. pobieram plik czata z tekstem wiadomości, plik ten zapisuje się na dysk np do Temp.
    W procedurze zegara umieściłem instrukcję która pobiera rozmiar pliku na serwerze i na dysku - jesli jest róznica to pobiera plik z serwera i powiadamia dźwiękiem ze jest nowa wiadomość.
  5. Wysyłanie wiadomości - można dopisywać do tego pliku co jest w tempie i wysyłać na serwer, ale będzie rósł z nieskończoność. Albo wysyłać tylko to co masz w oknie wysyłania
  6. przy zakończeniu programu usuwam plik nicka z serwera.
    Samo sprawdzanie obecności odbywa się tak: Pobieram listę plików z katalogu Nicki - no i tym sposobem wiem kto jest aktualnie obecny :P

itd..itd.. podałem tylko schemat - mozna to rozbudowywać

0
Pytajnik napisał(a)
  1. przy zakończeniu programu usuwam plik nicka z serwera.
    Samo sprawdzanie obecności odbywa się tak: Pobieram listę plików z katalogu Nicki - no i tym sposobem wiem kto jest aktualnie obecny :P

i jak ktoś Ci zamiknie program przez CTRL+ALT+DEL albo Twój program się wykrzaczy albo branie prądu albo cokolwiek innego to masz cały sytem do d****

0

Można by wysyłać zapytanie co jakiś czas do klienta, jeżeli nie odpowie w ciągu np. 3 prób to serwer uznaje go jako rozłączonego.

0
Andre napisał(a)

Można by wysyłać zapytanie co jakiś czas do klienta, jeżeli nie odpowie w ciągu np. 3 prób to serwer uznaje go jako rozłączonego.

ale do czego to odnosisz? do mojego porzedniego postu? Jeśli tak, to tam nie ma serwera.

0

ja toto zrobilem z lista aktywnych, ale po wylaczeniu programu wcale nie musi mowic serwerowi, ze sobie idzie :P. Po prostu dalem do bazy date ostatniej komunikacji z serwerem, i jesli program nie laczyl sie przez ostatnie 10 sekund, to znaczy, ze jest rozlaczony :)

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