Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Stream über Indy 10 senden (https://www.delphipraxis.net/177499-stream-ueber-indy-10-senden.html)

1aa 9. Nov 2013 21:26

Stream über Indy 10 senden
 
Problem:

Erstellter Stream lässt sich nict auf den Socket schreiben es kommt die fehlermeldung : "Keine Daten für den Lesezugriff!"

Code:
Delphi-Quellcode:
 type
  TDatensatz = record
    ID: integer;
    Name: AnsiString;
  end;

  TDatenArray = array of TDatensatz;
.....
  FSocket: TIdTCPClient;

......
var hStream :TStream;
    hSize : Integer;
    Daten : TDatenArray;
begin
  SetLength(Daten, 1);
  Daten[0].ID := 1;
  Daten[0].Name := 'Ein Name';
  hSize := SizeOf(Daten);
    hStream := TMemoryStream.Create;
    hStream.WriteBuffer(Daten, hSize);

  FSocket.Socket.WriteBufferOpen;
  FSocket.Socket.Write(hStream,hSize);
  FSocket.Socket.WriteBufferFlush;
  FSocket.Socket.WriteBufferClose;

  hStream.free;
fSocket ist verbunden.

himitsu 9. Nov 2013 21:55

AW: Stream über Indy 10 senden
 
Delphi-Quellcode:
hStream.WriteBuffer(Daten, hSize);
hStream.Position := 0;
Setze mal den Positionszeiger wieder auf den Anfang des Streams. :gruebel:

[add]
Aber das Scheiben der Daten ist definiv auch noch falsch, denn du scheibst nur den Array-Pointer in den Stream.
Hast du dich denn noch nicht gewundert, daß immer nur 4 Byte im Stream laden, egal wieviele Daten in dem Array drin sind?

Delphi-Quellcode:
hStream.WriteBuffer(Daten[0], Length(Daten) * SizeOf(TDatensatz));
// oder
hStream.WriteBuffer(Daten[0], Length(Daten) * SizeOf(Daten[0]));

1aa 9. Nov 2013 22:11

AW: Stream über Indy 10 senden
 
ok danke
Delphi-Quellcode:
hStream.Position := 0;
hat das problem gelöst^^ arbeite mich gerade erst in TStream ein.

[Edit]

der empfang müsste dann demendsprechend auf server seite
Delphi-Quellcode:
fContext.Connection.Socket.ReadStream(aStream,size);
sei oder?

mjustin 10. Nov 2013 14:39

AW: Stream über Indy 10 senden
 
Die Klasse TIdTCPClient hat eine Property IOHandler, in denen die Funktionen zum Lesen / Schreiben aus / in Sockets enthalten sind. (Damit geht es einfacher als mit den Low-Level Funktionen.)

1aa 11. Nov 2013 00:02

AW: Stream über Indy 10 senden
 
ok dann bin ich wahrscheinlich zublöd die zufinden....
hast du ev mal ein bsp?

4dk2 11. Nov 2013 15:02

AW: Stream über Indy 10 senden
 
ich denke mjustin meint IOHandler.Write(WasAuchImmer)
Delphi-Quellcode:
  IdTCPClient1.IOHandler.Write(streamTest);
für den Client

am Server dann :

Delphi-Quellcode:
procedure TForm1.IdIOHandlerStream1GetStreams(ASender: TIdIOHandlerStream;
  var VReceiveStream, VSendStream: TStream);
begin

end;
oder schau mal bei http://www.delphipraxis.net/39752-st...indy-10-a.html
vorbei
:-D

1aa 11. Nov 2013 23:54

AW: Stream über Indy 10 senden
 
ok dann bin ich doch nicht zu doof... die habe ich auch schon gefunden :
Delphi-Quellcode:
  FSocket.Socket.Write(hStream,hSize);
und siehe Oben verwende sie auch
ob ich jetzt über socket schreibe oder über IOHandler konnte ich noch keine veränderung feststellen... werd aber beides noch mal testen...
die server procedure klingt interessant schau ich mir auch mal an danke....


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:48 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