Stream - Was ist das

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Nooby

Betreff: Stream - Was ist das

BeitragDi, Jul 24, 2007 16:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin, moin!
Ich arbeite, wie schon in vorigen Themen deutlich wird, gerade an einem Multiplayerspiel.
Dabei komme ich nicht drumherum mich mit Streams zu befassen. Dummerweise habe ich trotz einigen Beispielcodes, Tutorials und der OH immer noch nicht ganz verstanden, was so ein "Datenstrom" genau ist und wie man damit umzugehen hat.
Ist es eine Art Postfach, aus dem man die Briefe der Reihe nach lesen kann?
Wird das gelesen automatisch gelöscht?
Kann die Post an mich ausversehen durch mich übergeschrieben werden?
Wann benutzt man "readbyte", wann "readstring"?
Wofür brauche ich "readavail"?

Vielen Dank für eure Hilfe!
DAS PERPETUOMOBILE!!!
http://www.sax.de/~stalker/pad/199801/
 

Dreamora

BeitragDi, Jul 24, 2007 16:23
Antworten mit Zitat
Benutzer-Profile anzeigen
ReadAvail sagt dir ob etwas auf dem Stream ist.

Ob du ReadByte, ReadInt etc nutzt hängt davon ab was du auslesen willst. Das heisst auch zwingend, dass du eine Möglichkeit haben musst dass dein Programm beim ersten zeichen (normalerweise MessageID genannt) erkennt was für daten danach kommen um sie auszulesen.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Nooby

BeitragDi, Jul 24, 2007 16:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich will jetzt nicht darauf hinaus, dass mir die oben gestellten Fragen wörtlich beantwortet werden.
Vielmehr suche ich nach einer ausführlichen erklärung zu Streams, damit ich selber richtig begreife, wie ich was machen muss.
DAS PERPETUOMOBILE!!!
http://www.sax.de/~stalker/pad/199801/

Nooby

BeitragDi, Jul 24, 2007 16:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich könnte das auch einzelnd angehen:

Erstens:
Ich bekomme per TCP-Stream "stream" eine Nachricht, die so aussieht:
Code: [AUSKLAPPEN]
Dies ist eine Nachricht über TCP!
Dies ist die zweite Zeile der Nachricht!
Und mit dieser Zeile endet die Nachricht!

Das sind jetzt mehrere Zeilen. Wie lese ich das jetzt aus? Was passiert, wenn ich, bevor ich das getan habe, noch eine Nachricht bekomme? Wird die einfach unten in einer neuen Zeile drangefügt?
DAS PERPETUOMOBILE!!!
http://www.sax.de/~stalker/pad/199801/

D2006

Administrator

BeitragDi, Jul 24, 2007 16:46
Antworten mit Zitat
Benutzer-Profile anzeigen
@Nooby:
Bitte vermeide zukünftig unbedingt Doppelposts und benutze stattdessen lieber den Edit-Button (user posted image) rechts über dem Beitrag.
Ist schon das dritte Mal, dass mir das auffällt.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2
 

Dreamora

BeitragDi, Jul 24, 2007 16:50
Antworten mit Zitat
Benutzer-Profile anzeigen
das ist keine Nachricht. wenn du so etwas schickst, kannst du damit rein garnix anfangen, zumindest nicht gescheit und strukturiert.


Du musst dir überlegen, was du für Daten verschicken willst.

Dann bestimmst du für jeden Nachrichtentyp eine eindeutige ID, diese ID ist das erste was du in eine "Nachricht" (ein Datenblock fixer Bytelänge) schreibst. Normalerweise reicht dafür 1 Byte, denn mehr als 255 verschiedene Nachrichtentypen hat man eher selten ...

Und nun schickst du solche Nachrichten.


Nehmen wir als Beispiel mal eine Chatnachricht. Nehmen wir an, diese wäre so aufgebaut:
MessageID | UserID | ChatNachricht

Die MessageID die du dafür ausgewählt hast im Design war 10, der User sei einfach ma User 3 (dein Server kann dann nachsehen welcher User diese ID hat indem er alle Types für User durchgeht)

Dann würde dann im Stream folgendes stehen
10 3 "Hallo ihr da"


Und das ganze würdest du mit
MessageID = ReadyByte()
UserID = ReadByte()
ChatMsg$ = ReadString()

auslesen.

Die meisten Messages die du versenden wirst sind wohl Position, Bewegungsdaten, Login, Logout und ähnliches


Ein Stream ist nichts anderes als Daten
Es ist deine Aufgabe als Programmierer in diese Daten eine Struktur rein zu bekommen dass sie für dich einen Sinn machen.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Nooby

BeitragDi, Jul 24, 2007 16:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, das klingt logisch!
Heißt also "readstring", dass ALLES gelesen wird? Und das Gelesene wir sofort "aus dem Stream gelöscht"? Und was ist denn nun, wenn gleich danach noch eine Nachricht kommt? Oder ist die einteilung in Nachrichten meine Sache und es wird einfach immer Text in neuen Zeilen nachgeliefert?

@D2006 Weiß ich, aber ich wollte das so chronologisch aufteilen und die Gedanken ebenfalls trennen.
Sollte ich das trotzdem wegen lästigen scrollens etc. zusammenfassen?
DAS PERPETUOMOBILE!!!
http://www.sax.de/~stalker/pad/199801/
 

Dreamora

BeitragDi, Jul 24, 2007 18:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein ReadString liest bis zum Ende des Strings.
Das muss nix mit Zeilen zu tun haben.

Und solange du nur text schickst bringt dir der spass eh nix, denn damit kannst du net viel machen ausser chat
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Nooby

BeitragDi, Jul 24, 2007 19:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Jaja... der Text sollte ja auch nur als Beispiel dienen. Ich will nur wissen, wie damit theoretisch umgegangen werden würde. Natürlich muss das im Praktischen etwas technischer aussehen.

Hab ich das jetzt richtig verstanden?:
Es gibt also ein "Postfach", das von dem, der am anderen Ende der Leitung hängt mit Bytes, die jeweils hinten an den String drangehängt werden, aufgefüllt wird.

Was ist nun mit "write..."? Das ändert doch hoffentlich nicht MEIN "Postfach", sondern ein zweites, beim Partner. Also obwohl ich die gleiche Variable (z.B. "stream") mit "read..." und "write..." benutze. Stream soll mich nur mit dem Partner verbinden und ist nicht das "Postfach".
So richtig?
DAS PERPETUOMOBILE!!!
http://www.sax.de/~stalker/pad/199801/

Tankbuster

BeitragDi, Jul 24, 2007 19:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich stell mir das immer so vor^^
Der Stream ist das Postfach, wenn du willst. Jetzt kannst du in dieses Postfach schreiben, und lesen. Du könntest also erst an dich selber etwas senden, und dann wieder lesen. Wenn ein anderer schickt, kannst du das auch lesen. wenn er es aber geschickt hat, und du eine Nachricht schickst, nachdem die Nachricht des anderen bei dir angekommen ist, schickst du diese AUCH Nachricht wieder zurück Wink
Das kann man aber leicht vermeiden.

1. Du benutzt 2 streams... einen zum Empfangen, und einen zum senden
oder (würd ich net machen)
2. Du ließt zuerst den gesamten Inhalt des Streams aus, (dann ist er leer), schreibst DANACH etwas rein und sendest Wink

Ich persöhnlich finde das Zweite viel besser. Dadurch bleibt der Code auch übersichtlich Wink
Twitter
Download Jewel Snake!
Windows|Android

Nooby

BeitragDi, Jul 24, 2007 19:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Der 3. Absatz meines letzten Beitrags stimmt also nicht...
Stimmt denn der zweite?

Man muss also eine gute Absprache zwischen Client und Server haben, damit kein Fehler passiert und man vielleicht seine eigene Post liest. Also am besten immer abwechselnd.
Ist das korrekt?
DAS PERPETUOMOBILE!!!
http://www.sax.de/~stalker/pad/199801/

Tankbuster

BeitragDi, Jul 24, 2007 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
schau.. du baust das prog folgendermaßen auf:

Zitat:
While....

;erstmal alle Nachrichten auslesen und spieler auf die gesendete Position setzen
;z.B.:
[BEISPIEL]
If RecvUDPMsg(stream)<>0 Then

While ReadAvail(stream)

string$=ReadString$(stream)
byte=ReadByte(stream)
[....]

Wend
Endif
[/BEISPIEL]



;deine Figur bewegen

;deine Daten zum andren schicken Wink

Wend


Ich hoffe es hilft
Twitter
Download Jewel Snake!
Windows|Android

Nooby

BeitragDi, Jul 24, 2007 20:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Confused Ich will mir den Code schon noch selber basteln. Lieber würde ich das ganze erstmal verstehen, indem ich Antworten auf meine obigen Fragen erhalte. Antworten wie "Ja!", "Nein, sondern..." oder "Nicht ganz:...".
DAS PERPETUOMOBILE!!!
http://www.sax.de/~stalker/pad/199801/

Tankbuster

BeitragDi, Jul 24, 2007 20:47
Antworten mit Zitat
Benutzer-Profile anzeigen
EDIT:
Ach ich bin zu blöd^^
Ich dachte wir sprechen von UDP -.-
naja... mit TcP hab ich absolut nix am HUT
Twitter
Download Jewel Snake!
Windows|Android

Silver_Knee

BeitragDi, Jul 24, 2007 21:01
Antworten mit Zitat
Benutzer-Profile anzeigen
also TCP:
du musst dir das wie mit einer datei vorstellen in die beide reinschreiben das ist alles:
Mit Readavail kukst du nach wieviel byte nach dem cursor stehen und wenn du mit readbyte usw sachen ausliest wird der cursor weiter geschoben genauso wenn du mit writeByte usw sachen reinschreibst. das machst du mit dem stream. so. dann musst du den daten die du verschickst noch eine strucktur geben. die meisten machen das so:
Code: [AUSKLAPPEN]
MSGTYPE(Byte) | Nachricht(Allesmögliche)

zb für ne 2D-Position:
Code: [AUSKLAPPEN]
1(Byte) | playerid(byte) | playerx(int) | playery(int)

das schreibst du in den stream und der andere bekommt dann genau das in einem rutsch und macht erstmal:
Code: [AUSKLAPPEN]
typ=ReadByte(stream)

woraufhin er feststellt:
Code: [AUSKLAPPEN]
Select typ
Case 1;AHAAAA Positionsangabe

nun kann er mittels der id sich nen player raussuchen und ihm die koordinaten verpassen.

Nooby

BeitragDi, Jul 24, 2007 21:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, dass du dir soviel mühe mit dem tippen gemacht hast, aber bis auf Eins war mir das schon klar.
Aber das EINE, hat mir sehr weitergeholfen:
FTC hat Folgendes geschrieben:
du musst dir das wie mit einer datei vorstellen in die beide reinschreiben das ist alles

Also haben beide einen komplett gleichen Text, in dem sie irgendwo einen Cursor haben. Da hätte ich auch drauf kommen können - sind ja die gleichen Befehle...

Letzte Frage:
Jeder hat natürlich seinen eigenen Cursor. Richtig? (Sicher ist sicher)

@Tankbuster: Das hatte ich ganz am Anfang leider nicht erwähnt. Naja nächstes mal...
DAS PERPETUOMOBILE!!!
http://www.sax.de/~stalker/pad/199801/
 

Dreamora

BeitragMi, Jul 25, 2007 10:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein sie haben garkeinen Cursor.
Sie stehen beide am Anfang der Daten, wenn du was raus liest, ist es Weg bei beiden.
Von daher kannst du zb als erstes Byte zusätzlich noch ein 0 oder 1 hinschreiben. 0 könnte dann bedeuten das es eine nachricht für den server ist, 1 dass es für den client ist.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

StepTiger

BeitragMi, Jul 25, 2007 10:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Da man hier immer einen Server und einen Client hat, ist es eigentlich nicht notwendig, solche Sachen dazuzuschreiben.
Der Server schreibt immer in den Client-Stream, der Client immer in den Server-Stream. Sowohl Server als auch Client haben überhaupt keinen Zugriff auf die eigenen Streams.
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Silver_Knee

BeitragMi, Jul 25, 2007 11:17
Antworten mit Zitat
Benutzer-Profile anzeigen
hää jetzt macht ihr mich auch durcheinander!?! Wenn der eine Was reinschreibt ekommt der andere das mit ReadAvail mitgeteilt und kann es auslesen das mit dem cursor wollte ich nur bildlich nehmen. was du gelesen hast ist weg. und wenn man bevor man gelesen hat schreibt ist das was man hätte lesen können doch auch weg oder also rast manpraktisch mit dem cursor dran vorbeigefahren...

Nooby

BeitragMi, Jul 25, 2007 12:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist, wenn man "write..." benutzt, alles im stream weg?
DAS PERPETUOMOBILE!!!
http://www.sax.de/~stalker/pad/199801/

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group