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