big streams with DataSnap

前端 未结 1 824
心在旅途
心在旅途 2021-01-06 08:10

I\'m trying to transfer some big streams (~1Mb) between DataSnap server/client but to no avail. I\'m trying to understand the code of Jim Tierney (http://blogs.embarcadero.c

相关标签:
1条回答
  • 2021-01-06 08:36

    Actually, i think i`ve got it. I'm posting this as an answer maybe somebody else need this.

    procedure TfrmMain.butStreamClick(Sender: TObject);
    const
      iBufSize = 128;
    var
      sStr : TStream;
      sMem : TMemoryStream;
      buf: PByte;
      iRead: integer;
    begin
      cycleConnection;
    
      with TsrvMethodsClient.Create( SQLConn.DBXConnection, False ) do begin
    
        sStr := getStream( 500000 ); //500k stream
    
        GetMem(buf, iBufSize);
        sMem := TMemoryStream.Create;
        try
          repeat
            iRead := sStr.Read( Pointer(buf)^, iBufSize);
    
            if iRead > 0 then sMem.WriteBuffer( Pointer(buf)^, iRead);
            if iRead < iBufSize then break;
          until iRead < iBufSize;
        finally
          FreeMem(buf, iBufSize);
        end;
    
        Free;
      end;
      FreeAndNil(sStr);
      FreeAndNil(sMem);
    end;
    

    P.S.

    Searching through DataSnap code samples i`ve found that one (speed related) improvement would be to have iBufSize set to 61440 (or equivalent hex value $F000) which seems to be the biggest size can be received in one go. If receiving stream is bigger then reported size will be -1 and the code above is needed to read the entire stream.

    0 讨论(0)
提交回复
热议问题