Einzelnen Beitrag anzeigen

Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#1

Stream mit Indys versenden

  Alt 16. Dez 2004, 23:09
Ich habe schon viel versucht, aber ich komme einfach nicht weiter ...

Wie kann ich mit TIdTCPServer und TIdTCPClient einen Stream korrekt versenden ???

Mein letzter Versuch:
Delphi-Quellcode:
procedure showstream (Stream: TStream);
var
 MsgRecord: TMsgRecord;
begin
 Stream.Position := 0;
 FillMsgRecordFromStream (Stream, Msgrecord);
 form1.Memo1.Text := form1.Memo1.Text + 'Command: ' + inttostr(ord(MsgRecord.Command)) + #13#10 + 'SendBy: ' + MsgRecord.SendBy + #13#10 + 'Message:' + #13#10 + MsgRecord.Msg + #13#10#13#10;
 Stream.Position := 0;
end;
Delphi-Quellcode:
procedure FillMsgRecordFromStream (Stream: TStream; var MsgRecord: TMsgRecord);
var
 Len: LongInt;
begin
  Stream.Read (MsgRecord.Command, SizeOf (MsgRecord.Command));
  Stream.Read (MsgRecord.SendBy, SizeOf (MsgRecord.SendBy));
  Stream.Read (MsgRecord.FontColor, SizeOf (MsgRecord.FontColor));

  Stream.Read (Len, SizeOf (Len));
  SetLength (MsgRecord.FontName, Len);
  Stream.Read (PChar (MsgRecord.FontName)^, Len);

  Stream.Read (MsgRecord.FontSize, SizeOf (MsgRecord.FontSize));
  Stream.Read (MsgRecord.FontStyle, SizeOf (MsgRecord.FontStyle));

  Stream.Read (Len, SizeOf (Len));
  SetLength (MsgRecord.Msg, Len);
  Stream.Read (PChar (MsgRecord.Msg)^, Len);
end;
Delphi-Quellcode:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
 Stream2: TStream;
begin
 Stream2 := TStringStream.Create;
 Memo1.Lines.Add('Reading ...');
try
 stream2.Position := 0;
 AThread.Connection.ReadStream(Stream2);
 Memo1.Lines.Add('Done. Processing ...');
except
 Memo1.Lines.Add('Failed. Processing ...');
end;
 showstream (stream2);
 Memo1.Lines.Add('Done.');
 Stream2.Free;
end;
Zum versenden:
Delphi-Quellcode:
procedure TForm1.Button8Click(Sender: TObject);
var
 MsgRecord: TMsgRecord;
 Stream2: tStream;
begin
  MsgRecord.Command := TXT;
  MsgRecord.SendBy := 'Julius';

  MsgRecord.FontColor := FontDialog1.Font.Color;
  MsgRecord.FontName := FontDialog1.Font.Name;
  MsgRecord.FontSize := FontDialog1.Font.Size;
  MsgRecord.FontStyle := FontDialog1.Font.Style;

  MsgRecord.Msg := Edit1.Text;

  stream2 := TStringStream.Create;

  fillstreamfrommsgrecord (Msgrecord, stream2);

  Stream2.Position := 0;

  IDTCPClient1.WriteStream (stream2, TRUE, TRUE, 0);

  stream2.Position := 0;

  showstream (stream2);

  stream2.Free;
end;
Mit
Delphi-Quellcode:
procedure FillStreamFromMsgRecord (MsgRecord: TMsgRecord; var Stream: TStream);
var
 Len: LongInt;
begin
  Stream.Write (MsgRecord.Command, SizeOf (MsgRecord.Command));
  Stream.Write (MsgRecord.SendBy, SizeOf (MsgRecord.SendBy));
  Stream.Write (MsgRecord.FontColor, SizeOf (MsgRecord.FontColor));

  Len := Length (MsgRecord.FontName);
  Stream.Write(Len, SizeOf (Len));
  Stream.Write (PChar (MsgRecord.FontName)^, Len);

  Stream.Write (MsgRecord.FontSize, SizeOf (MsgRecord.FontSize));
  Stream.Write (MsgRecord.FontStyle, SizeOf (MsgRecord.FontStyle));

  Len := Length (MsgRecord.Msg);
  Stream.Write(Len, SizeOf (Len));
  Stream.Write (PChar (MsgRecord.Msg)^, Len);
end;
Er verhält sich äuserst merkwürdig:
Beim connect vom Client wird beim Server OnExecute ausgelöst, si bleibt bei dem ReadStream einfach stehen (hört auf. Reagiert noch, alles danach wird nicht mehr beachtet.)
Beim Senden von Daten wird das vorherige Ereignis abgearbeitet (wiedereinstieg nach readstream mit korrekten daten) und das jetzt eingetretene bleibt wiederum bei readstream stehen.

Es wäre toll, wenn mir jemand ein Beispiel posten könnte,
in dem konkret ein vorhandener Stream mit den Indy-TCPs versendet wird.
  Mit Zitat antworten Zitat