Czat w Delphi - Aplikacja Klient-Serwer

0

Witam wszystkich użytkowników forum.
Chciałbym prosić o pomoc od osób znających się na pisaniu programów sieciowych w Delphi.
Mój problem to czat. Wiem jak napisać komunikator z wykorzystaniem socketów.
Mój problem polega na tym, że chciałbym wysłaną wiadomość do serwera przesłać do wszystkich połączonych klientów.
Jak to zrobić?
Program serwera byłby umieszczony na jakimś serwerze dedykowanym i działał 24/7 (tylko nie wiem jak by się to sprawdziło przy dużej ilości uzytkowników).
Oczywiście program piszę dla siebie, w ten sposób ucze się.

Proszę o odpowiedź na moje pytanie.
Pozdrawiam, Writen

0

Np: Co logowanie jakieś użytkownika, dopisuj jego nick do bazy danych (np. tablicy "string'ów") i na odwrót (po wylogowaniu - usuwaj go z bazy).

Pozdrawiam ;-)

0

Mój problem polega na tym, że chciałbym wysłaną wiadomość do serwera przesłać do wszystkich połączonych klientów.
Jak to zrobić?

Zastaniawia mnie czy wy umiecie czytać ze zrozueminiem.

0
writen napisał(a)

Mój problem polega na tym, że chciałbym wysłaną wiadomość do serwera przesłać do wszystkich połączonych klientów.
Jak to zrobić?

Zastaniawia mnie czy wy umiecie czytać ze zrozueminiem.

a co to jest ten "serwer"?? To twój programik? Jeśli tak to nie rozumiem w ogóle pytania - odebrać i rozesłać do wszystkich podłączonych klientów - nie wiem co tu chcesz wymyślać

0

Hmm, jeżeli nie rozumiesz to chyba znaczy że nie wiesz co to jest Dlephi.
Piszę własny program klient-serwer (dwie osobne aplikacje), używam komponentów ClientSocket i ServerSocket.
Chcę żeby po wysłaniu wiadomości z klienta do serwera została ona przekazana wszystkim podłączonym klientom.
Jakiej procedury mam użyć w programie serwera, aby to zrobić ?

0
writen napisał(a)

Hmm, jeżeli nie rozumiesz to chyba znaczy że nie wiesz co to jest Dlephi.

skoro jesteś taki znawca to zapewne wiesz też, że w Delphi jest coś takiego jak HELP - wystarczy chcieć i poświęcić chwilkę na przeczytanie go aby znaleźć tam odpowiedź

EOT

0
writen napisał(a)

Jakiej procedury mam użyć w programie serwera, aby to zrobić ?

SendMsgToAll

0

Ja zrobiłem inne rozwiązanie, bo akurat tylko takie znam, jako aplikację internetową, czyli przeglądarka internetowa bez apletów. Wysyłana wiadomość jest zapisywana w bazie danych a każdy klient ma timer który przez ajax sprawdza co sekundę czy jest nowy dopisek w bazie i jeśli jest to go wyświetla. Ajax wymaga jedynie około 2 kB na sekundę jeśli nie ma nowych dopisków.

0
Mariusz Jędrzejowski napisał(a)

Ja zrobiłem inne rozwiązanie, bo akurat tylko takie znam, jako aplikację internetową, czyli przeglądarka internetowa bez apletów. Wysyłana wiadomość jest zapisywana w bazie danych a każdy klient ma timer który przez ajax sprawdza co sekundę czy jest nowy dopisek w bazie i jeśli jest to go wyświetla. Ajax wymaga jedynie około 2 kB na sekundę jeśli nie ma nowych dopisków.

Nie muszę mówić, że jest to oczywiście złe rozwiązanie, a do Delphi ma się jak pięść do oka. Podpowiem - Ajax może otrzymywać jakieś komunikaty z serwera. Jak to zrobić nie wiem, wiem, że może :)

0

Chciałbym to napisać w "czystym" Delphi. Pisałem już czaty w Ajax'ie, ale szukam nowych rozwiązań.

0

Chcesz gotowy kod na to rozwiązanie? 300 zł i ci go podeśle. Jeśli chcesz za free to zacznij czytać i szukać misked napisał Ci gdzie jest odpowiedź i to powinno ci wystarczyć.

0

nie prościej użyć starego INDY - TCPServer.ReadBuffer/.WriteBuffer ?

0
Juhas napisał(a)
Mariusz Jędrzejowski napisał(a)

Ja zrobiłem inne rozwiązanie, bo akurat tylko takie znam, jako aplikację internetową, czyli przeglądarka internetowa bez apletów. Wysyłana wiadomość jest zapisywana w bazie danych a każdy klient ma timer który przez ajax sprawdza co sekundę czy jest nowy dopisek w bazie i jeśli jest to go wyświetla. Ajax wymaga jedynie około 2 kB na sekundę jeśli nie ma nowych dopisków.

Nie muszę mówić, że jest to oczywiście złe rozwiązanie, a do Delphi ma się jak pięść do oka. Podpowiem - Ajax może otrzymywać jakieś komunikaty z serwera. Jak to zrobić nie wiem, wiem, że może :)

Może z apletami da się to zrobić ale bez nich do przeglądarki nie da się wysłać danych bez żądania ich pobrania przez przeglądarkę, czyli nie da się do niej pchnąć danych. Musi być jakieś żądanie z przeglądarki i to żądanie jest realizowane przez timer w przeglądarce który wywołuje procedurę z serwera który przesyła dane. Apletów jednak nie używam bo za dużo do uczenia się a i tak animacji nie zrobię w nich bez grafika, więc wystarczy prosty układ strony.

0
Mariusz Jędrzejowski napisał(a)

Może z apletami da się to zrobić ale bez nich do przeglądarki nie da się wysłać danych bez żądania ich pobrania przez przeglądarkę

Sprawdź chociażby, jak działa serwiz za10groszy.pl
Albo nawet ten głupi śledzik na NK ;>

0
Juhas napisał(a)
Mariusz Jędrzejowski napisał(a)

Może z apletami da się to zrobić ale bez nich do przeglądarki nie da się wysłać danych bez żądania ich pobrania przez przeglądarkę

Sprawdź chociażby, jak działa serwiz za10groszy.pl
Albo nawet ten głupi śledzik na NK ;>

Jest tak, jak mówiłem. Zobacz na źródło tych stron i jak byk jest w kodzie "timer", czyli timer po stronie klienta regularnie wysyła żądania do serwera.

0

Widzę że z tego tematu robi się dyskusja zupełnie o czymś innym.
To ma być czat bez pośrednictwa strony internetowej.
I tak nie ma sensu dłużej tego ciągnąć.

0
for I := 0 to High(Server.Socket.ActiveConnections)
  Server.Socket.Connections[I].SendText('To jest takie proste wyslac wiadomosc');

Jesli uzywasz > D2009 to trzeba lekko modyfikować odbiór ze względu na AnsiString

0

No, teraz jest moda na aplikacje internetowe, bo nie każdy chce uruchamiać program exe bo ma za duże możliwości. Nie wiem jak jest w tych nowych windowsach, może tam aplikacja dostaje małe uprawnienia i nie może za dużo popsuć ani szpiegować.

0
for I := 0 to High(Server.Socket.ActiveConnections)
  Server.Socket.Connections[I].SendText('To jest takie proste wyslac wiadomosc');

To działa, ale nie do końca...
Wiadomość jest niestety wysyłana tylko do jednego klienta, do tego który był jako pierwszy podłączony.
Nie wiecie co z tym zrobić ?

0
writen napisał(a)

for I := 0 to High(Server.Socket.ActiveConnections)
Server.Socket.Connections[I].SendText('To jest takie proste wyslac wiadomosc');

> To działa, ale nie do końca...
> Wiadomość jest niestety wysyłana tylko do jednego klienta, do tego który był jako pierwszy podłączony. 
> Nie wiecie co z tym zrobić ?


to dziala, po prostu ty schrzaniles  ;-P
0

lol, jednak ja.
tam mialo byc High(socket.connestions)

0

Wszystko mi się udało zrobić.
Koniec dyskusji.
Dziekuję wszystkim za udzielenia się w tym temacie.

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