Wielozadaniowy komunikator

0

Tworzę komunikator, jednak jego celem nie jest łączenie dwóch komputerów, jednak wszystkich
komputerów posiadających ten komunikator (coś jak forum). Aktualnie robię to przez Indy (IdHTTP) - wysyłam protokołem HTTP i przez TTimer ściągam całą rozmowę. Jednak jak już się pewnie każdy domyślił transfer przebiega bardzo wolno a cała rozmowa to po prostu koszmar!

Czy ma ktoś może jakiś inny pomysł na komunikator, który łączy się ze wszystkimi komputerami w sieci? (normalnie to bym użył TIdTCPClient i TIdTCPServer)

0

Kiedyś dłubałem nad takim "komunikatorem" i wyglądało to tak:

  1. załozyłem sobie konto ftp
  2. do programu który rozdałem kumplom dołączyłem zaszyfrowany plik aktywacyjny z hasłem dostępu do tego serwera - lub można na samym serwerze stworzyć pliki logujące i sprawdzające hasło i login.
  3. Wysyłanie tekstu polegało na tym że ktoś pisał, wciskał enter i wysyłało plik na serwer np. czat.txt
  4. uruchomiony program sprawdzał rozmiary pliku na kompie plik temp\czat.txt i na serwerze czat.txt
    jeśli była róznica to ściągał z serwera i wyświetlał w oknie (ta procedura była zawarta w timerze np co 3 sek)
    To tylko prosty szkielet jak do tego się zabrać.
    Kod rozbudować można o pobieranie konkretnych linii tekstu które przybyły w pliku na serwerze, a nie całego pliku. Po prostu można pobrać dane z pliku od konkretnego miejsca. A miejscem tym będzie wielkość Twojego pliku np 100 KB i od 100 KB pliku na serwerze który ma np 300KB pobierasz dane.
    Zresztą to temat rzeka jak to zrobić.
0

a IRC, zna się ktoś na tym??

0

Czy ma ktoś może jakiś inny pomysł na komunikator, który łączy się ze wszystkimi komputerami w sieci? (normalnie to bym użył TIdTCPClient i TIdTCPServer)
Dlaczego nie miałbyś użyć tych komponetów?!

Tworzysz aplikację-serwer, która stoi na komputerze z publicznym IP i oczekuje na wiadomości wysyłane od klientów. Po odebraniu takiej wiadomości serwer rozsyła ją do pozostałych klientów.

0

Tworzysz aplikację-serwer, która stoi na komputerze z publicznym IP i oczekuje na wiadomości wysyłane od klientów. Po odebraniu takiej wiadomości serwer rozsyła ją do pozostałych klientów.

Musiałbym mieć cały czas włączony komputer, a poza tym jak za pomocą tych komponentów wysłać wiadomość do wielu??

0

Po pierwsze - to nie używaj Indy a ICS albo Synapse. :P

Po drugie - poczytaj dokumentację, każdy z tych komponentów umożliwia wysłanie danych do każdego podłączonego (a skoro do każdego podłączonego to można i do wszystkich).

0

Dzięki Nex, a może by zrobić tak:
Niby serwer jest, ale korzysta się z niego przy starcie programu. Wszelkie rozmowy są wysyłane od klienta do wszystkich klientów.
W Indy idIrc i idIrcServer jest taki "Bindings", czy tam można zapisać adresy wszystkich podłączonych klientów??

0

W takim wypadku otrzymasz małe P2P. ;) Moim zdaniem lepsze będzie rozwiązanie wykorzystywane w większości komunikatorów: klient->serwer->klient. Ale to już od Ciebie zależy.

0

Dobra, nie mogę posługiwać się serwerem, bo nie zagwarantuje, że będę mieć zawsze włączony komputer.
Czy wie ktoś jak posłużyć się tym "Bindings" (Indy->idIrc) - próbowałem coś majstrować, ale nie chciał się połączyć??
Proszę o pomoc!!

0

Ok. zrobiłem coś takiego, ale przy naciśnięciu Button1 (próbie połaczenia się) występuje błąd, co robić?!


procedure TForm1.FormCreate(Sender: TObject);
begin
   idTCPServer1.DefaultPort:=3500;
   idTCPClient1.Port:=3500;
   idTCPClient1.Host:='127.0.0.1';
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
   if not idTCPServer1.Active then
      idTCPServer1.Active:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   if not idTCPClient1.Connected then
   begin
      try
         try
            ShowMessage(idTCPClient1.ConnectAndGetAll);
         finally
            MessageDlg('Połączony z serwerem!', mtInformation, [mbOK], 0);
         end;
      except
         MessageDlg('Nie można sie połączyć z serwerem!', mtError, [mbOK], 0);
      end;
   end
   else
   begin
      idTCPClient1.Disconnect;
   end;
end;

0

Odswierze temat bo mnie interesowalo kiedys cos takiego :)

Moim zdaniem bez serwera sie nie obejdzie bo przeciez adresy ip moga sie zmieniac. Ja bym to zrobil na jeden sposob bo zalezaloby mi na szybkosci przede wszystkim.

  1. Tworzysz pliki na serwie darmowym w php i na przyklad w programie masz zaimplementowany aders do tego pliku. Po zalogowaniu na serwerze tworzy sie plik txt z danymi pierwszego zalogowanego klienta. Tam bedzie zdres IP... pare bajtow zajmuje.
    Ktos wlaczy program i sprawdza automatycznie ten plik txt i jesli istnieje adres IP to sprawdza czy jest aktualny. Jesli jest to juz mamy SERWER... ;) Jesli nie jest to wiadomo ze wchodzimy wtedy na strone php tworzaca nowy plik z IP i tez mamy SERWER

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