程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> DataSnap 用TStream 傳遞大數據 返回流大小為-1的情況,datasnaptstream

DataSnap 用TStream 傳遞大數據 返回流大小為-1的情況,datasnaptstream

編輯:Delphi

DataSnap 用TStream 傳遞大數據 返回流大小為-1的情況,datasnaptstream


       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;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved