【问题标题】:Delphi indy send stream to clientDelphi indy 向客户端发送流
【发布时间】:2017-04-26 21:38:29
【问题描述】:

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

  1. 在磁盘上上传一个文件(128字节)
  2. 打开像 Firefox 这样的浏览器
  3. 输入网址(下面你可以看到我设置了127.0.0.1:798),当你按下回车键时,会出现一个白页,但会出现一个对话框,要求你下载文件。

到目前为止,我已经编写了这段代码:

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。如您所见,我正在将文件加载到流中,然后在打开页面时尝试将其作为输出发送。这是正确的做法吗?

【问题讨论】:

  • 只是一个小问题:如果你想给组件起有意义的名字,你就不必解释Button1等是什么。例如。 StartBtnStopBtn.
  • 你也应该使用 try-finally 和/或 try-catch 块

标签: delphi indy indy10


【解决方案1】:

由于您是通过网络浏览器访问文件,因此您应该使用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 和一个端口。不是吗?非常感谢你,这是完美的
  • @RaffaeleRossi 是的,当然 TCP 服务器需要 IP 和端口。但它也需要你实现一个协议。 TIdHTTPServer 实现 HTTP 协议。如果使用TIdTCPServer,则必须实现自己的协议。
  • 好吧,我不确定。我之前研究过测试 http 依赖于 tcp,所以它很有意义。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多