2017-04-26 117 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,所以它使感官。謝謝! –