AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke TcpClient - Antwort XML unvollständig.
Thema durchsuchen
Ansicht
Themen-Optionen

TcpClient - Antwort XML unvollständig.

Ein Thema von Garfield · begonnen am 14. Jan 2011 · letzter Beitrag vom 16. Jan 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#1

TcpClient - Antwort XML unvollständig.

  Alt 14. Jan 2011, 23:09
Mit Tcpclient wird an die Fritzbox diese Nachricht geschickt:
Code:
POST /upnp/control/WANIPConn1 HTTP/1.1
Host: fritz.box:49000
Accept: */*
Content-Type: text/xml
SoapAction:urn:schemas-upnp-org:service:WANIPConnection:1#GetStatusInfo
Content-Length: 263

<?xml version="1.0"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<u:GetStatusInfo xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1" />
</s:Body>
</s:Envelope>
Mit diesem Code
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  TcpClient1 : TTcpClient;
begin
  TcpClient1 := TTcpClient.Create(nil);
  TcpClient1.RemoteHost := Edit1.Text;
  TcpClient1.RemotePort := Edit2.Text;
  TcpClient1.OnReceive := TcpReceive;
  TcpClient1.OnError := TcpError;

  TcpClient1.Connect;

  try
    TcpClient1.Sendln(Memo2.Text);
  finally
    TcpClient1.Disconnect;
  end;

  TcpClient1.Destroy;
end;

procedure TForm1.TcpReceive(Sender: TObject; Buf: PAnsiChar; var DataLen: Integer);
begin
  Memo1.Lines.Add(Buf);
end;

procedure TForm1.TcpError(Sender: TObject; SocketError: Integer);
begin
  ShowMessage(Format('Fehler: %d', [SocketError]));
end;
erhalte ich als Ergebnis:
Code:
HTTP/1.1 200 OK
DATE: Fri, 14 Jan 2011 21:51:41 GMT
SERVER: FRITZ!Box Fon WLAN 7320 UPnP/1.0 AVM FRITZ!Box Fon WLAN 7320 (UI) 100.04.88
CONNECTION: keep-alive
CONTENT-LENGTH: 430
CONTENT-TYPE: text/xml; charset="utf-8"
EXT:

<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body>
<u:GetStatusInfoResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1">
<NewConnectionStatus>Connected</NewConne
Da fehlt leider etwas.

Man kann SendLn und ReceiveLn so oft aufrufen bis die Datei vollständig ist. Das sieht dann so aus:
Code:
HTTP/1.1 200 OK
DATE: Fri, 14 Jan 2011 22:02:45 GMT
SERVER: FRITZ!Box Fon WLAN 7320 UPnP/1.0 AVM FRITZ!Box Fon WLAN 7320 (UI) 100.04.88
CONNECTION: keep-alive
CONTENT-LENGTH: 430
CONTENT-TYPE: text/xml; charset="utf-8"
EXT:

<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body>
<u:GetStatusInfoResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1">
<NewConnectionStatus>Connected</NewConnectionStatus>
<NewLastConnectionError>ERROR_NONE</NewLastConnectionError>
<NewUptime>35312</NewUptime>
</u:GetStatusInfoResponse>
</s:Body> </s:Envelope>HTTP/1.1 200 OK
Was mache ich falsch? Es muss doch möglich sein, die ganze Datei sofort mit einem Aufruf zu erhalten?
Angehängte Dateien
Dateityp: 7z Project.7z (178,2 KB, 16x aufgerufen)
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

AW: TcpClient - Antwort XML unvollständig.

  Alt 15. Jan 2011, 14:49
Hallo Garfield,

eventuell ist das von Dir angehängte Projekt ja anders aufgebaut, aber der in deinem Beitrag gezeigte Delphi-Code sieht irgendwie falsch aus. Lies mal die Antwort von Remy Lebeau auf eine andere Frage zur Komponente TTCPClient.

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#3

AW: TcpClient - Antwort XML unvollständig.

  Alt 15. Jan 2011, 14:55
Ich glaube mal ganz einfach, das würde ich auch ohne den Verweis in dem Post drüber denken, dass du Nach dem Send() viel zu schnell dein Disconnect() aufrufst. Der TCP-Client beendet dann schon die Verbindung, bevor alles da ist, was da sein sollte. Oder er zeigt dir nur das erste von 2 Paketen an. Das 2. Paket wird dann von dir ignoriert, weil du schon die Verbindung wieder geschlossen hast.

Bernhard
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#4

AW: TcpClient - Antwort XML unvollständig.

  Alt 15. Jan 2011, 16:10
..., aber der in deinem Beitrag gezeigte Delphi-Code sieht irgendwie falsch aus. ...
Ich habe beim bereinigen versehentlich nach dem SendLn die Zeile mit dem ReceiveLn entfernt. Nach Remy Lebeau kann eigentlich keine vernünftige Antwort zurückkommen.

.. Der TCP-Client beendet dann schon die Verbindung, bevor alles da ist, was da sein sollte. ...
Kann sehr gut sein.

Wenn ich die Antwort zeilenweise bis zur zweiten Leerzeile lese:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  TcpClient1 : TTcpClient;
  temp : String;
  count : Integer;
begin
  Button1.Enabled := False;
  Memo1.Clear;

  TcpClient1 := TTcpClient.Create(nil);
  TcpClient1.RemoteHost := Edit1.Text;
  TcpClient1.RemotePort := Edit2.Text;
  TcpClient1.OnError := TcpError;
  try
    if TcpClient1.Connect
    then begin
      TcpClient1.SendLn(Memo2.Text);
      temp := TcpClient1.Receiveln();
      count := 0;
      while count <= 1
      do begin
        Memo1.Lines.Add(temp);
        temp := TcpClient1.Receiveln;
        if Length(temp) = 0
        then inc(count);
      end;
    end;
  finally
    TcpClient1.Close;
    TcpClient1.Destroy;
  end;

  Button1.Enabled := True;
end;
bekomme ich sofort:
Code:
HTTP/1.1 200 OK
DATE: Sat, 15 Jan 2011 15:05:35 GMT
SERVER: FRITZ!Box Fon WLAN 7320 UPnP/1.0 AVM FRITZ!Box Fon WLAN 7320 (UI) 100.04.88
CONNECTION: keep-alive
CONTENT-LENGTH: 430
CONTENT-TYPE: text/xml; charset="utf-8"
EXT:
und etwa 30 s später die letzte Zeile:
Code:
<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body>
<u:GetStatusInfoResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1">
<NewConnectionStatus>Connected</NewConnectionStatus>
<NewLastConnectionError>ERROR_NONE</NewLastConnectionError>
<NewUptime>47504</NewUptime>
</u:GetStatusInfoResponse>
</s:Body> </s:Envelope>
Angehängte Dateien
Dateityp: 7z Project.7z (177,9 KB, 4x aufgerufen)
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof

Geändert von Garfield (15. Jan 2011 um 16:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#5

AW: TcpClient - Antwort XML unvollständig.

  Alt 15. Jan 2011, 19:45
Mit TIdTcpClient kommt man auch nicht weiter.

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  TcpClient : TIdTcpClient;
  temp : String;
  count : Integer;
begin
  Memo1.Clear;

  TcpClient := TIdTcpClient.Create(nil);
  TcpClient.Host := Edit1.Text;
  TcpClient.Port := StrToInt(Edit2.Text);
  try
    TcpClient.Connect;
    if TcpClient.Connected
    then begin
      if TcpClient.IOHandler.Connected
      then begin
        TcpClient.IOHandler.Write(Memo2.Text);
        temp := TcpClient.IOHandler.ReadLn;
        count := 0;
        while count <= 1
        do begin
          Memo1.Lines.Add(temp);
          temp := TcpClient.IOHandler.ReadLn;
          if Length(temp) = 0
          then inc(count);
        end;
      end;
    end;
  finally
    TcpClient.Disconnect;
    TcpClient.Destroy;
  end;
end;
Das XML wird zwar in mehreren Zeilen zurückgegeben, aber bei der letzten Zeile hängt es dann.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#6

AW: TcpClient - Antwort XML unvollständig.

  Alt 15. Jan 2011, 19:59
Ich bin mir jetzt nicht ganz sicher, aber sollte nicht IdHTTPClient ausreichen?

Bernhard
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: TcpClient - Antwort XML unvollständig.

  Alt 15. Jan 2011, 20:29
Guten Abend,

wenn aus dem Buffer mit readeLn gelesen wird,
dann wird nur eine Zeile (bis zum ersten CR LF) gelesen.

Ich meine es wäre besser, solange aus dem Buffer zu lesen
bis InputBufferIsEmpty = true ist.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#8

AW: TcpClient - Antwort XML unvollständig.

  Alt 15. Jan 2011, 21:35
Einen IdHTTPClient finde ich nicht, nur den IdHTTPseerver.

... bis InputBufferIsEmpty = true ist.
Damit kann ich leider nichts anfangen.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: TcpClient - Antwort XML unvollständig.

  Alt 15. Jan 2011, 21:46
.. hatte mir das in etwa so vorgestellt:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  TcpClient : TIdTcpClient;
  temp : String;
  count : Integer;
begin
  Memo1.Clear;

  TcpClient := TIdTcpClient.Create(nil);
  TcpClient.Host := Edit1.Text;
  TcpClient.Port := StrToInt(Edit2.Text);
  try
    TcpClient.Connect;
    if TcpClient.Connected then
      begin
        if TcpClient.IOHandler.Connected then
          begin
            TcpClient.IOHandler.Write(Memo2.Text);
             
            while not tcpClient.IOHandler.InputBufferIsEmpty do
              begin
               temp := TcpClient.IOHandler.ReadLn;
               Memo1.Lines.Add(temp);
              end;
          end;
      end;
  finally
    TcpClient.Disconnect;
    TcpClient.Destroy;
  end;
end;
[ungetestet]

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#10

AW: TcpClient - Antwort XML unvollständig.

  Alt 15. Jan 2011, 22:24
Einen IdHTTPClient finde ich nicht, nur den IdHTTPseerver.
Das Ding heißt leider nur IdHTTP (nicht -Client).

Bernhard
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:52 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