2017-04-26 1 views
2

Je suis nouveau avec les serveurs indy et donc je me bats pour cette tâche simple. Je dois créer un serveur et télécharger un petit fichier; sa taille est toujours de 128 octets. Puis, quand quelqu'un ouvre la page d'accueil du serveur, le fichier est envoyé automatiquement. Alors:Delphi indy envoyer un flux au client

  1. Télécharger un fichier (celui qui est de 128 octets) sur le disque
  2. Ouvrez un navigateur comme Firefox
  3. Tapez l'URL (ci-dessous vous pouvez voir que j'ai mis 127.0.0.1: 798) et lorsque vous appuyez sur Entrée, une page blanche s'affiche, mais une boîte de dialogue vous invite à télécharger le fichier.

J'ai écrit ce code jusqu'à présent:

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; 

C'est la forme:

enter image description here

Start est Button1 et End est Button2. Comme vous pouvez le voir, je charge le fichier dans un flux, puis j'essaie de l'envoyer en sortie lorsque j'ouvre la page. Est-ce la bonne façon de le faire?

+0

Juste un nitpick mineur: si vous donner des noms significatifs aux composants, vous auriez pas à expliquer ce que sont Button1, etc. Par exemple. 'StartBtn' et' StopBtn'. –

+0

Et vous devriez aussi utiliser try-finally et/ou try-catch blocks –

Répondre

3

Puisque vous accédez au fichier via un navigateur Web, vous devez utiliser TIdHTTPServer au lieu de 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

Et qu'en est-il d'un serveur tcp? Je ne vais pas lui accéder avec le navigateur mais il doit avoir une ip et un port de toute façon je suppose. N'est-ce pas? Merci beaucoup car c'est parfait –

+1

@RaffaeleRossi oui, bien sûr, un serveur TCP nécessite une adresse IP et un port. Mais il vous faut également implémenter un protocole. 'TIdHTTPServer' implémente le protocole HTTP. Si vous utilisez 'TIdTCPServer', vous devez implémenter votre propre protocole. –

+0

Ok merveilleux, je n'étais pas sûr de cela. J'ai étudié plus tôt le test http repose sur tcp donc ça fait senso. Je vous remercie! –