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