Stream - Was ist das
Übersicht

![]() |
NoobyBetreff: Stream - Was ist das |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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/ |
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Nooby:
Bitte vermeide zukünftig unbedingt Doppelposts und benutze stattdessen lieber den Edit-Button ( ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 ![]() Ich persöhnlich finde das Zweite viel besser. Dadurch bleibt der Code auch übersichtlich ![]() |
||
Twitter
Download Jewel Snake! Windows|Android |
![]() |
Nooby |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Wend Ich hoffe es hilft |
||
Twitter
Download Jewel Snake! Windows|Android |
![]() |
Nooby |
![]() Antworten mit Zitat ![]() |
---|---|---|
![]() |
||
DAS PERPETUOMOBILE!!!
http://www.sax.de/~stalker/pad/199801/ |
![]() |
Tankbuster |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser. |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ist, wenn man "write..." benutzt, alles im stream weg? | ||
DAS PERPETUOMOBILE!!!
http://www.sax.de/~stalker/pad/199801/ |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group