2015-02-09 68 views
0

您好,我已經編寫了一個客戶端服務器應用程序,用於將文件從服務器傳輸到客戶端。該代碼是在我的測試很簡單:爲什麼datasnap http比tcp/ip慢得多

服務器的代碼(這是一個可執行文件作爲服務運行或應用程序)

function TServerMethods1.DownloadFile(sFile:String; out iOut:Int64): TStream; 
begin 
    iOut := -1; 
    result := TFileStream.Create(sFile, fmOpenRead or fmShareDenyNone); 
    iOut := result.Size; 
    TFileStream(Result).Seek(0, TSeekOrigin.soBeginning); 
end; 

客戶端代碼

procedure TForm1.DownloadFileStabiel(sSourceFile,sTargetFile:String); 
var 
    RetStream: TStream; 
    fs:TFileStream; 
    oServerMethodsClient:TServerMethods1Client; 
    iOut:Int64; 
begin 
    ClientModule1.SQLConnection1.Connected:=True; 
    oServerMethodsClient := nil; 

    try 
    try 
     oServerMethodsClient := TServerMethods1Client.Create(ClientModule1.SQLConnection1.DBXConnection, True); 
     RetStream := oServerMethodsClient.DownloadFile(sSourceFile,iOut); 

     fs := TFileStream.Create(sTargetFile, fmCreate); 

     fs.CopyFrom(retstream,iOut); 

     showmessage('Klaar'); 

    except 
     on E: Exception do 
     begin 
     showmessage('Oeps download: ' + E.Message); 
     end; 
    end; 

    finally 

    ClientModule1.SQLConnection1.Connected:=False; 

    FreeAndNIl(fs); 
    FreeAndNil(oServerMethodsClient); 
    end; 
end; 

在實際應用中我做的事情有點不同,我實現了文件塊和進度條等。對於速度問題,它沒有任何區別。

在客戶端我使用一個TSQLConnection,並在服務器上是使用TDSTCPServerTransport和TDSHTTPService

當我流使用HTTP這是從來沒有速度超過1Mb/s的,當I流使用TCP/IP文件它與服務器能夠處理它的I/O速度一樣快大約30a50 Mb/s

我試過不同的服務器,我總是看到相同的速度差異因子。我嘗試了不同的操作系統,Windows Server 2003,2008,2012和Windows 7.此外,它使得在同一臺機器或不同機器上運行客戶端和服務器的不同點有所不同。

你能幫助我嗎?我打算使用https,但現在我堅持使用tcp/ip

回答

0

雖然datasnap並不是以速度聞名的,但我認爲在這種情況下,將TCP/IP傳輸與HTTP傳輸進行比較是不公平的。 HTTP有很多開銷,必須進行文件編碼/解碼。

要檢查瓶頸是否是DataSnap嘗試使用普通HTTP服務器(Indy)進行傳輸,並將該速度與Datasnap獲得的速度進行比較。

0

我剛剛嘗試過使用普通的indy服務器可執行文件和客戶端可執行文件,但是它的速度非常快....現在我對Datasnap感到沮喪。這是一個很大的區別!

服務器:

procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext; 
    ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); 
begin 
    aResponseInfo.ContentStream := TFileStream.Create('D:\Software\NKDataSnap\voerexpert.zip', fmOpenRead or fmShareDenyNone); 
end; 

客戶端:

procedure TForm1.Button1Click(Sender: TObject); 
var strm:TFileStream; 
begin 
    strm := TFileStream.Create('c:\temp\temp.zip',fmCreate); 
    IdHTTP1.Get('http://myserver',strm); 
    strm.Free; 
end; 
相關問題