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 ?