Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy - Records versenden (https://www.delphipraxis.net/58550-indy-records-versenden.html)

Neutral General 8. Dez 2005 18:20


Indy - Records versenden
 
Hi,

Also ich will mit meinem Client ein ganzen Record an den Server schicken.
Ich versuche das im Moment so. Aber das geht noch nicht wirklich :mrgreen:

TChatMessage:

Delphi-Quellcode:
 TChatMessage = class // Die Alpha Version der Klasse^^
   From: ShortString;
   Msg: String;
  end;
Client:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
 DSAClient.Port := 1354; // DSAClient = IDTCPClient
 DSAClient.Host := '192.168.2.102'; // Zu testzwecken meine eigene IP...
end;

procedure TForm1.Button1Click(Sender: TObject);
var Msg : TChatMessage;
begin
 DSAClient.Connect();
 Msg.From := Edit1.Text;
 DSAClient.WriteBuffer(Msg,Sizeof(Integer));
end;
Server:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
 DSA.Active := true; // DSA = IDTCPServer
 DSA.DefaultPort := 1354;
end;

procedure TForm1.DSAExecute(AThread: TIdPeerThread);
var Msg: TChatMessage;
begin
  AThread.Connection.ReadBuffer(Msg,Sizeof(Integer));
  ShowMessage(Msg.From);
end;
Grüße
Michael

SirThornberry 8. Dez 2005 18:31

Re: Indy - Records versenden
 
Was heißt "Aber das geht noch nicht wirklich"? Welcher Fehler kommt? Desweiteren kannst du im Execute nicht einfach davon ausgehen das alles auf einmal ankommt was auch auf einmal gesendet wird. Es kann bei großen Daten durchaus passieren (wird sogar die Regel sein) dass, das Execute-Event mehrmals mit kleinen Stücken aufgerufen wird.

Neutral General 8. Dez 2005 18:34

Re: Indy - Records versenden
 
Zitat:

Zitat von SirThornberry
Was heißt "Aber das geht noch nicht wirklich"? Welcher Fehler kommt? Desweiteren kannst du im Execute nicht einfach davon ausgehen das alles auf einmal ankommt was auch auf einmal gesendet wird. Es kann bei großen Daten durchaus passieren (wird sogar die Regel sein) dass, das Execute-Event mehrmals mit kleinen Stücken aufgerufen wird.

Ok sagen wir es funktioniert gar nicht.. Es kommt nichts an und... warte mal.. ShowMessage wird gar nicht ausgeführt -.-

generic 8. Dez 2005 22:28

Re: Indy - Records versenden
 
ich hab das hier mal gerade überflogen, aber ein möglicher fehler kann sein das bei deinem code hier eine klasse ist und kein record.
dann weiter ist die msg ein dynamischer string (es sei den du hast dem compiler umgeschaltet.

Delphi-Quellcode:
TChatMessage = class
   From: ShortString;
   Msg: String;
  end;
in

Delphi-Quellcode:
TChatMessage = record
   From: ShortString;
   Msg: ShortString;
 end;
Delphi-Quellcode:
Sizeof(Integer)
ist auch nicht so klug weil du die groesse des records ermitteln musst.

also lieber Sizeof(TChatMessage)

--
ups das war senden - schau dir die indy demos an dort ist ein chatserver mit records drin.
records zu versenden ist aber nicht sonderlich klug - weil die längen fest sind.
die pakete die du schickt ob "hallo" oder "das ist ein langer text" sind gleich gross und belasten unnötig die leitung/traffic

Neutral General 9. Dez 2005 13:52

Re: Indy - Records versenden
 
Zitat:

Zitat von generic
ich hab das hier mal gerade überflogen, aber ein möglicher fehler kann sein das bei deinem code hier eine klasse ist und kein record.
dann weiter ist die msg ein dynamischer string (es sei den du hast dem compiler umgeschaltet.

Delphi-Quellcode:
TChatMessage = class
   From: ShortString;
   Msg: String;
  end;
in

Delphi-Quellcode:
TChatMessage = record
   From: ShortString;
   Msg: ShortString;
 end;
Delphi-Quellcode:
Sizeof(Integer)
ist auch nicht so klug weil du die groesse des records ermitteln musst.

also lieber Sizeof(TChatMessage)

--
ups das war senden - schau dir die indy demos an dort ist ein chatserver mit records drin.
records zu versenden ist aber nicht sonderlich klug - weil die längen fest sind.
die pakete die du schickt ob "hallo" oder "das ist ein langer text" sind gleich gross und belasten unnötig die leitung/traffic

Ehm ich habe mich oben nur verschrieben. TChatMessage ist bei mir ein Record. Und ich habe mittlerweile auch Sizeof(TChatMessage) geschrieben aber es klappt noch nicht:

Client:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Msg : TChatMessage;
begin
 DSAClient.Connect();
 Msg.From := Edit1.Text;
 DSAClient.WriteBuffer(Msg,Sizeof(TChatMessage),true);
end;
Server:
Delphi-Quellcode:
procedure TForm1.DSAExecute(AThread: TIdPeerThread);
begin
  AThread.Connection.ReadBuffer(Msg,Sizeof(TChatMessage));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Caption := Msg.From;
end;

Ich muss nur sagen das mir was komisches aufgefallen ist. Wenn ich mit diesem Quellcode dem Server was sende (Egal was im Edit beim Client steht) dann steht nach dem ButtonClick als Caption 'TCustomControl'.
Das verwirrt mich irgendwie ^^


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