Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Stream über idhttp versenden? (https://www.delphipraxis.net/20467-stream-ueber-idhttp-versenden.html)

Chris1986 18. Apr 2004 14:59


Stream über idhttp versenden?
 
Hi,
ich versuche einen Stream mit Hilfe der idhttp-Komponenten zu versenden. Das Verbinden klappt problemlos, aber das Versenden des Streams macht Probleme. Der Client versendet zwar den Stream, aber beim Server kommt nichts an :?

Hier der Quelltext des Clients:
Delphi-Quellcode:
procedure TClient.btconnectClick(Sender: TObject);
begin
  with httpClient do
  begin
    disconnect;
    host := lbedHost.Text;
  memStatus.Lines.Add('verbinde mit '+httpClient.Host); //memStatus = TMemo
    connect(5000);
    if not connected
      then begin
             memStatus.Lines.Add('Verbindung zu '+httpClient.Host+' ist fehlgeschlagen');
             exit;
           end;
  end;
  memStatus.Lines.Add('verbunden mit '+httpClient.Host);
end;

procedure TClient.btsendClick(Sender: TObject);
var Stream: TMemoryStream;
begin
  memStatus.Clear;
  memStatus.Lines.Add('Öffne Opendialog . . .');
  if not Opendialog.Execute
    then begin
           memStatus.Lines.Add('. . . abgebrochen.');
           exit;
         end
    else memStatus.Lines.Add('. . . Datei "'+extractfilename(Opendialog.FileName)+'" zum senden ausgewählt.');
  Stream := TMemoryStream.Create;
  memStatus.Lines.Add('TMemoryStream erzeugt');
  Stream.LoadFromFile(Opendialog.FileName);
  Stream.Position := 0;
  memStatus.Lines.Add('Datei erfolgreich in Stream geladen');
  with httpClient do
  begin
    OpenWriteBuffer;
  memStatus.Lines.Add('versende Stream');
    WriteStream(Stream);
  memStatus.Lines.Add('Stream versendet');
    CloseWriteBuffer;
  end;
  Stream.Free;
end;
Und der Code des Servers:
Delphi-Quellcode:
procedure TServer.btactivateClick(Sender: TObject);
begin
  with httpServer do
  begin
    active := false;
    DefaultPort := strtoint(lbedPort.Text);//lbedPort = TLabeledEdit
    active := true;
  end;
end;

procedure TServer.httpServerExecute(AThread: TIdPeerThread);
var Stream: TMemoryStream;
begin
  Stream := TMemoryStream.Create;
  memStatus.Lines.Add('TMemoryStream erzeugt');
  Stream.Clear;
  memStatus.Lines.Add('Stream zurückgesetzt');
  memStatus.Lines.Add('Empfange Stream . . . ');
  AThread.Connection.ReadStream(Stream);
  memStatus.Lines.Add('Stream erfolgreich empfangen');
  memStatus.Lines.Add('öffne Savedialog . . .');
  if not Savedialog.Execute
    then begin
           memStatus.Lines.Add('. . . abgebrochen.');
           Stream.free;
           memStatus.Lines.Add('Stream freigegeben');
           exit;
         end;
 memStatus.Lines.Add('Stream abgespeichert unter: '+Savedialog.FileName);
end;
Ich weiß nicht wodran es liegt. Vielleicht wird Onexecute im Server nicht richtig ausgeführt. Steht allerdings kein Code in der Onexecute Prozedur stürzt das Programm mit einer Fehlermeldung ab :(
Auch dieser Thread hat nicht geholfen:
http://www.delphipraxis.net/internal...t=idhttpserver

Schonmal danke für eure Hilfe

MfG
Christian

Chris1986 18. Apr 2004 18:43

Re: Stream über idhttp versenden?
 
weiß denn niemand, wo der Fehler liegt :gruebel:

Die Muhkuh 18. Apr 2004 18:53

Re: Stream über idhttp versenden?
 
Hi,


bitte pushe die Beiträge nicht bevor 24 Stunden um sind. So lange solltest du uns Zeit geben zu Antworten. Wenn nach 24 Stunden niemand geantwortet hat, dann kannst du pushen.

:wink:

DataCool 18. Apr 2004 19:39

Re: Stream über idhttp versenden?
 
Hi Chris,

zwei SAchen :

1. Für das Versenden von einfachen Datenstreams würde ich IdTcpClint und IdTcpServer nehmen, dann fällt der Overhead des HTTP-Protokolls weg.

2. Dein Fehler ist ganz einfach und liegt im Detail :

Du ließt den Stream im Server-Code mit ReadStream, das Problem daran ist , das ReadStream ohne Parameter in den ersten 4 Bytes die Länge des Streams erwartet, Du die Längen Angabe nicht mit angibst.

Lösung: Verwende im Client-Code WriteStream(Stream,true,true)

Gruß Data

Chris1986 18. Apr 2004 20:33

Re: Stream über idhttp versenden?
 
Hi Datacool,
hat leider nicht geholfen.
Auch der Savedialog öffnet sich nicht. Eine showmessage, wenn sie als erste Anweisung in der onexecute-Prozedur steht, wird ebenfalls nicht geöffnet.

MfG
Christian

DataCool 18. Apr 2004 21:20

Re: Stream über idhttp versenden?
 
Hi,

das liegt jetzt wieder daran, das Du HttpClient und HttpServer verwendest, würdest Du die normalen Tcp-Komponten, würde es gehen.

Wenn Du die Http-Komponeten unbedingt verwenden willst(warum auch immer :gruebel:), dann must Du im Http-Server die Property CommandHandler ausschalten. Sonst tritt das OnExecute des Servers nicht ein.

GRuß Data

Chris1986 18. Apr 2004 21:37

Re: Stream über idhttp versenden?
 
Hi,
den CommandHandler habe ich auch ausgeschaltet. Es funktioniert trotzdem nicht.
Die idhttp-Kompos will ich einfach nur mal so ausprobieren. Wenn man sie über Port 80 laufen lässt müsste man doch eigentlich an z.B. der Router-Firewall vorbeikommen. Deswegen will ich das mal ausprobieren.

MfG
Christian

DataCool 18. Apr 2004 23:28

Re: Stream über idhttp versenden?
 
Hi Chris,

wie kommst Du darauf, das Du auf dem Port 80 durch eine Firewall kommst ?

Das HTTP-Protokoll, welches auf das TCP-Protokoll aufsetzt, verwendet eine P2P Verbindung von Client zu Server.

Welcher Port dabei benutzt wird, ist egal !!! Standardmäßig wird bei HTTP Port 80 verwendet.

Das heißt aber nicht, das Du durch eine Firewall kommt !! Auf dem Rechner wo der Server läuft, egal ob TCP oder HTTP muss der entsprechende Port freigegeben werden.

Gruß Data

P.S.: Es spricht auch nicht dagegen bei IdTcpClient und IdTcpServer einfach die Portnumer auf 80 zu stellen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz