Einzelnen Beitrag anzeigen

CocoPops
(Gast)

n/a Beiträge
 
#1

TIdTCPServer und -Client - senden und empfangen

  Alt 1. Apr 2014, 19:09
Liebe DP!

Ich stecke momentan an einem etwas, für mich, größerem Problem fest.

Ich habe zei Programme, einmal Server einmal Client.
Gehen wir davon aus, ich sei schon verbunden.

Sehr einfach gestrickt könnte der CLient so senden: IdTCPClient1.Socket.WriteLn('Bernhard'); .
Und der Server könnte im OnExecute-Event so antworten: AContext.Connection.Socket.WriteLn('Hallo ' + AContext.Connection.Socket.ReadLn); // Hallo Bernhard .

Ich habe etwas von WriteBuffer und ReadBuffer gelesen. Das gibt es in Indy 10 abr nicht mehr also musste ich ein wenig umstricken (Google half mir):

Ich sende mit dem Client ein paar Bytes:
Delphi-Quellcode:
// Client : sendet Byte
procedure WriteByte(Value: Byte);
var
 Buf: TIdBytes;
begin
 Buf := IdGlobal.RawToBytes(Value, SizeOf(Value));
 IdTCPClient1.IOHandler.Write(Buf);
end;
Und im Server empfange ich diese auch korrekt:
Delphi-Quellcode:
// Server : empfaengt Byte
function ReadByte: Byte;
var
 aData: TIdBytes;
begin
 AContext.Connection.IOHandler.ReadBytes(aData, SizeOf(Byte));
 Move(aData[0], PByte(@Result)[0], Length(aData));
end;
Aber wie funktioniert das mit Strings? Momentan sende ich folgendermaßen:
Delphi-Quellcode:
// Client : sendet String
procedure WriteString(Value: string);
// var
// Buf: TIdBytes;
begin
 // Buf := IdGlobal.RawToBytes(Value, SizeOf(Value));
 IdTCPClient1.IOHandler.Write(Value);
end;
Aber beim empfangen tut sich nichts und das Execute-Event bleibt hängen:
Delphi-Quellcode:
// Server : empfaengt String (nicht)
function ReadString: string;
begin
 Result := AContext.Connection.IOHandler.ReadString(ReadByte); // ReadByte = siehe "Server : empfaengt Byte"
end;

Was mache ich falsch und welches ist die bessere Methode? Mit den Buffern oder einfach Socket.WriteLn, Socket.ReadLn ?

Geändert von CocoPops ( 1. Apr 2014 um 19:43 Uhr)
  Mit Zitat antworten Zitat