您好我已经编写了一个客户端服务器应用程序来将文件从服务器流式传输到客户端。代码在我的测试中非常基础:
服务器代码(它是作为服务或应用程序运行的可执行文件)
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,当我使用tcp / ip流式传输时,它的速度与服务器可以处理的速度一样快,大约为30a50 Mb / s
我尝试了不同的服务器,我总能看到相同的速度差异因素。我尝试了不同的操作系统,Windows Server 2003,2008,2012,Windows 7.此外,它使得在同一台机器或不同机器上运行客户端和服务器的区别。
你能帮帮我吗?我打算使用https,但现在我被困在tcp / ip答案 0 :(得分:0)
尽管datasnap并不以它的速度而闻名,但我认为在这种情况下,将TCP / IP上的传输与通过HTTP传输进行比较是不公平的。 HTTP有很多开销,必须进行文件编码/解码。
要检查瓶颈是否是DataSnap尝试使用普通HTTP服务器(Indy)进行传输,并将该速度与Datasnap的速度进行比较。
答案 1 :(得分:0)
我刚试过一个简单的indy服务器可执行文件和客户端可执行文件,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;