TCP Problem Mit Blitzbasic

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

lohgock

Betreff: TCP Problem Mit Blitzbasic

BeitragSa, Dez 03, 2005 13:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey,
ich schreib heir grad an nem ORPG(RPG Engine hab ichs hcon geproggt)
Jetzt steh ich vor nem problem.
Erst Mal der code:

Code: [AUSKLAPPEN]
AppTitle "Gamer: "+Gamers+"/5000"
Dim gamer(5000,7)
Global datei = WriteFile("logfile.log")
;gamer(1,1) = hp
;gamer(1,2) = mp
;gamer(1,3) = xp
;gamer(1,4) = class
;gamer(1,5) = x
;gamer(1,6) = y
;gamer(1,7) = map
Stream = CreateTCPServer(2525)
Repeat

ClientStream = AcceptTCPStream(Stream)
Text 100,100, "Eingabe"
a = GetKey()                                         
If a > 31 Then name1$ = name1$ + Chr$(a)
If (a = 8) And Len(name1$) > 0 Then name1$ = Left$(name1$, Len(name1$) - 1 )
Text 170,100,name1$
If KeyHit(28) Then
Select name1
Case "end" End
End Select
name1$ = ""
EndIf
If clientstream <> 0 Then
art = ReadByte(clientstream)
Select art
   Case 1
        AppTitle "Gamer: "+Gamers+"/5000"
   name$ = ReadString(clientstream)
   printb(name$+" eingetreten")
   gamers = gamers+1
   Case 2
   gamer(1,1) = ReadString(clientstream)
   printb(gamer(1,1))
End Select
EndIf
Forever

Function printb(k$)
Print k$
WriteLine datei,k$
End Function

Client:
Code: [AUSKLAPPEN]
AppTitle "MMORPG"
Global rectx
Global recty
Global koord$
Global Stream = OpenTCPStream("127.0.0.1",2525)
If Not Stream Then Color 255,100,100 : Print "Netzwerkfehler!" : Delay 1000 : End
FlushKeys
name$ = "Jussi"
WriteByte stream,1
WriteString stream,name
Repeat
Cls
If KeyDown(205) = 1 Then
sendkoord()
rectx = rectx +1
EndIf

If KeyDown(203) = 1 Then
sendkoord()
rectx = rectx -1
EndIf

If KeyDown(200) = 1 Then
sendkoord()
recty = recty -1
EndIf

If KeyDown(208) = 1 Then
sendkoord()
recty = recty +1
EndIf
koord$ = rectx+","+recty
Rect rectx,recty,10,10
Flip
Until KeyHit(1)
End

Function sendkoord()
WriteByte stream,2
WriteString stream,koord
End Function

Jo
Also,Ich starte Server dann Client dann kommt "Jussi eingetreten" und wenn ich dann im Client gehe schickt der Client zwar,aber der server empfängt nichts"
Woran kann das liegen?

EDIT: Ich denke es liegt darand as er immer nur 1 abruft also ich kann mehrere clients connecten und er sagt imemr verbunden aber wenn die dann was anderes schickenkomtm nix!

Hubsi

BeitragSa, Dez 03, 2005 14:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Fehler auf Serverseite:BlitzBasic: [AUSKLAPPEN]
If clientstream <> 0 Then
art = ReadByte(clientstream)
Du musst für jeden Clienten sein individuelles Handle speichern. Ob Du das nun mit Array oder Type machst sei Dir überlassen Very Happy Desweiteren könnte ein ReadAvail auch das ein oder andere Problem beseitigen. Und zu guter letzt noch ein Tip: WriteString schreibt die Zeilenlänge als Integer in den Stream, gefolgt vom String selbst. WriteLine packt nur die Bytes 10 und 13 ans Zeilenende als Markierung das die Zeile zu Ende ist -> ergo 2 Bytes weniger Traffic Very Happy Und das weitaus wichtigere ist das Blitz jeden in den Stream geschriebenen Wert bei TCP sofort verschickt. Das heisst wenn Du ein WriteByte ausführst wird diesem Byte ein 28 Byte Header aufgenagelt und sofort auf die Reise geschickt -> wenn Du nun beispielsweise zwei Bytes verschickstBlitzBasic: [AUSKLAPPEN]
WriteByte stream,1 ; Nachrichtentyp
WriteByte stream,pos_x ; Spielerposition
donnern 56 Byte Header mit durch die Leitung. Umgehen kann man das indem man alle benötigten Daten die zusammengehören in eine Bank schreibt und den Bankinhalt dann wiederum via WriteBytes in den Stream. Dann geht alles zusammen als ein Paket auf die Reise Very Happy

Und danke an Peer für die Infos Very Happy Von daher weiß ich das nämlich Mr. Green
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

lohgock

BeitragSa, Dez 03, 2005 14:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich mach:

BlitzBasic: [AUSKLAPPEN]
gamer(Spielernummer,8) = AcceptTCPStream(Stream)

und dann muss ich jeden einzelnen abfragen oder?

Hubsi

BeitragSa, Dez 03, 2005 14:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja. Das Handle das AcceptTCPStream zurückgibt ist quasi der Zeiger auf den Clienten. Und mit dem kannst Du ReadAvail füttern um zu sehen ob er denn überhaupt was geschickt hat.

Weils mir grade noch auffällt: Du jagst in jedem Frame Daten durch die Leitung sofern er sich bewegt. Der Ansatz ist schon sehr gut (also das nur gesendet wird wenn sich was ändert), aber jeden Frame ist etwas viel Very Happy Alle 30 Millisekunden dürfte meist auch reichen Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group