AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Probleme mit SendBuf und ReceiveBuf
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit SendBuf und ReceiveBuf

Ein Thema von Mayday171 · begonnen am 13. Jun 2007 · letzter Beitrag vom 14. Jun 2007
Antwort Antwort
Mayday171

Registriert seit: 19. Apr 2006
40 Beiträge
 
#1

Probleme mit SendBuf und ReceiveBuf

  Alt 13. Jun 2007, 15:20
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.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Probleme mit SendBuf und ReceiveBuf

  Alt 13. Jun 2007, 16:13
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:
tcpclient1.SendBuf(gesamtmeldung[1], Length(gesamtmeldung)); Auf der Empfängerseite wird der String in seine Teile zerlegt und einen fabrikneuen Objekt dann zugewiesen.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Probleme mit SendBuf und ReceiveBuf

  Alt 13. Jun 2007, 16:26
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Mayday171

Registriert seit: 19. Apr 2006
40 Beiträge
 
#4

Re: Probleme mit SendBuf und ReceiveBuf

  Alt 14. Jun 2007, 07:37
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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Probleme mit SendBuf und ReceiveBuf

  Alt 14. Jun 2007, 07:46
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  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 03:11 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