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:
Und der Code des Servers:
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;
Delphi-Quellcode:
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 :(
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; Auch dieser Thread hat nicht geholfen: http://www.delphipraxis.net/internal...t=idhttpserver Schonmal danke für eure Hilfe MfG Christian |
Re: Stream über idhttp versenden?
weiß denn niemand, wo der Fehler liegt :gruebel:
|
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: |
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 |
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 |
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 |
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 |
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