![]() |
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. |
Re: Probleme mit SendBuf und ReceiveBuf
Das geht so nicht. Du kannst nicht einfach Objekte direkt so über das Netzwerk übertragen.
Delphi-Quellcode:
Objekte müssen serialisiert werden.
var
test: TTreeNodes; tcpclient1.SendBuf(test,sizeof(test)); // nicht möglich!! 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:
Auf der Empfängerseite wird der String in seine Teile zerlegt und einen fabrikneuen Objekt dann zugewiesen.
tcpclient1.SendBuf(gesamtmeldung[1], Length(gesamtmeldung));
|
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. |
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 |
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 16:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz