DataSnap Stream 傳遞大資料

2021-08-26 21:22:49 字數 1107 閱讀 6627

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函式的所有引數均以 傳值呼叫 方式進行傳遞,這意味著函式值將獲得引數值的乙份拷貝,函式可以放心修改這個拷貝值,而不必擔心會修改呼叫程式實際傳給他的引數...