UDP Server/Client Beispiel
Übersicht

![]() |
VertexBetreff: UDP Server/Client Beispiel |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group