DataSnap 用TStream 传递大数据 返回流大小为-1的情况
生活随笔
收集整理的這篇文章主要介紹了
DataSnap 用TStream 传递大数据 返回流大小为-1的情况
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?????? DataSnap可以直接傳遞和返回TStream類型的參數,這點是很方便的。但是很多人發現好像大小稍微大點就工作不正常了,就變相使用其它類型轉換來轉換去,這樣便利性就失去了。
??????? 官方有篇博客很詳細的介紹了stream的使用,英文好的可以去看下DataSnap Server Method Stream Parameters
??????? DataSnap默認的緩存大小是32k 所以如果流的大小超過這個大小就會被自動分成多個包,這就是傳遞大量數據的基礎,如果一次性發送就可能受到內存的限制。
??????? 當傳遞大量數據時獲取到的大小是-1,所以如果還是按照一般的方法來讀取流的數據就會有問題了。
??????? 下面是一個服務端代碼的示例參考,稍加修改就可以傳遞文件到服務端,由于流的數據是原始數據包發送,所以在不對數據包壓縮加密的情況下,傳遞速度是和其它方式沒有多大區別的。
// FS是一個文件流 function TMyDSServer.PutFile(Stream: TStream): Boolean; const BufSize = $F000; var Buffer: TBytes; ReadCount: Integer; begin if Stream.Size = -1 then // 大小未知則一直讀取到沒有數據為止 begin SetLength(Buffer, BufSize); repeat ReadCount := Stream.Read(Buffer[0], BufSize); if ReadCount > 0 then FS.WriteBuffer(Buffer[0], ReadCount); if ReadCount < BufSize thenbreak; until ReadCount < BufSize; end else // 大小已知則直接復制數據 FS.CopyFrom(Stream, 0); Result := True; end;轉載于:https://www.cnblogs.com/h2zZhou/p/4801188.html
總結
以上是生活随笔為你收集整理的DataSnap 用TStream 传递大数据 返回流大小为-1的情况的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实验仪器参数关系表达与传递
- 下一篇: Bootstrap Metronic