Ingame Chat - UDP und TCP

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

N0X

Betreff: Ingame Chat - UDP und TCP

BeitragSa, Mai 30, 2009 13:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey!
Ich versuche mich gerade an einem ingame-chat.
Hier versuche ich einen UDP- und einen TCP-Stream parallel laufen zu lassen.
UDP für das Spiel und TCP für den Chat.
Jetzt weiß ich aber nicht weiter.
Muss ich bei jedem Client einen TCP-Server erstellen oder alles zum UDP Server schicken und verteilen lassen oder muss ich sogar zwei Hauptserver laufen lassen für UDP und TCP?

Mfg,
N0X

//Edit

ServerCode: [AUSKLAPPEN]
      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
                     SendUDPMsg svr,p\ip,p\port
                     WriteByte svr,1
                     WriteInt svr,p\ip
                     WriteInt svr,p\port
                     SendUDPMsg svr,ip,port
                  Next
                  p.Player = New Player
                  p\ip$ = ip
                  p\port = port
                  Print "Player 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)
                     End If
                  Next
            Case 4
             For p.Player = Each Player
                If p\ip = rIp And p\port = port
                  msg$ = ReadLine(svr)
                  WriteByte svr,4
                  WriteLine svr,msg$
                  SendUDPMsg svr,p\ip,p\port
               EndIf
             Next
            End Select
           
         End If
      End If

      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
               SendUDPMsg svr,p\ip,p\port
            End If
         Next
      Next
      send_milli = MilliSecs()+32
      End If


ClientCode: [AUSKLAPPEN]
      readsvr = RecvUDPMsg(svr)
      If readsvr <> 0 Then
         readav = ReadAvail(svr)
         If readav <> 0 Then
            rbyte = ReadByte(svr)
            Select rbyte
               Case 1
                  p.Player = New Player
                  p\ip = ReadInt(svr)
                  p\port = ReadInt(svr)
                  p\model = CreateCube()
                  ScaleEntity p\model,.2,.2,.2
               Case 2
                  rIp = ReadInt(svr)
                  port = ReadInt(svr)
                  For p.Player = Each Player
                     If p\ip = rIp And p\port = port Then
                        FreeEntity p\model
                        Delete p
                     End If
                  Next
               Case 3
                  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)
                     End If
                  Next
           Case 4
             For p.Player = Each Player
                If p\ip = rIp And p\port = port
                  msg$ = ReadLine(svr)
                  Text 10,10,msg$
               EndIf
             Next
            End Select
           
         End If
      End If

   For p.Player = Each Player
      PositionEntity p\model,p\x#,p\y#,p\z#
   Next

      If send_milli < MilliSecs() Then
      WriteByte svr,3
      WriteFloat svr,EntityX(player)
      WriteFloat svr,EntityY(player)
      WriteFloat svr,EntityZ(player)
     
      SendUDPMsg svr,Ip,8767
      send_milli = MilliSecs()+32
      End If

   If KeyHit(59) Then
      oMsg$=Input$(":> ")
      WriteByte svr,4
      WriteLine svr,oMsg$
      SendUDPMsg svr,Ip,8767
   EndIf


Beide Codes sind verkürzt und gröstenteils nicht von mir!
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

Tankbuster

BeitragSa, Mai 30, 2009 15:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst doch auch einen "Hauptserver" laufen lassen, der UDP und TcP parallel... ehm.. unterstützt. Wink
Twitter
Download Jewel Snake!
Windows|Android

N0X

BeitragSa, Mai 30, 2009 15:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab' ich auch versucht, aber i.wie hat das empfangen von Nachrichten auf dem Client nicht funktioniert.
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

Goodjee

BeitragMo, Jun 01, 2009 15:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Der gameserver braucht einen udpstream und einen tcpserver, die clients einen updstream und einen tcpclient
sollte eg keine probleme geben
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

N0X

BeitragMo, Jun 01, 2009 16:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, danke, hab' ich lösen können.
Jetzt habe ich das ganze mal mit meiner lokalen IP über LAN versucht. Vergeblich.
Das gleiche mit der globalen IP über's Internet. Auch vergeblich. Wobei ich mir beim Internet denken kann woran es liegt. (Router Port freigeben usw.)
Aber wieso klappt es nicht über's LAN-Netzwerk?

Mfg,
N0X
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

DaysShadow

BeitragMo, Jun 01, 2009 16:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Firewall? Vielleicht wird der Port der benutzt wird nicht durchgelassen/ist nicht freigegeben? Ist aber nur eine Vermutung...

MfG DaysShadow
Blessed is the mind too small for doubt

N0X

BeitragMo, Jun 01, 2009 16:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab' ich zum testen ausgeschaltet.
Also kann es nicht sein.

Server:Code: [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 succesfull."
Else
   RuntimeError "Server crashed."
End If

While Not KeyDown(1)
      WaitTimer timer
      ;read
      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
              name$=ReadString(svr)
                  For p.Player = Each Player
                     WriteByte svr,1
                     WriteInt svr,ip
                     WriteInt svr,port
                WriteString svr,name$
                     SendUDPMsg svr,p\ip,p\port
                     WriteByte svr,1
                     WriteInt svr,p\ip
                     WriteInt svr,p\port
                WriteString svr,p\name$
                     SendUDPMsg svr,ip,port
                  Next
                  p.Player = New Player
                  p\ip$ = ip
                  p\port = port
                  Print name$+" 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)
                     End If
                  Next
            End Select
           
         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
               SendUDPMsg svr,p\ip,p\port
            End If
         Next
      Next
      send_milli = MilliSecs()+32
      End If

Wend
CloseUDPStream svr
End

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

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


Client:Code: [AUSKLAPPEN]
Graphics3D 800,600,32,2
SeedRnd MilliSecs()
SetBuffer BackBuffer()
HidePointer
Global timer = CreateTimer(80)
Global send_milli#,read_milli#
Global readsvr,readav,rbyte
Global svr = CreateUDPStream(Rnd(100,8000))

Global Ip% = INT_IP("92.77.215.117")
Global name$=Input$("Name: ")

WriteByte svr,1
WriteString svr,name$
SendUDPMsg svr,Ip,8767

Global player = CreateCube()
Global cam = CreateCamera(player)
MoveEntity cam,0,5,-5
RotateEntity cam,20,0,0
ScaleEntity player,.2,.2,.2
EntityType player,1
EntityRadius player,.33,.33

light = CreateLight()

Global sky   = MakeSkybox("Skybox\sky")

Global map = CreatePlane():EntityColor map,100,150,0
PositionEntity map,0,-1,0
EntityType map,2

Collisions 1,2,2,2
While Not KeyDown(1)
      WaitTimer timer

   UDP()
   
      RenderWorld
      UpdateWorld
      
      Flip 0
Wend
WriteByte svr,2
SendUDPMsg svr,Ip,8767
CloseUDPStream svr
End

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

Function UDP()
   ;!Network
   ;read
      readsvr = RecvUDPMsg(svr)
      If readsvr <> 0 Then
         readav = ReadAvail(svr)
         If readav <> 0 Then
            rbyte = ReadByte(svr)
            Select rbyte
               Case 1
                  ;con
                  p.Player = New Player
                  p\ip = ReadInt(svr)
                  p\port = ReadInt(svr)
              p\name$ = ReadString(svr)
                  p\model = CreateCube()
                     EntityPickMode p\model,2
              Text 10,10,p\name$+" connected."
                  ScaleEntity p\model,.2,.2,.2
               Case 2
                  ;dis
                  rIp = ReadInt(svr)
                  port = ReadInt(svr)
                  For p.Player = Each Player
                     If p\ip = rIp And p\port = port Then
                        FreeEntity p\model
                        Delete p
                     End If
                  Next
               Case 3
                  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)
                     End If
                  Next
            End Select
           
         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)
     
      SendUDPMsg svr,Ip,8767
      send_milli = MilliSecs()+32
      End If
End Function

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
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

Goodjee

BeitragMo, Jun 01, 2009 16:58
Antworten mit Zitat
Benutzer-Profile anzeigen
ich sehe kein tcp?
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

N0X

BeitragDi, Jun 02, 2009 13:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab' ich erstmal rausgelassen da es schon beim UDP nicht klappt.
(Und da das Spiel ja auf UDP basiert)
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

Tankbuster

BeitragDi, Jun 02, 2009 19:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Ehm, ich habs mir noch nicht so genau angeschaut, aber du ließt in jeder Schleife nur eine Nachricht aus dem Stream. Ich würde jede Schleife den ganzen Stream auslesen, dann kommt es nicht zu Datenstau,ect.

So ungefähr:
Code: [AUSKLAPPEN]

While not Keydown(1)


     IP=RecvUDPMsg(stream)
     if IP Then
          While Not Eof(stream)
          Byte=Readbyte(stream)

               If Byte=1 Then
               L_X=ReadFloat(stream)
               L_Y=ReadFloat(stream)
               L_Z=ReadFloat(stream)
               [blabla]

               ElseIf Byte=2 Then
               L_Schaden=ReadInt(stream)
               [blabla]

               Endif

          Wend
Endif

[...restlicher Kram...]

Wend
Twitter
Download Jewel Snake!
Windows|Android

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group