Aplikacja klient-serwer (komponenty IdTCPServer i IdTCPClient)

0

Witam.

Kombinuje kombinuje i wykombinować nie mogę :) A przejrzałem już mnóstwo stron.

Więc tak mam serwer i klienta. Serwer odbiera wszystko ok, nawet odsyła wiadomość do aktualnego klienta, ale za piernika nie wiem jak wysłać wiadomość do wszystkich pozostałych podłączonych klientów. Czy jest jakaś możliwość odwołania się do konkretnego wątku? Jeśli tak to jak? Generalnie chciałbym wysłać wiadomość do wszystkich klientów jednocześnie, ale docelowo i tak będzie mnie interesować dojście do konkretnego wątku.

Póki co mam taki kod:

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
tekst:string[255];
begin
AThread.Connection.ReadBuffer(tekst,sizeof(tekst));
Memo1.Lines.Add(tekst);
tekst:=tekst+IntToStr(AThread.ThreadID);
AThread.Connection.WriteBuffer(tekst,sizeof(tekst),true);
end;
0

nikt nie ma pomysłu? ;)

0

Jeżeli porzucił byś Indyka na rzecz rozwiązania pure WinAPI, to polecam moduł SimpleTCP i za pewne działający przykład: http://piechnat.pl/index.php/files/highlight/tools/simpletcp/Server.dpr - który w krótkim kodzie pokazuje właśnie odsyłanie do wszystkich połączonych klientów to co otrzymał. Wiadomo oczywiście, żę do obkodowania zdarzeń i sprawdzania wielu rzeczy trzeba będzie naklepać więcej kodu, niż może udostepniają gotowe zdarzenia i własności komponentów z pakietu Indy. Ale za to o ile mniejszy program i większą kontrolę masz nad tym co chcesz zrobić, bo wiele rzeczy można dokładniej wyrzeźbić. Ale oczywiście moze link, ktory podal @kAzek bardziej się Tobie przyda. Ja znam też ten przykład, do ktorego podałem linka, a więc się dzielę. Gdyby ktoś szukał alternatywnego rozwiązania.

0

pomysł usera kAzek okazał się pomocny, bo coś się już ruszyło, jednak nadal nie jest to co bym chciał :(

do serwera wiadomość idzie ok, ale u userów już wygląda to gorzej

przyklad:

user 1 : text1 (pojawia się tylko u usera1)
user 2: text2 (pojawia się dopiero wtedy tekst od usera1 ale nie pojawia się w ogóle tekst usera 2 )
user 2: text3 (wtedy pojawia się dopiero text2 czyli pierwsza wiadomość usera 2)

i tak w kółko , niby dyskusja jest odtwarzana, ale z sporym opóźnieniem

zbudowałem taki kod:

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
tekst:string[255];
clients:TList;
i:integer;
begin
AThread.Connection.ReadBuffer(tekst,sizeof(tekst));
Memo1.Lines.Add(tekst);
tekst:=tekst+IntToStr(AThread.ThreadID);
//if not Assigned(IdTCPServer1.Threads) then exit;
Clients:=IdTCPServer1.Threads.LockList;
  try
    for i := 0 to Clients.Count-1 do
        TIdPeerThread(Clients[i]).Connection.WriteBuffer(tekst,sizeof(tekst),true);
  finally
    IdTCPServer1.Threads.UnlockList;
  end;
end;

I co z tym fantem począć? Lista wątków już niby działa, ale dalej nie tak jak powinna...

p.s.
olesio póki co zostaje przy Indy

0

wygląda na to, że gdy wysyłam wiadomość do serwera on mi zwraca też tylko jedną kolejną wiadomość...

0

serwer śmigał poprawnie, a po stronie klienta odbiór załatwiłem za pomocą Timera...bez pętli :)

procedure TForm1.Timer1Timer(Sender: TObject);
var
  tekst:string[255];
begin
  Timer1.Enabled := False;
  IdTCPClient1.ReadFromStack(True, 0, False);
  while IdTCPClient1.InputBuffer.Size > 0 do
  begin
    IdTCPClient1.ReadBuffer(tekst,sizeof(tekst));
    Memo1.Lines.Add(tekst);
  end;
  Timer1.Enabled := True;
end;

no i komunikacja gra jak ta lala :)

temat do zamknięcia

sformatowanie kodu - fp

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