UDP

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Dicker Hobbit

Betreff: UDP

BeitragSo, März 25, 2012 21:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

Ich bin es mal wieder.
Ich habe mich zum ersten Mal an UDP versucht und schon kommen die ersten Probleme:
Hier mein Code(das schießen der Rechtecke einfach ignorieren, es soll erstmal das Netzwerk zustande kommen Wink ):

Server:
BlitzBasic: [AUSKLAPPEN]
Graphics 640,480,0,2
AppTitle "The war of Rects"
SeedRnd MilliSecs()
SetBuffer BackBuffer()
HidePointer()

Const hoch=0
Const runter=1
Const links=2
Const rechts=3

Global client_ip, client_port

;einfachen Spieler createn
Type spieler
Field x,y
Field name$
End Type


Global s.spieler=New spieler
s\x=Rnd(400)
s\y=Rnd(300)
s\name$= "Test" ;Input("Spielername: ")

;schüsse
Type rechteck
Field x,y
Field richtung
Field speed
End Type

;einige timer

Global timerschuss=MilliSecs()+500
frametimer=CreateTimer(60)

;Gegner createn
Type gegner
Field x,y
Field name$
End Type


Global g.gegner=New gegner
g\x=Rnd(400)
g\y=Rnd(300)




;Server starten
Print "Server starten ..."
udp_Stream = CreateUDPStream(8000)

If Not udp_stream Then
Print "Der UDP Stream konnte nicht erstellt werden."
End
EndIf

Print "Server online"
WaitKey()




While Not KeyDown(1)
Cls

If RecvUDPMsg(udp_stream)<>0
client_ip=UDPMsgIP(udp_stream)
client_port=UDPMsgPort(udp_stream)

;gegnerkoordinaten auslesen
g\x=ReadInt (udp_stream)
g\y=ReadInt (udp_stream)
g\name$=ReadString(udp_stream)

EndIf



;eigenen spielerkoordinaten übermitteln
WriteInt (udp_stream, s\x)
WriteInt (udp_stream, s\y)
WriteInt (udp_stream, name$)
SendUDPMsg(udp_stream, client_ip, client_port)



Text 0,0, RecvUDPMsg(udp_stream)


spielermalen()
schuss()
gegnermalen()


Flip(0)
WaitTimer(frametimer)
Wend


;noch schnell den Stream schließen
CloseUDPStream(udp_stream)

End


;Functionen

Function spielermalen()

Color 255, 0, 0
Rect(MouseX(), MouseY(), 20, 20, 1 )
Text MouseX()-5, MouseY()-20, s\name$


End Function

Function schuss()
;schuss oben
If KeyHit(17) And timerschuss<MilliSecs() Then
timerschuss=MilliSecs()+500
r.rechteck= New rechteck
r\x= MouseX()
r\y= MouseY()
r\richtung=hoch
r\speed=Rnd(1,5)
EndIf

;schuss runter
If KeyHit(31) And timerschuss<MilliSecs() Then
timerschuss=MilliSecs()+500
r.rechteck= New rechteck
r\x= MouseX()
r\y= MouseY()
r\richtung=runter
r\speed=Rnd(1,5)


EndIf

;schuss links
If KeyHit(30) And timerschuss<MilliSecs() Then
timerschuss=MilliSecs()+500
r.rechteck= New rechteck
r\x= MouseX()
r\y= MouseY()
r\richtung=links
r\speed=Rnd(1,5)
EndIf

;schuss rechts
If KeyHit(32) And timerschuss<MilliSecs() Then
timerschuss=MilliSecs()+500
r.rechteck= New rechteck
r\x= MouseX()
r\y= MouseY()
r\richtung=rechts
r\speed=Rnd(1,5)
EndIf

For r.rechteck= Each rechteck
Color 0,0,255
Rect r\x, r\y, 10, 10, 1
Select r\richtung
Case hoch
r\y=r\y-r\speed
Case runter
r\y=r\y+r\speed
Case links
r\x=r\x-r\speed
Case rechts
r\x=r\x+r\speed
End Select

If r\y<-10 Or r\y>480 Or r\x<-20 Or r\x>640 Then Delete r.rechteck


Next



End Function


Function gegnermalen()

Color 0, 0, 255
Rect(g\x, g\y, 20, 20, 1 )
Text g\x-5, g\y-20, g\name$
End Function


Client:
BlitzBasic: [AUSKLAPPEN]
Graphics 640,480,0,2
AppTitle "The war of Rects"
SeedRnd MilliSecs()
SetBuffer BackBuffer()
HidePointer()

Const hoch=0
Const runter=1
Const links=2
Const rechts=3

Global server_ip, server_port

;einfachen Spieler createn
Type spieler
Field x,y
Field name$
End Type


Global s.spieler=New spieler
s\x=Rnd(400)
s\y=Rnd(300)
s\name$= "Hi" ;Input("Spielername: ")

;schüsse
Type rechteck
Field x,y
Field richtung
Field speed
End Type

;einige timer

Global timerschuss=MilliSecs()+500
frametimer=CreateTimer(60)

;Gegner createn
Type gegner
Field x,y
Field name$
End Type


Global g.gegner=New gegner
g\x=Rnd(400)
g\y=Rnd(300)




;Server starten
ip$=Input("Server_IP: ")
server_ip=INT_IP(ip$)
udp_Stream = CreateUDPStream()

If Not udp_stream Then
Print "Der UDP Stream konnte nicht erstellt werden."
End
EndIf



WaitKey()




While Not KeyDown(1)
Cls

If RecvUDPMsg(udp_stream)<>0

server_port=UDPMsgPort(udp_stream)

;gegnerkoordinaten auslesen
g\x=ReadInt (udp_stream)
g\y=ReadInt (udp_stream)
g\name$=ReadString(udp_stream)

EndIf



;eigenen spielerkoordinaten übermitteln
WriteInt (udp_stream, s\x)
WriteInt (udp_stream, s\y)
WriteInt (udp_stream, name$)
SendUDPMsg(udp_stream, server_ip, server_port)



Text 0,0, RecvUDPMsg(udp_stream)


spielermalen()
schuss()
gegnermalen()


Flip(0)
WaitTimer(frametimer)
Wend


;noch schnell den Stream schließen
CloseUDPStream(udp_stream)

End


;Functionen

Function spielermalen()

Color 255, 0, 0
Rect(MouseX(), MouseY(), 20, 20, 1 )
Text MouseX()-5, MouseY()-20, s\name$


End Function

Function schuss()
;schuss oben
If KeyHit(17) And timerschuss<MilliSecs() Then
timerschuss=MilliSecs()+500
r.rechteck= New rechteck
r\x= MouseX()
r\y= MouseY()
r\richtung=hoch
r\speed=Rnd(1,5)
EndIf

;schuss runter
If KeyHit(31) And timerschuss<MilliSecs() Then
timerschuss=MilliSecs()+500
r.rechteck= New rechteck
r\x= MouseX()
r\y= MouseY()
r\richtung=runter
r\speed=Rnd(1,5)


EndIf

;schuss links
If KeyHit(30) And timerschuss<MilliSecs() Then
timerschuss=MilliSecs()+500
r.rechteck= New rechteck
r\x= MouseX()
r\y= MouseY()
r\richtung=links
r\speed=Rnd(1,5)
EndIf

;schuss rechts
If KeyHit(32) And timerschuss<MilliSecs() Then
timerschuss=MilliSecs()+500
r.rechteck= New rechteck
r\x= MouseX()
r\y= MouseY()
r\richtung=rechts
r\speed=Rnd(1,5)
EndIf

For r.rechteck= Each rechteck
Color 0,0,255
Rect r\x, r\y, 10, 10, 1
Select r\richtung
Case hoch
r\y=r\y-r\speed
Case runter
r\y=r\y+r\speed
Case links
r\x=r\x-r\speed
Case rechts
r\x=r\x+r\speed
End Select

If r\y<-10 Or r\y>480 Or r\x<-20 Or r\x>640 Then Delete r.rechteck


Next



End Function


Function gegnermalen()

Color 0, 0, 255
Rect(g\x, g\y, 20, 20, 1 )
Text g\x-5, g\y-20, g\name$
End Function


;Funktion zum Umwandeln von String IPs in Integer.
Function INT_IP(IP$)
a1=Int(Left(IP$,Instr(IP$,".")-1)):IP$=Right(IP$,Len(IP$)-Instr(IP$,"."))
a2=Int(Left(IP$,Instr(IP$,".")-1)):IP$=Right(IP$,Len(IP$)-Instr(IP$,"."))
a3=Int(Left(IP$,Instr(IP$,".")-1)):IP$=Right(IP$,Len(IP$)-Instr(IP$,"."))
a4=Int(IP$)

Return (a1 Shl 24) + (a2 Shl 16) + (a3 Shl 8 ) +a4
End Function


Als Server_IP gebe ich mich selbst an (127.0.0.1)!

Das Problem ist das die UDP Streams jeweils erstellt werden (keine Fehlermeldung), sich die Programme aber nichts schicken!
Danke schon mal im vorraus!

Lg Dicker Hobbit

aMul

Sieger des Minimalist Compo 01/13

BeitragSo, März 25, 2012 22:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Geschickt wird schon, aber das Problem was ich sehe ist das folgende:
Deinem Server sagst du er solle Port 8000 gebrauchen, soweit sogut.
Deinem Client sagst du er solle sich selber einen Port raussuchen(CreateUDPStream ohne Parameter), auch kein Problem.
Aber du sagst keinem von beiden wo er seine Pakete hinschicken soll, denn die Variablen client/server_port werden erste gesetzt wenn sie ein Packet empfangen.
Du musst mindestens einem von beiden vorher sagen, an welchen Port er senden muss.

Weitherhin schreibst du den Namen mit WriteInt und liest ihn mit ReadString wieder aus.

Ob das alles ist, musst du mal schaun, aber es ist denke ich ein Start.

Was ich dir wenn es, nachdem du diese Sachen behoben hast immer noch nicht klappt, empfehlen kann ist der Befehl DebugLog. Kompilier im Debugmodus und lass dir einfach mal ausgeben, was übers Netzwerk reinkommt. Vielleicht kommen die Nachrichten an, werden aber nicht vernünftig verarbeitet.
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

Addi

BeitragSo, März 25, 2012 22:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Server sollte nur(betont) zum Verteilen an alle Clients dienen (also so wie die Post).
Lese dir mal in der Hilfe die Beispiele durch, dort steht unteranderem das man mit ReadAvail die max. Anzahl an Bytes auslesen kann. Das kombiniert mit einer While-Schleife dann dürfte es gehn

Hoffe ich konnte dir Helfen Wink
Mfg. Addi
BP/B3D/BMax : Lerne Java : Früher mal Lite-C : Gewinner BCC 62

Dicker Hobbit

BeitragMo, März 26, 2012 14:51
Antworten mit Zitat
Benutzer-Profile anzeigen
So ich habe mir eure Antworten zu Herzen genommen und versucht sie umzusetzen, leider bin ich zu keinem Erfolg gelangt Sad .
Nach wie vor gibt es keinen Datenaustausch! (DebugLog meldet sich auch nicht !)

Den Port habe ich nun bei dem Client auf 8000 festgelegt und den Tippfehler von Code: [AUSKLAPPEN]
Writeint
und Code: [AUSKLAPPEN]
Readstring
auch behoben!
Außerdem habe ich Readavail mit einer While-Schleife eingebaut.

Wo liegt mein Fehler ?

Danke schonmal im Vorraus!

Lg DickerHobbit

PS: Der überarbeitete Teil

Server:
BlitzBasic: [AUSKLAPPEN]
If RecvUDPMsg(udp_stream)<>0
DebugLog("Wurde was gesendet !")
While ReadAvail(udp_stream)
client_ip=UDPMsgIP(udp_stream)
client_port=UDPMsgPort(udp_stream)

;gegnerkoordinaten auslesen
g\x=ReadInt (udp_stream)
g\y=ReadInt (udp_stream)
g\name$=ReadString(udp_stream)
Wend

EndIf



;eigenen spielerkoordinaten übermitteln
WriteInt (udp_stream, s\x)
WriteInt (udp_stream, s\y)
WriteString (udp_stream, name$)
SendUDPMsg(udp_stream, client_ip, client_port)


Client:
BlitzBasic: [AUSKLAPPEN]
If RecvUDPMsg(udp_stream)<>0

server_port=UDPMsgPort(udp_stream)

;gegnerkoordinaten auslesen
g\x=ReadInt (udp_stream)
g\y=ReadInt (udp_stream)
g\name$=ReadString(udp_stream)

EndIf



;eigenen spielerkoordinaten übermitteln
WriteInt (udp_stream, s\x)
WriteInt (udp_stream, s\y)
WriteString (udp_stream, name$)
SendUDPMsg(udp_stream, server_ip, 8000)

Addi

BeitragMo, März 26, 2012 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Guck mal ob überhaupt Bytes vorhanden sind

Also bevor du überprüfst ob eine Nachricht eingeht, machst du TB=ReadAvail(UdpStream) und lässt es dir ausgeben

Versuch im Server mal erst die Udp Nachricht zu senden und dann erst die Spielerdaten
BP/B3D/BMax : Lerne Java : Früher mal Lite-C : Gewinner BCC 62

Dicker Hobbit

BeitragMo, März 26, 2012 15:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Immer noch kein positives Ergebnis...

Code: [AUSKLAPPEN]
tb=ReadAvail(Udp_stream)
   Text 0,50, tb

liefert mir eine 0 zurück !

Zitat:
Versuch im Server mal erst die Udp Nachricht zu senden und dann erst die Spielerdaten


Wie meinst du das genau ich habe das so umgesetzt :
BlitzBasic: [AUSKLAPPEN]

;eigenen spielerkoordinaten übermitteln
SendUDPMsg(udp_stream, client_ip, client_port)
WriteInt (udp_stream, s\x)
WriteInt (udp_stream, s\y)
WriteString (udp_stream, name$)



War das deine Idee oder habe ich dich da missverstanden?
Mir ist nämlich schleierhaft was dies bewirken soll. Warum soll er erst den Stream schicken und dann ihn erst mit Informationen füllen ? Kannst du mir das ein bisschen näher erklären ? Wink
(Btw so wie oben klappt es auch nicht Sad )

Addi

BeitragMo, März 26, 2012 16:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau xD
Undzwar überprüfst du im Client zuerst, ob eine Nachricht geschickt wurde und dann, wenn das der fall ist, ließt du die Daten aus
Im Server sendest du aber zuerst die Daten und dann die Nachricht. Ich bin mir zwar nicht sicher aber ich glaub bei dem Befehl wird auch etw. in den Stream geschrieben. Wenn du das dann so wie vorher machst (und das stimmt was ich denke xD) könnte es sein das die Udp Nachricht irg. untergeht und so die Abfrage niemals wahr wird.
BP/B3D/BMax : Lerne Java : Früher mal Lite-C : Gewinner BCC 62

Dicker Hobbit

BeitragMo, März 26, 2012 16:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok das klingt logisch Wink leider hat es nicht mein Problem gelöst (immer nur 0 ,0 und nochmals 0 :/ )
Trotzdem danke für deinen Versuch !

Falls du oder jemand anderes noch eine Idee hat wie ich das Problem korriegieren kann, dann wäre ich sehr glücklich .

Danke schonmal im vorraus!

Lg Dicker Hobbit

Addi

BeitragDi, März 27, 2012 22:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Also:
Das mit ReadAvail() muss nicht sein
Und SendUDPMessage() muss hinten stehen Very Happy

Ich habe mal im Forum gesucht und folgendes gefunden:
https://www.blitzforum.de/foru...p+tutorial

Habe es zwar nochnicht ausprobiert, aber ich bin zuverlässig, dass es geht

Hoffe das es geht Very Happy
Mfg. Addi

Edit:
Ich habe in deinem Code noch einen Fehler gefunden. Undzwar sendest du sowohl im Server alsauch im Client einen String (den Namen von deinem Spieler) mit WriteInt() auslesen tust du aber mit ReadString()
BP/B3D/BMax : Lerne Java : Früher mal Lite-C : Gewinner BCC 62

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group