Entwickler-Ecke

Internet / Netzwerk - Indy


Baumunk - Di 25.10.05 12:37
Titel: Indy
Hallo,

Immer wieder TCP/IP mit Indy,

Ich kriege nicht in lauf fahrscheinlich elementare sache:

Ich muss Daten senden von TidTCPServer zu TIdTCPClient

Server :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm2.IdTCPServer1Execute(AContext: TIdContext);
Var S : TSendRecord;
    memVCL : TidStreamVCL;
    mem    : TMemoryStream;
begin
  If Not AContext.Connection.IOHandler.Readable Then Exit;

  Value := AContext.Connection.IOHandler.ReadInteger;
  AContext.Connection.IOHandler.Write(Integer (100));
  S.A := 'IntToStr = ' + IntToStr (Value);
  mem    := TMemoryStream.Create;
  memVCL := TidStreamVCL.Create(mem);
  mem.Write(S, SizeOf (s));
  memVCL.Position := 0;

  AContext.Connection.IOHandler.Write (memVCL, memVCL.Size);
  memVCL.Free;
  mem.Free;
end;


Da läuft's noch:

Client :

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
Var S : TSendRecord;
    memVCL : TidStreamVCL;
    mem    : TMemoryStream;
    I      : Integer;
begin
  IdTCPClient1.IOHandler.Write (Integer (100));
  While Not IdTCPClient1.IOHandler.Readable Do Begin { Schleife }
  End;

  If IdTCPClient1.IOHandler.Readable Then Begin
    mem    := TMemoryStream.Create;
    memVCL := TidStreamVCL.Create(mem);
    I := IdTCPClient1.IOHandler.ReadInteger;
    IdTCPClient1.IOHandler.ReadStream(memVCL, SizeOf (S));
    memVCL.Position := 0;
    mem.Read(S, SizeOf (S));
    Memo1.Lines.Add(S.A);
    memVCL.Free;
    mem.Free;
  End;


Bei der { Schleife } bleib er hängen, es gibts IdTCPClient1.IOHandler.Readable nur False.

Konnte mir jemand sagen was da falsch wäre oder noch besser Funktionierende beispiel geben, wo daten von Server zu gesendet und empfangen können.


Baumunk - Di 25.10.05 17:40

Kleine Korrektur

Anstatt zeilen 7 - 20


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
  While Not IdTCPClient1.Socket.Readable (0Do Begin
    Application.ProcessMessages;
  End;


  If IdTCPClient1.Socket.Readable (0Then Begin
    mem    := TMemoryStream.Create;
    memVCL := TidStreamVCL.Create(mem);
    I := IdTCPClient1.IOHandler.ReadInteger;
    IdTCPClient1.IOHandler.ReadStream(memVCL, SizeOf (S));
    memVCL.Position := 0;
    mem.Read(S, SizeOf (S));
    Memo1.Lines.Add(S.A);
    memVCL.Free;
    mem.Free;
    IdTCPClient1.IOHandler.Close;
  End;


Das funktioniert ja, jedoch es muss permanent nach anfrage von dem Server Verbindung geschlossen!

Ist es ein Bug von Indy oder kann es ohne die Verbindung schliesssen und wieder offnen gemacht?

Ich wäre sehr dankdar, wenn jemand mir den Tipp, hinweis, wie ich das schreiben soll!!