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 then
break;
until readcount < bufsize;
end else // 大小已知則直接複製資料
fs.copyfrom(stream, 0);
result := true;
end;
傳值 傳引用 傳指標
收藏 相關概念 c 三種傳遞引數方式 傳引數的值 稱值傳遞,簡稱傳值 傳引數的位址 稱位址傳遞,簡稱為傳址 和引用傳遞 稱為傳引用 相應的函式傳值呼叫,傳址呼叫和傳引用呼叫 形參 實參 函式定義時參數列中的引數稱為形式引數,簡稱形參 函式呼叫時參數列中的引數稱為實際引數,簡稱實參。實參和形參之間的資...
傳值 傳引用 傳指標
相關概念 c 三種傳遞引數方式 傳引數的值 稱值傳遞,簡稱傳值 傳引數的位址 稱位址傳遞,簡稱為傳址 和引用傳遞 稱為傳引用 相應的函式傳值呼叫,傳址呼叫和傳引用呼叫 形參 實參 函式定義時參數列中的引數稱為形式引數,簡稱形參 函式呼叫時參數列中的引數稱為實際引數,簡稱實參。實參和形參之間的資料傳遞...
傳值 傳指標 傳引用
c語言的規則很簡單 所有的引數都是傳值呼叫 在這句話的基礎上,我們來分析值傳遞 指標傳遞 引用傳遞的區別。一 值傳遞 值傳遞,這與c函式的性質有關。c函式的所有引數均以 傳值呼叫 方式進行傳遞,這意味著函式值將獲得引數值的乙份拷貝,函式可以放心修改這個拷貝值,而不必擔心會修改呼叫程式實際傳給他的引數...