AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ClientSocket

Ein Thema von Chriscode · begonnen am 11. Okt 2012 · letzter Beitrag vom 12. Okt 2012
Antwort Antwort
Chriscode

Registriert seit: 18. Aug 2009
32 Beiträge
 
#1

ClientSocket

  Alt 11. Okt 2012, 14:42
Hallo zusammen,
ich befasse mich jetzt schon den ganzen Tag mit der Komponente ClientSocket, komme allerdings auf keinen grünen Zweig.

Im Prinzip ist es ganz simpel, eine Prozedur soll mit dem ClientSocket mehrere Einträge einer Liste abfragen und die Antwort in einer anderen Liste speichern.

Code:
var response:string;
ClientSocket1.open;
for I : = 0 to liste.count-1 do begin
Clientsocket1.Socket.SendText(liste.strings[i]);
response:=Clientsocket1.Socket.ReceiveText;
liste2.add(response);
end;
ClientSocket1.close;
Wenn ich das richtig sehe habe ich hier aber mindestens zwei Fehler. Der Text wird gesendet bevor der Socket überhaupt connected ist und es wird nicht auf das Ergebnis gewartet.

Kann mir jemand einen vernünftigen Ansatz liefern? Ich bin offenbar nicht fähig dazu

Vielen Dank!

LG,
Chris
Chris
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#2

AW: ClientSocket

  Alt 11. Okt 2012, 14:52
Hier gibt es ein nettes Tutorial, wo ein Chat mit den Sockets implementiert wurde, das könnte für dich ein Einstieg sein.

http://www.delphipraxis.net/21622-ei...rammieren.html

Hier ein weiteres, wobei es da unter den weiterführenden Link erst richtig interessant wird, wo es um Protokolle geht:

http://www.entwickler-ecke.de/topic_60744.html?view=dl
Ralph
  Mit Zitat antworten Zitat
Chriscode

Registriert seit: 18. Aug 2009
32 Beiträge
 
#3

AW: ClientSocket

  Alt 11. Okt 2012, 15:31
Hallo Ralph,
vielen Dank für deine schnelle Antwort.

Mein Problem ist leider, dass in diesen Tutorials immer das Onread Ereignis des ClientSockets genutzt wird.

In meiner gezeigten Routine kann ich dann denn empfangenen Text aber garnicht speichern da das Ereignis ja quasi außerhalb dieser Prozedur liegt.

Ist es so wie ich mir das vorstelle überhaupt möglich?

LG,
Chris
Chris
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: ClientSocket

  Alt 11. Okt 2012, 18:49
Diese Uraltkomponente hatte ich ewig nicht mehr in der Hand, die Blockingmethode mit Streams bekomme ich auf die schnelle scheinbar nicht zum laufen ... vielleicht hilft Dir folgende Kapselung für das erste ...

Delphi-Quellcode:
unit ClientSocketBlocking;
// 2012 by Thomas Wassermann
interface

uses
  Windows, Messages, SysUtils, ScktComp, Classes,Forms;

Type

  TOldClientSocketTest = Class
  Private
    FCs: TClientSocket;
    FSL: TStringList;
    FHost:String;
    FContent:String;
    FReady:Boolean;
    procedure MyDisconnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure MyOnRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure MyOnWrite(Sender: TObject; Socket: TCustomWinSocket);
  protected
    Constructor Create(Const AUrl: String; Port: Integer = 80);
    Destructor Destroy ;
  public
    Class Function GetPage(Const AUrl: String; Port: Integer = 80):String;

    End;
implementation

{ TOldClientSocketTest }

destructor TOldClientSocketTest.Destroy;
begin
   FSL.Free;
   FCS.Free;
end;

class function TOldClientSocketTest.GetPage(const AUrl: String; Port: Integer=80): String;
begin
    With Create(AUrl,Port) do
      begin
         Result := FSL.Text;
         Destroy;
      end;
end;

procedure TOldClientSocketTest.MyDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  FReady := true;
end;

procedure TOldClientSocketTest.MyOnRead(Sender: TObject; Socket: TCustomWinSocket);
begin
  FSL.Add(TClientSocket(Sender).Socket.ReceiveText);
end;

procedure TOldClientSocketTest.MyOnWrite(Sender: TObject; Socket: TCustomWinSocket);
begin
  Socket.SendText('GET ' + FContent + ' HTTP/1.0' + #13#10#13#10);
end;

constructor TOldClientSocketTest.Create(const AUrl: String; Port: Integer);
var
 i:Integer;
begin
  FSL := TStringList.Create;
  FCs := TClientSocket.Create(nil);
  try
    if pos('http://',Lowercase(AUrl))>0 then FHost := Copy(Aurl,8,Length(Aurl))
    else FHost :=(AUrl);

    i := Pos('/',FHost);
    if i>0 then
      begin
        FContent := Copy(FHost,i,length(FHost));
        FHost := Copy(FHost,1,i-1);
      end;

    if Length(FContent)=0 then FContent := '/';
    FCs.OnDisconnect := MyDisconnect;
    FCs.OnRead := MyOnRead;
    FCs.OnWrite := MyOnWrite;
    FCs.Host := FHost;
    FCs.Port := Port;
    FCs.ClientType := ctNonBlocking;
    FCs.active := true;
    while not FReady do
      begin
      Application.Processmessages;
      Sleep(50);
      end;
  finally
  end;
end;




{
procedure TForm3.Button3Click(Sender: TObject);
Procedure AddSep;
  begin
      Memo1.Lines.Add('_______________________________________________');
  end;

begin
  Memo1.Text := Memo1.Text + TOldClientSocketTest.GetPage('www.devworx.com');
  AddSep;
  Memo1.Text := Memo1.Text + TOldClientSocketTest.GetPage('http://www.jmarshall.com/easy/http/');
  AddSep;
  Memo1.Text := Memo1.Text + TOldClientSocketTest.GetPage('http://www.delphipraxis.net');
  AddSep;

end;
}


end.
Angehängte Dateien
Dateityp: zip ClientSocketBlocking.zip (1,1 KB, 23x aufgerufen)
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: ClientSocket

  Alt 11. Okt 2012, 19:52
Mit dieser Methode kannst du blocking auf ankommende Daten warten. Allerdings solltest du dir ein Protokoll überlegen, um Pakete korrekt zu trennen und um zu wissen, wann ein Paket vollständig angekommen ist:

Delphi-Quellcode:
procedure TBasicBackendConnector.ReceivePacket(var Command: Word;
  Data: Pointer; var Size: Word);
var
  Stream: TWinSocketStream;
  Buffer: array[0..1024 * 64 - 1] of Byte;
  PacketLength: Word;
begin
  Stream := TWinSocketStream.Create(FSocket.Socket, 10000);
  try
    if (Stream.WaitForData(10000)) then
    begin
      PacketLength := FSocket.Socket.ReceiveLength;
      if (PacketLength > 0) then
      begin
        if (FPacketSize = 0) then
        begin
          FSocket.Socket.ReceiveBuf(FPacketSize, 2);
        end;
        if (FPacketSize > 0) then
        begin
          if ((PacketLength - 2) >= FPacketSize) then
          begin
            FSocket.Socket.ReceiveBuf(Buffer[0], FPacketSize);
            Size := FPacketSize;
            // INFO: Vollständiges Paket ist jetzt im Buffer enthalten
            FPacketSize := 0;
          end else
          begin
            ReceivePacket(Command, Data, Size);
          end;
        end;
      end else
      begin
        FSocket.Close;
      end;
    end;
  finally
    Stream.Free;
  end;
end;
In diesem Falle sende ich jedem Paket 2 Byte mit der Länge vorweg. Der Empfangsbuffer ist auch nur für Pakete von maximal 2^16 Bytes ausgelegt. Solltest du dir aber relativ leicht anpassen können.

Wenn du magst, schau gerne auch mal in die Demoanwendung für mein kürzlich entwickeltes Netzwerkprotokoll rein:
http://www.delphipraxis.net/170565-n...elem-mehr.html

Dort werden auch die blocking Sockets benutzt. Und eventuell bekommst du dort auch ein paar Anregungen, was das Protokoll angeht.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (11. Okt 2012 um 19:55 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#6

AW: ClientSocket

  Alt 12. Okt 2012, 07:55
Oder vllt. kannst du ja auch irgendwie das HTTP-Protokoll verwenden? Hast du Einfluß auf den Server? Denn HTTP ist ja darauf ausgelegt eine Request abzuschicken und dann auf eine Response zu warten. Dafür könnte man dann z.B. TIdHTTP von den Indys nehmen.
Ralph
  Mit Zitat antworten Zitat
Chriscode

Registriert seit: 18. Aug 2009
32 Beiträge
 
#7

AW: ClientSocket

  Alt 12. Okt 2012, 16:21
Vielen vielen Dank für eure Antworten, damit habt ihr mir sehr geholfen.

Schönes Wochenende und

LG,
Chris
Chris
  Mit Zitat antworten Zitat
Antwort Antwort


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 17: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