Delphi indy向客户端发送流

Delphi indy向客户端发送流,delphi,indy,indy10,Delphi,Indy,Indy10,我是indy服务器的新手,所以我正在努力完成这个简单的任务。我必须创建一个服务器并上传一个小文件;其大小始终为128字节。然后,当有人打开服务器的主页时,文件会自动发送。因此: 在磁盘上上载一个文件(128字节) 打开类似Firefox的浏览器 键入url(下面您可以看到我设置了127.0.0.1:798),当您按enter键时,会出现一个白色页面,但会出现一个对话框,要求您下载文件 到目前为止,我已经编写了以下代码: procedure TForm1.Button1Click(Sender:

我是indy服务器的新手,所以我正在努力完成这个简单的任务。我必须创建一个服务器并上传一个小文件;其大小始终为128字节。然后,当有人打开服务器的主页时,文件会自动发送。因此:

  • 在磁盘上上载一个文件(128字节)
  • 打开类似Firefox的浏览器
  • 键入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;
    
    表格如下:


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

    因为您是通过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;
    

    那么tcp服务器呢?我不会用浏览器访问他,但我想它必须有一个ip和一个端口。不是吗?非常感谢,顺便说一句,这是perfect@RaffaeleRossi是的,当然TCP服务器需要IP和端口。但它也要求您实现一个协议
    TIdHTTPServer
    实现HTTP协议。如果您使用
    TIdTCPServer
    ,您必须实现自己的协议。好吧,太好了,我不确定这一点。我已经研究了早期的测试http依赖于tcp,所以它很有意义。非常感谢。只是一个小小的吹毛求疵:如果你想给组件起个有意义的名字,你就不必解释什么是
    按钮1
    等等。例如,
    StartBtn
    StopBtn
    。您还应该使用try finally和/或try catch块