Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 14:16

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Zahlen in String kopieren
BeitragVerfasst: Di Nov 22, 2005 23:40 
Offline
DGL Member

Registriert: Di Mär 16, 2004 22:25
Beiträge: 17
Hi,

ich würde gern für'n Netzwerkspiel meine Datenpakete als strings verschicken. Mein Problem ist nun: wie krieg ich Variablen geschickt in nen String rein und wieder raus?. Also IntToStr etc will ich net benutzen wegen der Größe (bis zu 10 Stellen für 4byte) und unterschiedlichen Länge des res. strings.

Gibts irgendwie so was: Mystring := 'blabla'+CopyIntToStr(Zahl1) was einfach die 4 byte des int hinten an den String ranhängt?
Das ganze natürlich auch für beliebige andere Datentypen.

Ich würd halt gern strings zum versenden nehmen, da's dafür viele Funktionen zum bearbeiten gibt und der Inhalt leicht kontrolliert werden kann. Also Befehle und Kontrollanweisungen im Klartext und Variablen direkt als bytewerte.

Gruß Steffen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 23, 2005 04:31 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich kenn mich jetzt mit Netzwerken nicht so übermäßig aus, aber wenns möglich ist, solltest du versuchen die Kommunikation über einen Stream zu machen. Da schickst du nur die Sachen rein, die du wirklich willst und ließt die entsprechend wieder aus. Man könnte vielleicht auch den Stream in ne Datei oder sonstwohin schreiben und das Ergebnis dann per Netzwerk senden.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 23, 2005 09:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Kann mich Flash nur anschließen. Du solltest dafür Streams verwenden. Dass du selber die Daten nicht nur als Text übermitteln möchtest ist schon ein sehr positiver Grundstein. Das sollte gefördert werden. ;-)

Für solch eine Datenübertragung gelten die selben Regeln wie für das Speichern in Dateien. Du musst alles ablegen was zum Interpretieren der Daten notwendig ist. Wenn es nur Netzwerk sein soll und du eien überschaubare Anzahl an werten hast, dann musst du deine Informationen nicht sonderlich optimieren.

Als Erstes würde ich wohl erst einmal einen Handshake machen. Also Client sendet an server. Schau mal ich bin Version So und so und so. Server sendet an Client. Tach ich bin so und so. Damit sich nicht irgendein Programm damit verbinden kann und du treu und brav die Daten interpretieren möchtest.

Wie würde ich die Daten verpacken. Als erstes würde ich einen Blockheader schreiben. Das könnten ein oder zwei Bytes sein. Wohl besser 2. Ist sicherer. Anschließend wüsstest du um welchen Block es sich handelt und du solltest dann wissen welche Felder kommen müssen. Bei Strings würde ich grundsätzlich ein Längenbyte davor stellen.

Wie speichert man Daten in einen Stream. Dazu am einfachsten ein Komplettes sample.
Code:
  1. var
  2.   MS: TMemoryStream;
  3.   TempS: String;
  4.   TempB: Byte;
  5. begin
  6.   MS := TMemoryStream.Create;
  7.   try
  8.     // Text
  9.     TempS := 'Blub';
  10.  
  11.     // Länge zurückgeben lassen. Aber auf 255 Zeichen begrenzen
  12.     TempB := Min(255, Length(TempS));
  13.  
  14.     // Länge als 1 Byte schreiben
  15.     MS.Write(TempB, 1);
  16.  
  17.     // String schreiben
  18.     MS.Write(TempS[1], TempB);
  19.  
  20.     // Hier irgenetwas damit machen.
  21.     // MS.Memory beinhält einen Pointer der Daten
  22.     // MS.Size beinhält die Größe der Daten.
  23.  
  24.     // Zum lesen die Position auf Anfang setzen. Da musst du drauf achten. Vergesse ich auch immer am häufigsten
  25.     MS.Position := 0;
  26.  
  27.     // Länge auslesen
  28.     MS.Read(TempB, 1);
  29.  
  30.     // Stringgröße setzen und auslesen
  31.     SetLength(TempS, TempB);
  32.     MS.Read(TempS[1], TempB);
  33.   finally
  34.     FreeAndNil(MS);
  35.   end;
  36. end;


Der Code hat den Vorteil, dass sollte jemand mehr als 255 Zeichen in den Text packen trotzdem immer nur die ersten 255 Zeichen gesendet werden. Und dann immer genau so viele Zeichen wie größe geschrieben wurde. Wie du deine Daten wieder aus einem Stream bekommst habe ich mit in das Sample gepackt.

Je nachdem was du für die Kommunikation benutzt kann es sein, dass du dort auch direkt in einen Stream schreibst. Dann kannst du dir das in einem getrennten Stream verpacken sparen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 23, 2005 13:16 
Offline
DGL Member

Registriert: Di Mär 16, 2004 22:25
Beiträge: 17
Thanks alot!

Dein Bsp hat mir sehr geholfen strings "richtig" in den MS zu schreiben und wieder auszulesen. Vorher kam da oft Müll an.

Hab mir jetzt n kleines Protokoll ausgedacht. Befehle werden als string in den MS geschieben (zum besseren debuggen) sonstige Variablen direkt.

"Header": 'StartPkt'+(länge des ganzen Pakets)
"Befehle": 8 Zeichen pro Befehl z.B. "Login1.0", "accpt1.0", ...
danach die entsprechenden Daten bzw. weitere spezifische Befehle...

Der Empfänger setzt alle ankommenden Streams hinten an einen Puffer dran und beginnt dann von vorne nach einem Header zu suchen. Hat er einen gefunden wird der Befehl abgearbeitet und das Paket aus dem Puffer gelöscht.

Funzt eigentlich ganz gut.

Gruß Steffen

PS.: Thx für die Seite hier! War schon oft hilfreich und inspirierend.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 7 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 15 Queries | GZIP : On ]