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.
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
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:
var
MS: TMemoryStream;
TempS:String;
TempB:Byte;
begin
MS := TMemoryStream.Create;
try
// Text
TempS :='Blub';
// Länge zurückgeben lassen. Aber auf 255 Zeichen begrenzen
TempB :=Min(255,Length(TempS));
// Länge als 1 Byte schreiben
MS.Write(TempB,1);
// String schreiben
MS.Write(TempS[1], TempB);
// Hier irgenetwas damit machen.
// MS.Memory beinhält einen Pointer der Daten
// MS.Size beinhält die Größe der Daten.
// Zum lesen die Position auf Anfang setzen. Da musst du drauf achten. Vergesse ich auch immer am häufigsten
MS.Position:=0;
// Länge auslesen
MS.Read(TempB,1);
// Stringgröße setzen und auslesen
SetLength(TempS, TempB);
MS.Read(TempS[1], TempB);
finally
FreeAndNil(MS);
end;
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.
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.
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.