AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Stream mit Indys versenden
Thema durchsuchen
Ansicht
Themen-Optionen

Stream mit Indys versenden

Ein Thema von jfheins · begonnen am 16. Dez 2004 · letzter Beitrag vom 20. Dez 2004
Antwort Antwort
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
Benutzerbild von jfheins
jfheins

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

Re: Stream mit Indys versenden

  Alt 18. Dez 2004, 00:24
***PUSH***
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

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

Re: Stream mit Indys versenden

  Alt 19. Dez 2004, 16:11
In den Logs (showstream macht immer einen Logeintrag) steht:

Server:
Zitat:
Incoming Connect
Reading ...
Done. Processing ...
Command: 3
SendBy: Julius
Message:


Done.
Reading ...
Done. Processing ...
Command: 3
SendBy: Julius
Message:
Hallo Welt

Done.
Reading ...
Client:
Zitat:
Connecting ...
Command: 3
SendBy: Julius
Message:


Command: 3
SendBy: Julius
Message:
Hallo Welt
Kann mir denn keiner Helfen ???
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

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

Re: Stream mit Indys versenden

  Alt 20. Dez 2004, 16:20
*PUSH-Button dringend brauche ...*
  Mit Zitat antworten Zitat
skyware

Registriert seit: 11. Dez 2002
Ort: Wetzikon, Zürich
151 Beiträge
 
Delphi 6 Enterprise
 
#5

Re: Stream mit Indys versenden

  Alt 20. Dez 2004, 16:59
versuchs doch mal so...

clientseitig (FTCPConnection: TIdTCPClient)

Delphi-Quellcode:
    with FTCPConnection do
    begin
      //Daten an Server übermitteln
      xSendStream := TStringStream.Create(xDataString);
      try
        OpenWriteBuffer;
        try
          WriteStream(xSendStream, true, true);
        finally
          CloseWriteBuffer;
        end;
      finally
        xSendStream.Free;
      end;

      //Antwort von Server auslesen
      xReadStream := TStringStream.Create('');
      try
        xSize := ReadInteger;
        ReadStream(xReadStream, xSize, true);
        xReadStream.Seek(0, soFromBeginning);
        AReceiveVariant := xReadStream.DataString;
      finally
        xReadStream.Free;
      end;
    end;
serverseitig:

Delphi-Quellcode:
{ TMainFormTCP.OnTCPServerClientExecute:
-------------------------------------------------------------------------------}

procedure TMainFormTCP.OnTCPServerClientExecute(AThread: TIdPeerThread);
var
  xReadString : Variant;
  xSendStream : TStringStream;
  xStringStream : TStringStream;
  xSize : integer;
begin
  with AThread.Connection do
  begin
    try
      //Antwort von Client auslesen
      xStringStream := TStringStream.Create('');
      try
        xSize := ReadInteger;
        ReadStream(xStringStream, xSize);
        xReadString := xStringStream.DataString;
      finally
        xStringStream.Free;
      end;

      if (xReadString <> '') then
      begin
        //etwas anstellen mit xReadString
        
        //Resultat an Client übermitteln
        xSendStream := TStringStream.Create(xReadString);
        try
          OpenWriteBuffer;
          try
            WriteStream(xSendStream, true, true);
          finally
            CloseWriteBuffer;
          end;
        finally
          xSendStream.Free;
        end;
      end;
    finally
      Disconnect;
    end;
  end;
end;
hoffe du kannst davon was gebrauchen?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz