2017-04-26 116 views
2

我是新的indy服务器,所以我努力完成这个简单的任务。我必须创建一个服务器并上传一个小文件;它的大小总是128字节。然后,当有人打开服务器的主页时,文件将自动发送。所以:德尔福indy发送客户端流

  1. 上传一个文件(一个是128个字节)的圆盘
  2. 打开如Firefox浏览器
  3. 键入URL(下面你可以看到,我已经设置127.0.0.1上: 798),当您按Enter键时会出现一个白页,但会出现一个对话框,要求您下载该文件。

到目前为止,我写了这个代码:

procedure TForm1.Button1Click(Sender: TObject); 
begin 

// IP = 127.0.0.1:798 (port is 798) 
IdTCPServer1.Active := true; 
Memo1.Lines.Add('Server started at: ' + TimeToStr(Now) + slinebreak); 

end; 

procedure TForm1.Button2Click(Sender: TObject); 
begin 

IdTCPServer1.Active := false; 
Memo1.Lines.Add('Server stopped at: ' + TimeToStr(Now)); 

end; 

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext); 
var a: TFileStream; 

begin 

    a := TFileStream.Create('C:\Users\defaulr.user\Desktop\datfile.pkm', fmOpenWrite); 
    AContext.Connection.IOHandler.Write(a); 

end; 

这是形式:

enter image description here

开始为Button1和结束是Button2。正如你所看到的,我正在将文件加载到流中,然后在打开页面时尝试将其作为输出发送。这是做到这一点的正确方法吗?

+0

只是一个小挑剔:如果你的组件给出有意义的名字,你就不必解释什么'Button1'等。例如。 'StartBtn'和'StopBtn'。 –

+0

你也应该使用try-finally和/或try-catch块 –

回答

3

因为你是通过Web浏览器访问该文件,你应该使用TIdHTTPServer代替TIdTCPServer

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    // IP = 127.0.0.1:798 (port is 798) 
    IdHTTPServer1.Active := true; 
    Memo1.Lines.Add('Server started at: ' + TimeToStr(Now)); 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
begin 
    IdHTTPServer1.Active := false; 
    Memo1.Lines.Add('Server stopped at: ' + TimeToStr(Now)); 
end; 

// TIdHTTPServer.OnCommandGet event handler... 
procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext; 
    ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); 
begin 
    if ARequestInfo.Document = '/' then 
    begin 
    AResponseInfo.ResponseNo := 200; 
    AResponseInfo.ServeFile(AContext, 'C:\Users\defaulr.user\Desktop\datfile.pkm'); 
    // alternatively: 
    // AResponseInfo.SmartServeFile(AContext, ARequestInfo, 'C:\Users\defaulr.user\Desktop\datfile.pkm'); 
    end else 
    AResponseInfo.ResponseNo := 404; 
end; 
+0

那么tcp服务器呢?我不会用浏览器访问他,但是我猜想它必须有一个ip和一个端口。不是吗?非常感谢你btw这是完美的 –

+1

@RaffaeleRossi是的,当然一个TCP服务器需要一个IP和端口。但它也需要你实施一个协议。 'TIdHTTPServer'实现HTTP协议。如果你使用'TIdTCPServer',你必须实现你自己的协议。 –

+0

好吧,我不确定。我研究过早些时候测试http依赖于tcp,所以它使感官。谢谢! –