UDP Netzwerk Problem mit dem Server

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

DJ_Mic

Betreff: UDP Netzwerk Problem mit dem Server

BeitragSo, Dez 20, 2009 14:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich habe ein Problem mit meinem UDP Server.
Und zwar wenn ich ich mein Spiel connecte und ein anderer Spieler auch drauf geht, dann sehen wir uns nicht. Erst wenn ich auf meinen Windows Server gehe und dort die Console anschaue kommt erst dann : "Spieler2 ist connected"

Und dann sehen wir uns erst auf dem Server. Gibt es dafür eine Lösung?

Server.bb
BlitzBasic: [AUSKLAPPEN]
Type Player
Field x#,y#,z#
Field NameS$
Field ip,port%
End Type

While Not KeyDown(1)
WaitTimer timer
;read
If read_milli < MilliSecs() Then
readsvr = RecvUDPMsg(svr)
If readsvr <> 0 Then
readav = ReadAvail(svr)
If readav <> 0 Then
port = UDPMsgPort(svr)
ip = UDPMsgIP(svr)
rbyte = ReadByte(svr)
Select rbyte
Case 1
For p.Player = Each Player
WriteByte svr,1
WriteInt svr,ip
WriteInt svr,port
WriteString svr,NameS
SendUDPMsg svr,p\ip,p\port
WriteByte svr,1
WriteInt svr,p\ip
WriteInt svr,p\port
WriteString svr,p\NameS
SendUDPMsg svr,ip,port
Next
p.Player = New Player
p\ip$ = ip
p\port = port
p\NameS = ReadString(svr)
Print "Player: "+p\NameS+" connected...."
Case 2
For p.Player = Each Player
If ip = p\ip And port = p\port Then
Delete p
End If
Next
For p.Player = Each Player
WriteByte svr,2
WriteInt svr,ip
WriteInt svr,port
SendUDPMsg svr,p\ip,p\port
Next
Print "Player Disconnected..."
Case 3
For p.Player = Each Player
If p\port = port And p\ip = ip Then
p\x = ReadFloat(svr)
p\y = ReadFloat(svr)
p\z = ReadFloat(svr)
p\NameS = ReadString(svr)
End If
Next
End Select

End If
End If
End If

;sende an alle
If send_milli < MilliSecs() Then
For s.Player = Each Player
For p.Player = Each Player
If p\port <> s\port Then
WriteByte svr,3
WriteInt svr,s\ip
WriteInt svr,s\port
WriteFloat svr,s\x
WriteFloat svr,s\y
WriteFloat svr,s\z
WriteString svr, s\NameS
SendUDPMsg svr,p\ip,p\port
End If
Next
Next
send_milli = MilliSecs()+32
End If





Danke
Gruß Dennis

Tankbuster

BeitragSo, Dez 20, 2009 14:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie meinst du das?
Wenn du auf deinen Windows Server gehst?

Hast du das Programm minimiert, oder so?

PS:
Code: [AUSKLAPPEN]

;sende an alle
[...]
If p\port <> s\port Then

Da würde ich nicht mit dem Port sondern mit der IP vergleichen. Oder am besten noch mit einer zusätzlichen ID-Variable. Kann ja gut sein, dass 2 Spieler den selben Port benutzen
Twitter
Download Jewel Snake!
Windows|Android
 

DJ_Mic

BeitragSo, Dez 20, 2009 14:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Auf dem Windows Server habe ich mein Gameserver am laufen.
Und der Gameserver ist dauernt offen.
Sobald ich den Remotedesktop minimiere, und ins Spiel gehe ist alles im Lot.

Kommt aber mein Freund drauf, so sehen wir uns nicht, als ob er gar nicht da wäre.
Wenn ich in den Remotedesktop maximiere, kommt erst dann "Spieler 2 ist connected" und dann wenn ich wieder ingame gehe sehen wir uns.

Tankbuster

BeitragSo, Dez 20, 2009 14:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Eventuell stauen sich die Daten beim Server ja. Wenn du dein Spiel dann kurz unterbrichst um den RMT-Desktop aufzurufen hat sich der Server in dieser Zeit vielleicht wieder vom Datenstau erhohlt, da dein Client nichtmehr so massiv sendet.
Du ließt pro Schleife ja auch nur eine Nachricht aus dem Stream. Eventuell solltest du beim Auslesen der Nachricht

Zitat:
readsvr = RecvUDPMsg(svr)
If readsvr <> 0 Then
readav = ReadAvail(svr)
If readav <> 0 Then

durch
Zitat:
readsvr = RecvUDPMsg(svr)
While readsvr Then
While Not Eof(svr)

ersetzen.

Und was bedeutet das eigentlich?
Code: [AUSKLAPPEN]
If read_milli < MilliSecs() Then
;Nachricht bearbeiten

Nach meinem Ermessen wird bei deinem Server nur alle paar Millisekunden mal eine einzige Nachricht ausgelesen. Oder hab ich da was übersehen?
Twitter
Download Jewel Snake!
Windows|Android
 

DJ_Mic

BeitragSo, Dez 20, 2009 15:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja das ist richtig. KÖnnte mir einer vielleicht da helfen? Ich habe diesen Code gefunden und finde diesen einfach genial für mein Vorhaben. Ich würde mich auch riesig freuen wenn mir jemand helfen würde, diesen Code zu Optimieren. Hier ist mal meine Erweiterung von dem Clienten und dem Server

Client.bb
BlitzBasic: [AUSKLAPPEN]
Graphics3D 1680,1050,32,1
SeedRnd MilliSecs()
SetBuffer BackBuffer()
HidePointer

Type Player
Field x#,y#,z#
Field ip,port%
Field model
Field NameS$
Field id%
End Type

Local timer = CreateTimer(80)
Local send_milli#,read_milli#
Local readsvr,readav,rbyte
Local svr = CreateUDPStream(Rnd(100,8000))
If svr <> 0 Then
Print "Client ist gestartet..."
Else
RuntimeError "there was an error creating the server..."
End If

;Ip
Local Ip% = INT_IP("188.92.201.90")

Name$=Input("Name: ")


;Send Connect
WriteByte svr,1
WriteString(svr,Name$)
SendUDPMsg svr,Ip,8767

;Player/Cam
player = LoadMesh("models\man.3ds")
cam = CreateCamera(player)
MoveEntity cam,0,5,-5
RotateEntity cam,30,0,0
EntityType player,1
EntityRadius player,.33,.33
RotateMesh Player,0,180,0
ScaleMesh player,.04,.04,.04

;light
light = CreateLight()

;Loadworld
map = LoadMesh("map/level.b3d")
Global brick = LoadTexture("map/cell.bmp")
ScaleEntity map,2,1.5,2
PositionEntity map,0,-1,0
EntityTexture map,brick
EntityType map,2


Collisions 1,2,2,2

Local ey# = EntityY(player),yv#

;HS
While Not KeyDown(1)

WaitTimer timer

RenderWorld
UpdateWorld

;gravity
yv# = EntityY(player)-ey#
ey# = EntityY(player)

;Bewegung
If KeyDown(17) Then MoveEntity player,0,0,1 ;vor
If KeyDown(31) Then MoveEntity player,0,0,-1 ;zurück
If KeyDown(30) Then MoveEntity player,-.05,0,0 ;links
If KeyDown(32) Then MoveEntity player,.05,0,0 ; rechts
If KeyDown(57) And yv# = 0 Then yv# = .15
RotateEntity cam,EntityPitch(cam)+MouseYSpeed()/2,0,0
RotateEntity player,0,EntityYaw(player)-MouseXSpeed()/2,0
;MoveMouse 512,384
;gravity
TranslateEntity player,0,yv#-.005,0

;!Network
;read
If read_milli < MilliSecs() Then
readsvr = RecvUDPMsg(svr)
If readsvr <> 0 Then
readav = ReadAvail(svr)
If readav <> 0 Then
rbyte = ReadByte(svr)
Select rbyte
Case 1
;Connecten
p.Player = New Player
p\ip = ReadInt(svr)
p\port = ReadInt(svr)
p\NameS = ReadString(svr)
p\model = LoadMesh("models\man.3ds")
ScaleMesh p\model,.04,.04,.04
Text 100,100, p\NameS+" ist da"
Case 2
;Disconnecten
rIp = ReadInt(svr)
port = ReadInt(svr)
For p.Player = Each Player
If p\ip = rIp And p\port = port Then
Text 100,100, p\NameS+" ist Gange"
FreeEntity p\model
Delete p
End If
Next
Case 3
;Liest Coordinaten ab
rIp = ReadInt(svr)
port = ReadInt(svr)
For p.Player = Each Player
If p\ip = rIp And p\port = port Then
p\x# = ReadFloat(svr)
p\y# = ReadFloat(svr)
p\z# = ReadFloat(svr)
p\NameS = ReadString(svr)
Text 100,100, p\NameS
End If
Next
End Select

End If
End If
End If
For p.Player = Each Player
PositionEntity p\model,p\x#,p\y#,p\z#
Next
;Send
If send_milli < MilliSecs() Then
WriteByte svr,3
WriteFloat svr,EntityX(player)
WriteFloat svr,EntityY(player)
WriteFloat svr,EntityZ(player)
WriteString svr,Name$

SendUDPMsg svr,Ip,8767
send_milli = MilliSecs()+32
End If

; FPS counter
FPS_C=FPS_C+1
If ms<MilliSecs()
ms=MilliSecs()+1000
FPS=FPS_C
FPS_C=0
EndIf


Text 0,0,"FPS: "+FPS
For p.Player = Each Player
Text 100,100,"Online: "+Name+", "+p\NameS
Next
Flip 0
Wend

WriteByte svr,3
SendUDPMsg svr,Ip,8767
CloseUDPStream svr

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


Server.bb
BlitzBasic: [AUSKLAPPEN]
Local svr = CreateUDPStream(8767)
Local send_milli#,read_milli#
Local readsvr,readav,rbyte
Local plycount,maxply
Local timer = CreateTimer(80)
If svr <> 0 Then
Print "Server Created..."
Else
RuntimeError "there was an error creating the server..."
End If

Type Player
Field x#,y#,z#
Field NameS$
Field ip,port%
End Type

While Not KeyDown(1)
WaitTimer timer
;read
If read_milli < MilliSecs() Then
readsvr = RecvUDPMsg(svr)
If readsvr <> 0 Then
readav = ReadAvail(svr)
If readav <> 0 Then
port = UDPMsgPort(svr)
ip = UDPMsgIP(svr)
rbyte = ReadByte(svr)
Select rbyte
Case 1
For p.Player = Each Player
WriteByte svr,1
WriteInt svr,ip
WriteInt svr,port
WriteString svr,NameS
SendUDPMsg svr,p\ip,p\port
WriteByte svr,1
WriteInt svr,p\ip
WriteInt svr,p\port
WriteString svr,p\NameS
SendUDPMsg svr,ip,port
Next
p.Player = New Player
p\ip$ = ip
p\port = port
p\NameS = ReadString(svr)
Print "Player: "+p\NameS+" connected...."
Case 2
For p.Player = Each Player
If ip = p\ip And port = p\port Then
Delete p
End If
Next
For p.Player = Each Player
WriteByte svr,2
WriteInt svr,ip
WriteInt svr,port
SendUDPMsg svr,p\ip,p\port
Next
Print "Player Disconnected..."
Case 3
For p.Player = Each Player
If p\port = port And p\ip = ip Then
p\x = ReadFloat(svr)
p\y = ReadFloat(svr)
p\z = ReadFloat(svr)
p\NameS = ReadString(svr)
End If
Next
End Select

End If
End If
End If

;sende an alle
If send_milli < MilliSecs() Then
For s.Player = Each Player
For p.Player = Each Player
If p\ip <> s\ip Then
WriteByte svr,3
WriteInt svr,s\ip
WriteInt svr,s\port
WriteFloat svr,s\x
WriteFloat svr,s\y
WriteFloat svr,s\z
WriteString svr, s\NameS
SendUDPMsg svr,p\ip,p\port
End If
Next
Next
send_milli = MilliSecs()+32
End If

Wend

CloseUDPStream svr


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

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group