Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Probleme mit SendBuf und ReceiveBuf (https://www.delphipraxis.net/93933-probleme-mit-sendbuf-und-receivebuf.html)

Mayday171 13. Jun 2007 14:20


Probleme mit SendBuf und ReceiveBuf
 
Hallo Leute,

Versuche mit SendBuf in einer ClientApplikation Daten einer Shell Komponente an eine ServerApplikation zu senden.
Mache das ganze mit sendBuf und receiveBuf...

Irgendwie funktioniert das ganze nicht. Es kommt nix an. Er sendet zwar aber auf der anderen Seite kommt nix !!

Bitte Helf mir

CLIENT

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Sockets, ShellCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    clientstatus: TEdit;
    shelltreeview: TShellTreeView;
    TcpClient1: TTcpClient;
    procedure TcpClient1Connect(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure TcpClient1Send(Sender: TObject; Buf: PAnsiChar;
      var DataLen: Integer);
    procedure TcpClient1Error(Sender: TObject; SocketError: Integer);
    procedure TcpClient1Disconnect(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  test: TTreeNodes;


implementation

{$R *.dfm}

procedure TForm1.TcpClient1Connect(Sender: TObject);
begin
  test:= shelltreeview.Items;
  clientstatus.Text:='Client verbunden';


      tcpclient1.SendBuf(test,sizeof(test));

end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  tcpclient1.Close;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
     tcpclient1.Connect;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  tcpclient1.Connect;
  tcpclient1.Open;
end;

procedure TForm1.TcpClient1Send(Sender: TObject; Buf: PAnsiChar;
  var DataLen: Integer);
begin
  clientstatus.Text:='sendet';
end;

procedure TForm1.TcpClient1Error(Sender: TObject; SocketError: Integer);
begin
  clientstatus.Text:='Fehler';
end;

procedure TForm1.TcpClient1Disconnect(Sender: TObject);
begin
  clientstatus.Text:='getrennt'
end;

end.

SERVER

Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Sockets, ShellCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    serverstatus: TEdit;
    treeview: TTreeView;
    TcpServer1: TTcpServer;
    procedure TcpServer1Accept(Sender: TObject;
      ClientSocket: TCustomIpClient);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure TcpServer1Listening(Sender: TObject);
    procedure TcpServer1GetThread(Sender: TObject;
      var ClientSocketThread: TClientSocketThread);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  test: TTreeNodes;


implementation

{$R *.dfm}


procedure TForm1.TcpServer1Accept(Sender: TObject;
  ClientSocket: TCustomIpClient);
begin
  serverstatus.Text:='Server verbunden';
  while tcpserver1.WaitForData(4000) do
    begin
      tcpserver1.ReceiveBuf(test,sizeof(test));
      showmessage(test.GetFirstNode.Text);
    end;
  treeview.Items:=test;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  tcpserver1.Close;
end;


procedure TForm1.TcpServer1Listening(Sender: TObject);
begin
  serverstatus.Text:='listening'
end;

procedure TForm1.TcpServer1GetThread(Sender: TObject;
  var ClientSocketThread: TClientSocketThread);
begin
  serverstatus.Text:='getThread';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  tcpserver1.Open;
end;

end.

shmia 13. Jun 2007 15:13

Re: Probleme mit SendBuf und ReceiveBuf
 
Das geht so nicht. Du kannst nicht einfach Objekte direkt so über das Netzwerk übertragen.
Delphi-Quellcode:
var
  test: TTreeNodes;
tcpclient1.SendBuf(test,sizeof(test)); // nicht möglich!!
Objekte müssen serialisiert werden.
Du könntest z.B. auf Senderseite alle Properties in einen String wandeln und alle Einzelstring getrennt durch "|" zu einen Gesamtstring zusammen setzen.
Dieser String geht dann übers Netz:
Delphi-Quellcode:
tcpclient1.SendBuf(gesamtmeldung[1], Length(gesamtmeldung));
Auf der Empfängerseite wird der String in seine Teile zerlegt und einen fabrikneuen Objekt dann zugewiesen.

SirThornberry 13. Jun 2007 15:26

Re: Probleme mit SendBuf und ReceiveBuf
 
wie bereits erwähnt geht das nicht was du vor hast. du kannst dir das in etwa so vorstellen.
Du kannst nicht per I-Net ein Haus von Deutschland nach China beamen. Was allerdings geht ist Anweisungen zu verschicken wer wann wie was bauen soll.

Und genau so musst du es auch machen. Das Object zu einer Beschreibung (String) zusammenpacken und auf der anderen Seite den String auseinander nehmen und anhand dessen was du da rein geschrieben hast das Object dort neu aufbauen.

Im übrigne sind Objektinstanzen nur Zeiger auf den Speicherbereich wo die eigentlichen Objectdaten liegen (welche wiederum auch Zeiger enthalten können). Daher ergibt SizeOf(ObjectInstanz) auch immer SizeOf(Pointer) bzw. 4 bei einem 32bit Compiler.

Mayday171 14. Jun 2007 06:37

Re: Probleme mit SendBuf und ReceiveBuf
 
Klingt durchaus logisch! Danke erstmal!

Das man so eine ItemList als Query übertragen kann versteh ich ja noch, aber wie funktioniert das dann bei Files?? Mein nächster Schritt wäre ein Fileübertragung gewesen.

Wie mache ich es da???

MfG

alzaimar 14. Jun 2007 06:46

Re: Probleme mit SendBuf und ReceiveBuf
 
Beschäftige dich doch einfach mal mit Streams. Du kannst einen Dateistream (TFileStream), einen Stringstream (TStringstream) und einen Memorystream übers Netz schicken, denn die Zugriffsmethoden sind immer die gleichen.

Du kannst jedes von TPersistent abgeleitete Objekt in einem Stream speichern, oder Du implementierst das für deine Objekte.

Dann bläst Du den Stream übers Netz. Ich kenn TTcpClient nicht, aber wenn der keine Methode 'SendStream' hat, dann überträgst Du den Stream häppchenweise per SendBuf.

Wenn Du das geschafft hast (also einen Stream zu übertragen), dann kannst Du diese Methode auch für Dateien verwenden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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