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