Ingame Chat - UDP und TCP
Übersicht

![]() |
N0XBetreff: Ingame Chat - UDP und TCP |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du kannst doch auch einen "Hauptserver" laufen lassen, der UDP und TcP parallel... ehm.. unterstützt. ![]() |
||
Twitter
Download Jewel Snake! Windows|Android |
![]() |
N0X |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich sehe kein tcp? | ||
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/ |
![]() |
N0X |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group