Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Dateien schicken über Tserver/Tclient (https://www.delphipraxis.net/120678-dateien-schicken-ueber-tserver-tclient.html)

vsilverlord 15. Sep 2008 09:48


Dateien schicken über Tserver/Tclient
 
Hallo, ich möchte Informationen senden. Das mit receivetext hat schon funktioniert, daber das mit reveivebuf funktioniert nicht. :shock:
Ich habe eine einen eigenen Type, der jeweils im Serverprogramm und im clientprogramm deklariert ist:
Delphi-Quellcode:
Type
Taktion=(Texte,Setzen, Drop);
TInformation = record
Aktion: Taktion;
Kommentar: string;
end;
Erstmal will ich nur Textnachrichten senden können, und zwar per Button:
Delphi-Quellcode:
var
information:tinformation;
begin
information.Aktion:=texte;
information.Kommentar:=edit1.text;
clientsocket1.Socket.SendBuf(information,sizeof(information))
end
im server wird dann gelesen und an alle geschickt:
Delphi-Quellcode:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
  var
    i: Integer;
    information:tinformation;
begin
  // Nachricht lesen
  socket.ReceiveBuf(Information,sizeof(information));
  if Information.Aktion=Texte then
  begin
  Log.Lines.Add(Information.Kommentar); // Nachricht lokal ausgeben
  // und an alle verbundenen Clients senden
  for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
  begin
    serversocket1.Socket.Connections[i].SendBuf(Information,sizeof(information))
  end
   end
end;
im client wiederum wird das dann wieder ausgegeben:
Delphi-Quellcode:
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
information:Tinformation;
begin
  socket.ReceiveBuf(information,SizeOf(information));
  if information.Aktion=texte then
  log.Lines.Add(information.Kommentar)
end;
Nur leider kommt ein grober böser hässlicher Fehler, und zwar in der Server.exe
Theoretisch könnte ich die Informationen auch über sendtext machen, aber da ich da nur strings senden kann, ist das ziemlich quälend. :gruebel:

sirius 15. Sep 2008 09:56

Re: Dateien schicken über Tserver/Tclient
 
Mach mal in der Deklaration aus string->shortstring (sofern du mit 255 Zeichen auskommst)

Edit: Ansonsten müsstest du ein paar Klimmzüge mehr machen.

Thomas83 15. Sep 2008 12:13

Re: Dateien schicken über Tserver/Tclient
 
oder
Delphi-Quellcode:
Type
  Taktion=(Texte,Setzen, Drop);
  TInformation = record
    Aktion: Taktion;
    Kommentar: string[200];
  end;

jokerfacehro 15. Sep 2008 12:40

Re: Dateien schicken über Tserver/Tclient
 
Delphi-Quellcode:
Type
  Taktion=(Texte,Setzen, Drop);
  TInformation = record
    Aktion: Taktion;
    Kommentar: string[200];
  end;
du willst doch nich wirklich en record übers netzwerk versenden ? :shock:

sirius 15. Sep 2008 12:49

Re: Dateien schicken über Tserver/Tclient
 
Zitat:

Zitat von jokerfacehro
du willst doch nich wirklich en record übers netzwerk versenden ? :shock:

Wieso nicht? Mach ich auch ständig. Und wie hier ist das ein ganz normales Anwenderprotokoll. Ich gebe allerdings zu, dass ich das mit dem String ein wenig anders mache als einen Shortstring zu nehmen. Shortstring ist jetzt aber die schnellste Lösung.

jokerfacehro 15. Sep 2008 13:31

Re: Dateien schicken über Tserver/Tclient
 
records sind sehr unflexibel und nicht wircklich zum versenden geeignet.
kompatibilität zwischen verschied. versionen des programms = 0 wenn man den aufbau des records ändert.

besser wäre es, alle teile einzeln zu verschicken, und die sachen mit nem header zu identifizieren und auf der anderen seite wieder ins record zu packen.außerdem kann man so beliebig lange strings versenden.

im record wird nur der pointer auf den string gespeichert, verschickst du das record bekommst nur den pointer mitgesendet, wenn du das beispiel aufm localhorst laufen lässt gibts keine probs aber im lan und wan oder lieg ich da falsch ?! :gruebel:

sirius 15. Sep 2008 13:34

Re: Dateien schicken über Tserver/Tclient
 
Zitat:

Zitat von jokerfacehro
besser wäre es, alle teile einzeln zu verschicken, und die sachen mit nem header zu identifizieren und auf der anderen seite wieder ins record zu packen

Und der Zusammenbau des Headers macht sich sehr schön und simpel wartbar über Records. Und da man übers Netz eh packed records schickt, hat man keine Probleme mit Versionen (bzw. nicht mehr, als man ohnehin bei Versionsumstellungen hat).

Jackie1983 15. Sep 2008 13:50

Re: Dateien schicken über Tserver/Tclient
 
ist es nicht aber so,
das wenn der Record zu groß ist, wird dieser nicht ganz versendet?

smallsmoker 15. Sep 2008 14:00

Re: Dateien schicken über Tserver/Tclient
 
Zitat:

Zitat von Jackie1983
ist es nicht aber so,
das wenn der Record zu groß ist, wird dieser nicht ganz versendet?

man kann kein record verschicken ..
man verschickt nur den pointer auf das record auf deinem pc.
man müsste die einzelnen werte des records mit trennzeichen aneinanderhängen verschicken und dann auf der anderen seite wieder trennen.

Diese lösung is aber eher suboptimal, guck einfach mal hier rein: link

p.s.: die seite is momentan down deshalb hier ein mirror des tutorials

mfg smallsmoker

vsilverlord 15. Sep 2008 16:52

Re: Dateien schicken über Tserver/Tclient
 
vielen Dank, dass ist ein super Tutorial. Ich hatte mir schon irgendwie überlegt, dass das Senden von Daten, die keine Strings sind, auch über Strings gesendet werden könnten, aber ich wusste natürlich nicht genau wie ich das umsetzen sollte, bei mir wäre da auch viel schief gegangen. Ich werde das jetzt einmal probieren. Über records wäre es natürlich 1000 mal einfacher. Wenn ich jetzt zum Beispiel ein einfaches Netzwerkspiel programmieren wollte, z.b ein bomberman, dann müssen ja alle Befehle und jede einzelne Aktion über Kommunikation mit dem Server mit strings laufen. Das würde bedeuten, dass ich ziemlich viele Befehle bekommen würde, über Records könnte ich einfach die ganzen Koordinaten senden. Wie soll ich das jetzt machen? Bis jetzt hat das mit den Records, sprich dem receivebuf bei mir ja noch gar nicht funktioniert. :cry:
//edit: gibt es irgendwelche Beispiele für Netzwerkspiele mit Tserver/Tclient, oder ist das schon so alt, dass nur noch indy besteht?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:46 Uhr.
Seite 1 von 2  1 2      

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