UDP Server/Client Beispiel

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Vertex

Betreff: UDP Server/Client Beispiel

BeitragSo, März 13, 2005 13:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!
Das Original stammt von SucoX! Habe es von meinem BMax beispiel nach BlitzClassic portiert, es läuft somit auch mit den BNet Examples ( http://vertex.art-fx.org/bnet.zip )

Es kann mit mehreren User umgehen die sich über einen Nickname anmelden müssen. Jeder User wird durch einen Kreis symbolisiert.

So in etwa könnte man ein UDP Multiplayerspiel aufbauen, wobei man noch primäre Nachrichten wie "gestorben" usw. sich mit einem "OK" (Aknowlege) bestätigen sollte.

Mal schauen ob ich das mal noch mit TCP machen kann.

UDPServer.bb
Code: [AUSKLAPPEN]
; ----------------------------------------------------------------------------------
Const NET_JOIN     = 1
Const NET_ACCEPT   = 2
Const NET_GETLIST  = 3
Const NET_LIST     = 4
Const NET_POSITION = 5
Const NET_QUIT     = 6
; ----------------------------------------------------------------------------------

; ----------------------------------------------------------------------------------
Type TUser
   Field Nickname$
   Field IP
   Field Port
   Field XPos
   Field YPos
End Type

Function AddUser(Nickname$, IP, Port)
   Local User.TUser
   
   User = New TUser
   User\Nickname$ = Nickname$
   User\IP        = IP
   User\Port      = Port
End Function

Function DeleteUser(IP, Port)
   Local User.Tuser
   
   For User = Each TUser
      If User\IP = IP And User\Port = Port Then
         DebugLog User\Nickname+" ist weg"
         Delete User
         Exit
      EndIf
   Next
End Function

Function CountUser()
   Local User.Tuser, Count
   
   For User = Each TUser
      Count = Count+1
   Next
   
   Return Count
End Function

Function SendUserlist(IP, Port)
   Local User.TUser
   
   WriteInt Stream, NET_LIST
   WriteInt Stream, CountUser()-1
   
   For User = Each TUser
      If Not (User\IP = IP And User\Port = Port) Then
         WriteLine  Stream, User\Nickname$
         WriteInt   Stream, User\IP
         WriteShort Stream, User\Port
      EndIf
      
      SendUDPMsg Stream, IP, Port
   Next
End Function

Function SendToAll()
   Local User.TUser
   
   For User = Each TUser
      WriteInt   Stream, NET_POSITION
      WriteShort Stream, MyXPos
      WriteShort Stream, MyYPos
      SendUDPMsg Stream, User\IP, User\Port
   Next
End Function

Function SendQuit()
   Local User.TUser
   
   For User = Each TUser
      WriteInt Stream, NET_QUIT
      SendUDPMsg Stream, User\IP, User\Port
   Next
End Function

Function SetPosition(IP, Port, X, Y)
   Local User.TUser
   
   For User = Each TUser
      If User\IP = IP And User\Port = Port Then
         User\XPos = X
         User\YPos = Y
         Exit
      EndIf
   Next
End Function

Function DrawAllUser()
   Local User.TUser
   
   For User = Each TUser
      Color 0, 255, 255
      Oval User\XPos, User\YPos, 40, 40
      
      Color 255, 0, 0
      Text User\XPos, User\YPos, User\Nickname$
   Next
End Function
; ----------------------------------------------------------------------------------

; ----------------------------------------------------------------------------------
AppTitle "UDP Server"
Print "UDP Server"
Print ""

Global MyPort
Global MyNickname$
Global MyXPos
Global MyYPos
Global OldX
Global OldY
Global Stream

MyPort = Int(Input$("Server-Port: "))
If MyPort = 0 Then RuntimeError "Ungültiger Port"

MyNickname$ = Input$("Nickname: ")
If MyNickname$ = "" Then RuntimeError "Ungültiger Nickname"

Stream = CreateUDPStream(MyPort)
If Stream = 0 Then RuntimeError "Stream konnte nicht erstellt werden"
; ----------------------------------------------------------------------------------

; ----------------------------------------------------------------------------------
Graphics 640, 480, 0, 2
SetBuffer BackBuffer()

While Not KeyDown(1)
   Cls
   Delay 20
   
   OldX = MyXPos
   OldY = MyYPos
   
   If KeyDown(205) Then
      MyXPos = MyXPos+4
   ElseIf KeyDown(203) Then
      MyXPos = MyXPos-4
   EndIf
   
   If KeyDown(208) Then
      MyYPos = MyYPos+4
   ElseIf KeyDown(200) Then
      MyYPos = MyYPos-4
   EndIf
   
   UpdateUDP()
   DrawAllUser()
   
   If OldX <> MyXPos Or OldY <> MyYPos Then SendToAll()
   
   Color 255, 255, 0
   Oval MyXPos, MyYPos, 40, 40
   
   Color 255, 0, 0
   Text MyXPos, MyYPos, MyNickname$
   Flip
Wend

SendQuit()
End
; ----------------------------------------------------------------------------------

; ----------------------------------------------------------------------------------
Function UpdateUDP()
   Local Command, IP, Port
   Local Nickname$, X, Y
   
   If RecvUDPMsg(Stream) Then
      Command = ReadInt(Stream)
      IP      = UDPMsgIP(Stream)
      Port    = UDPMsgPort(Stream)
      
      Select Command
         Case NET_JOIN
            Nickname$ = ReadLine$(Stream)
            AddUser Nickname$, IP, Port
            WriteInt  Stream, NET_ACCEPT
            WriteLine Stream, MyNickname$
            SendUDPMsg Stream, IP, Port
            
            DebugLog Nickname$+" ist beigetreten"
         
         Case NET_GETLIST
            DebugLog "Anfrage auf Userliste"
            SendUserlist(IP, Port)
            
         Case NET_POSITION
            X = ReadShort(Stream)
            Y = ReadShort(Stream)
            SetPosition(IP, Port, X, Y)
            
         Case NET_QUIT
            DeleteUser(IP, Port)
      End Select
   EndIf
End Function
; ----------------------------------------------------------------------------------


UDPClient.bb
Code: [AUSKLAPPEN]
; ----------------------------------------------------------------------------------
Const NET_JOIN     = 1
Const NET_ACCEPT   = 2
Const NET_GETLIST  = 3
Const NET_LIST     = 4
Const NET_POSITION = 5
Const NET_QUIT     = 6
; ----------------------------------------------------------------------------------

; ----------------------------------------------------------------------------------
Type TUser
   Field Nickname$
   Field IP
   Field Port
   Field XPos
   Field YPos
End Type

Function AddUser(Nickname$, IP, Port)
   Local User.TUser
   
   User = New TUser
   User\Nickname$ = Nickname$
   User\IP        = IP
   User\Port      = Port
End Function

Function DeleteUser(IP, Port)
   Local User.Tuser
   
   For User = Each TUser
      If User\IP = IP And User\Port = Port Then
         DebugLog User\Nickname+" ist weg"
         Delete User
         Exit
      EndIf
   Next
End Function

Function CountUser()
   Local User.Tuser, Count
   
   For User = Each TUser
      Count = Count+1
   Next
   
   Return Count
End Function

Function SendToAll()
   Local User.TUser
   
   For User = Each TUser
      WriteInt   Stream, NET_POSITION
      WriteShort Stream, MyXPos
      WriteShort Stream, MyYPos
      SendUDPMsg Stream, User\IP, User\Port
   Next
End Function

Function SendJoin()
   Local User.TUser
   
   For User = Each TUser
      If Not (User\IP = ServerIP And User\Port = ServerPort) Then
         WriteInt  Stream, NET_JOIN
         WriteLine Stream, MyNickname$
         SendUDPMsg Stream, User\IP, User\Port
      EndIf
   Next
End Function

Function SendQuit()
   Local User.TUser
   
   For User = Each TUser
      WriteInt Stream, NET_QUIT
      SendUDPMsg Stream, User\IP, User\Port
   Next
End Function

Function SetPosition(IP, Port, X, Y)
   Local User.TUser
   
   For User = Each TUser
      If User\IP = IP And User\Port = Port Then
         User\XPos = X
         User\YPos = Y
         Exit
      EndIf
   Next
End Function

Function DrawAllUser()
   Local User.TUser
   
   For User = Each TUser
      Color 0, 255, 255
      Oval User\XPos, User\YPos, 40, 40
      
      Color 255, 0, 0
      Text User\XPos, User\YPos, User\Nickname$
   Next
End Function
; ----------------------------------------------------------------------------------


; ----------------------------------------------------------------------------------
AppTitle "UDP Client"
Print "UDP Client"
Print ""

Global ServerIP
Global ServerPort
Global MyNickname$
Global MyXPos
Global MyYPos
Global Stream

ServerIP = IntIP(Input$("Server-IP: "))
If ServerIP = 0 Then RuntimeError "Ungültige Server-IP"

ServerPort = Int(Input$("Server-Port: "))
If ServerPort = 0 Then RuntimeError "Ungültiger Server-Port"

MyNickname$ = Input$("Nickname: ")
If MyNickname$ = "" Then RuntimeError "Ungültger Nickname"

Stream = CreateUDPStream()
If Stream = 0 Then RuntimeError "Stream konnte nciht erstellt werden"

WriteInt  Stream, NET_JOIN
WriteLine Stream, MyNickname$
SendUDPMsg Stream, ServerIP, ServerPort

While True
   If RecvUDPMsg(Stream) Then
      If UDPMsgIP(Stream) = ServerIP And UDPMsgPort(Stream) = ServerPort Then
         If ReadInt(Stream) = NET_ACCEPT Then
            AddUser(ReadLine$(Stream), ServerIP, ServerPort)
            DebugLog "Anmeldung erfolgreich"
            Exit
         EndIf
      EndIf
   EndIf
Wend

GetList()
SendJoin()
; ----------------------------------------------------------------------------------

; ----------------------------------------------------------------------------------
Graphics 640, 480, 0, 2
SetBuffer BackBuffer()

While Not KeyDown(1)
   Cls
   Delay 20
   
   OldX = MyXPos
   OldY = MyYPos
   
   If KeyDown(205) Then
      MyXPos = MyXPos+4
   ElseIf KeyDown(203) Then
      MyXPos = MyXPos-4
   EndIf
   
   If KeyDown(208) Then
      MyYPos = MyYPos+4
   ElseIf KeyDown(200) Then
      MyYPos = MyYPos-4
   EndIf
   
   UpdateUDP()
   DrawAllUser()
   
   If OldX <> MyXPos Or OldY <> MyYPos Then SendToAll()
   
   Color 255, 255, 0
   Oval MyXPos, MyYPos, 40, 40
   
   Color 255, 0, 0
   Text MyXPos, MyYPos, MyNickname$
   Flip
Wend

SendQuit()
End
; ----------------------------------------------------------------------------------

; ----------------------------------------------------------------------------------
Function GetList()
   Local Count, Index, Nickname$, IP, Port
   
   WriteInt Stream, NET_GETLIST
   SendUDPMsg Stream, ServerIP, ServerPort
   
   While True
      If RecvUDPMsg(Stream) Then
         If UDPMsgIP(Stream) = ServerIP And UDPMsgPort(Stream) = ServerPort Then
            If ReadInt(Stream) = NET_LIST Then
               DebugLog "Erhalte Userliste..."
               Count = ReadInt(Stream)
               DebugLog "Useranzahl: "+Count
               For Index = 1 To Count
                  Nickname$ = ReadLine$(Stream)
                  IP        = ReadInt(Stream)
                  Port      = ReadShort(Stream)
                  AddUser(Nickname$, IP, Port)
                  DebugLog "User: "+Nickname$
               Next
               Exit
            EndIf
         EndIf
      EndIf
   Wend
   
   DebugLog "Fertig"
End Function

Function UpdateUDP()
   Local Command, IP, Port
   Local Nickname$, X, Y
   
   If RecvUDPMsg(Stream) Then
      Command = ReadInt(Stream)
      IP      = UDPMsgIP(Stream)
      Port    = UDPMsgPort(Stream)
      
      Select Command
         Case NET_JOIN
            Nickname$ = ReadLine$(Stream)
            AddUser Nickname$, IP, Port
            WriteInt  Stream, NET_ACCEPT
            WriteLine Stream, MyNickname$
            SendUDPMsg Stream, IP, Port
            
            DebugLog Nickname$+" ist beigetreten"
            
         Case NET_POSITION
            X = ReadShort(Stream)
            Y = ReadShort(Stream)
            SetPosition(IP, Port, X, Y)
            
         Case NET_QUIT
            DeleteUser(IP, Port)
      End Select
   EndIf
End Function

Function IntIP(IP$)
   CountHostIPs(IP$)
   Return HostIP(1)
End Function
; ----------------------------------------------------------------------------------


mfg olli
vertex.dreamfall.at | GitHub

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group