日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DataSnap 用TStream 传递大数据 返回流大小为-1的情况

發布時間:2025/7/14 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的情况的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。