Thema: Delphi Indy TCPServer -> Client

Einzelnen Beitrag anzeigen

hardy1234

Registriert seit: 8. Aug 2004
Ort: Hamburg
26 Beiträge
 
Delphi 7 Enterprise
 
#12

Re: Indy TCPServer -> Client

  Alt 20. Jun 2005, 01:07
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;
Es gibt keinen schöneren Tag als den heutigen. Der gestrige ist vorbei und von den kommenden weiß man nicht was sie bringen.
  Mit Zitat antworten Zitat