Thema: Delphi Indy TCPServer -> Client

Einzelnen Beitrag anzeigen

Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#13

Re: Indy TCPServer -> Client

  Alt 20. Jun 2005, 16:45
Zitat von hardy1234:
Zitat von Neutral General:
Ja ich denke das würde gehen aber geht es nicht anders ?
Im Notfall würde ich das machen ...
Das mit dem Server beim Client lass mal, das wird nix. Gesetzt den Fall du wolltest das Ding im Inet betreiben und sitzt hinter nem router(gilt natürlich auch für andere User), würdest du durch den router durch keine Connection zu deinem Server(dem beim Client hinkriegen. Der router sperrt i.d.R. jeden Zugang von außen.

Nun zum problem mot dem lesen beim Client. Die beste und auch einfachste Lösung ist es, einen Timer zu benutzen. 300ms haben sich als praktikabler Wert erwiesen. Den initialisiertst du, bevor du den Client-Connect durchführst.
Das sieht als Code etwa so aus:

Delphi-Quellcode:
{/////////////////////////////////////////}
{*** data available and read/send data ***}
{/////////////////////////////////////////}

function NetworkDataAvailable(ACon: TIdTCPConnection): boolean;
begin
  RWSynchro.BeginRead; {*** darf auch TCriticalSection sein ***}
  if ACon.Connected then begin
    Result := ACon.InputBuffer.Size > 0;
    if not Result then begin
      try
        ACon.ReadFromStack(False, 1, False);
        Result := ACon.InputBuffer.Size > 0;
      except
        Result:= false;
      end;
    end; // of if not Result then begin
  end // of if ACon.Connected then begin
  else Result := False;
  RWSynchro.EndRead;
end; // of function NetworkDataAvailable(ACon: TIdTCPConnection): boolean

procedure TChatClt.LookForData(Sender: TObject);
begin
  if FTCPClient.Connected then begin
    FDataAvailable:= NetworkDataAvailable(FTCPClient);
    if FDataAvailable then DoReceiveData;
  end; // of if FTCPClient.Connected then begin
end; // of procedure TChatClt.LookForData(Sender: TObject)

procedure TChatClt.DoReceiveData(Sender: TObject);
var
  FStream: TMemoryStream;
begin
  FStream:= TMemoryStream.Create;
  {*** hier daten einlesen, am prakikabelsten ist ein stream ***}
  {*** dann können auch verschlüsselungen benutzt werden     ***}
  {*** Bsp.: ***}
  FTCPClient.ReadStream(FStream, -1, false);
  {*** ab hier verarbeiten ***}
end;
Ui... das haut mich um^^ Ich weiß nicht wirklich was damit anzufangen weil ich kaum was davon verstehe
Michael
  Mit Zitat antworten Zitat