Einzelnen Beitrag anzeigen

bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.120 Beiträge
 
Delphi 11 Alexandria
 
#1

Indy 10 / streams via tcp ip senden

  Alt 12. Nov 2011, 00:09
meine Demoprojekt zum Verschicken und Empfangen von Streams mit INDY 10 spielt leider nicht, die Verbindung wird abgebrochen, ich kann den Fehler im Code nicht erkennen ....

Delphi-Quellcode:


var aFs : TFileStream

....
..


///
/// demo server empfängt einen stream und sendet einen stream zurück
///


procedure TStreamServerForm.IdTCPServer1Execute(AContext: TIdContext); var
   LSize: LongInt;
begin

   Memo1.Lines.Add('Server starting .... ' );


    AContext.Connection.IOHandler.ReadTimeout := 9000;

   if ( ReceiveStream(AContext, TStream(afs)) = False ) then
   begin
     TIdNotify.NotifyMethod(ShowCannotGetStreamErrorMessage);
     Exit;
   end;


   TIdNotify.NotifyMethod(StreamReceived);


   if ( SendStream(AContext,TStream(afS)) = False ) then
   begin
     TIdNotify.NotifyMethod(ShowCannotSendStreamrErrorMessage);
     Exit;
   end;

   Memo1.Lines.Add('Server done .... ' );

end;


///
/// demo client schickt einen stream und einen bekommt einen anderen zurück ///
///

procedure TStreamExchangeClientForm.Button_SendStreamClick(Sender: TObject); var LSize: LongInt; begin

LSize := 0;

Memo1.Lines.Add('Try send stream to server.....');

   if (SendSTream(IdTCPClient1, TStream(afs)) = False) then
   begin
     Memo1.Lines.Add('Cannot send stream/buffer to server.');
     Exit;
   end;

   if (ReceiveStream(IdTCPClient1, TStream(afs)) = False) then
   begin
     Memo1.Lines.Add('Cannot get "OK" message from server, Unknown error occured');
     Exit;
   end;

   image1.Picture.Bitmap.LoadFromStream(afs);


end;

-----------------------------------------------------------------------------

      die low level indy routinen .....

------------------------------------------------------------------------------

function SendStream(AContext: TIdContext; AStream: TStream): Boolean; overload; begin
   Result := False;
   try
     AContext.Connection.IOHandler.Write(LongInt(SizeOf(AStream)));
     AContext.Connection.IOHandler.WriteBufferOpen;
     AContext.Connection.IOHandler.Write(AStream, SizeOf(AStream));
     AContext.Connection.IOHandler.WriteBufferFlush;
   finally
     AContext.Connection.IOHandler.WriteBufferClose;
   end;
   Result := True;
end;



function ReceiveStream(AContext: TIdContext; var AStream: TStream):
Boolean; overload;
var
   LSize: LongInt;
begin
   Result := False;
   LSize := AContext.Connection.IOHandler.ReadLongInt();
   AContext.Connection.IOHandler.ReadStream(AStream, LSize, False);
   Result := True;
end;


function ReceiveStream(AClient: TIdTCPClient; var AStream: TStream):
Boolean; overload;
var
   LSize: LongInt;
begin
   Result := False;
   LSize := AClient.IOHandler.ReadLongInt();
   AClient.IOHandler.ReadStream(AStream, LSize, False);
   Result := True;

end;

function SendStream(AClient: TIdTCPClient; AStream: TStream): Boolean;
overload;
var StreamSize : LongInt;
begin

   Result := True;
   try
     StreamSize := (AStream.Size);

     AStream.Seek(0, soFromBeginning);

     AClient.IOHandler.LargeStream := True;
     AClient.IOHandler.SendBufferSize := 32768;
     AClient.IOHandler.Write(LongInt(StreamSize));
     AClient.IOHandler.WriteBufferOpen;
     AClient.IOHandler.Write(AStream, LongInt(StreamSize));
     AClient.IOHandler.WriteBufferFlush;
   finally
     AClient.IOHandler.WriteBufferClose;
   end;
   Result := True;
end;
  Mit Zitat antworten Zitat