TCP Probleme

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

onkelz89

Betreff: TCP Probleme

BeitragFr, Sep 25, 2009 17:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

habe einen Client und einen Server geschrieben, der Server soll die Koordinaten die er von einem Client bekommt an alle anderen weiterleiten und Anfangs dem Client (der sich gerade neu anmeldet) eine ID - Nummer zuweisen.

Der Client soll mit Pfeiltasten bewegt werden (ein Oval) und seine X und Y Koordinaten an den Server senden, außerdem die Daten von den anderen Clients über den Server erhalten.

Hier die Codes:
Server:
Code: [AUSKLAPPEN]

Graphics 260,200,16,2
SetBuffer BackBuffer()

AppTitle("Server")

Type Client
 Field x
 Field y
 Field idnr
 Field ip
 Field msg$
 Field time;zählt runter - wenn Null dann Anfrage - wenn keine Antwort - Logout!
End Type

Port=25000

Global ClientStrm
;Global ClientIP$
Global MSG$

Global ping,user

Print "Verbindungsaufbau..."
Server = CreateTCPServer(Port)
If Server <> 0 Then
   Print "Server started..."
Else
   Print "Error starting server."
   WaitKey
   End
EndIf

Delay 1000

timer=CreateTimer(60)
While Not KeyHit(1)
Cls

anfrage=AcceptTCPStream(Server)
If anfrage Then
   C.Client = New Client
   C\ip = anfrage
   C\msg=MSG
   C\time=30000
   C\idnr=Rand(999999)
   WriteInt(c\ip,c\idnr)
   
   For S.Client = Each Client
      If c\idnr<>s\idnr Then
         WriteInt(c\ip,C\idnr)
         WriteInt(c\ip,C\x)
         WriteInt(c\ip,C\y)
      EndIf
   Next
   
   user=user+1
EndIf

For c.client = Each client
   ClientStrm=c\ip
   If ClientStrm<>0 Then
      If ReadAvail(ClientStrm) Then
         C\time=30000
         ping=ping+1
   
         c\x=ReadInt(ClientStrm)
         c\y=ReadInt(ClientStrm)
                     
         For S.Client = Each Client
            If c\idnr<>s\idnr Then
               WriteInt(c\ip,C\idnr)
               WriteInt(c\ip,C\x)
               WriteInt(c\ip,C\y)
            EndIf
         Next
               
      EndIf
   EndIf
   
   c\time=c\time-1
   If c\time<1 Then Delete c
Next

Text 10,10,"USER: "
yy=0
For c.client = Each client
   Text 10,25+yy*15,DottedIP(TCPStreamIP(c\ip))+" "+(c\time/60)+" Sek. to die"
   yy=yy+1
Next

WaitTimer(timer)
Flip
Wend


Client:
Code: [AUSKLAPPEN]

Graphics 400,400,16,2
SetBuffer BackBuffer()

AppTitle("Client")

Global RecMsg$

Type geg
 Field idnr
 Field x
 Field y
End Type

Port=25000
Join_IP$=Input("IP des Servers: ")

Client = OpenTCPStream(Join_IP,Port)
If Client <> 0 Then
   Print "Client connected to "+Join_IP
Else
   Print "Error starting client."
   WaitKey
   End
EndIf

Global idnr=-1,xx=200,yy=200

Delay 100

While idnr=-1
   If ReadAvail(Client) 
      idnr=ReadInt(Client)
      AppTitle"Client-Nr."+idnr
   EndIf
Wend

timer=CreateTimer(60)
While Not KeyHit(1)
Cls



While ReadAvail(Client) 
   wer = ReadInt(Client)
   x = ReadInt(Client)
   y = ReadInt(Client)
   check=0
   For n.geg = Each geg
      If n\idnr=wer Then
         n\x=x
         n\y=y
         check=1
         Exit
      EndIf
   Next
   If check=0 Then
      n.geg = New geg
      n\idnr=wer
      n\x=x
   n\y=y
   EndIf      
Wend

Color 255,0,0
For g.geg = Each geg
   Oval g\x-10,g\y-10,20,20
Next
Color 0,255,0
Oval xx-10,yy-10,20,20


If KeyHit(200) Then
   yy=yy-5
   WriteInt(Client,idnr)
   WriteInt(Client,xx)
   WriteInt(Client,yy)
ElseIf KeyHit(208) Then
   yy=yy+5
   WriteInt(Client,idnr)
   WriteInt(Client,xx)
   WriteInt(Client,yy)
ElseIf KeyHit(203) Then
   xx=xx-5
   WriteInt(Client,idnr)
   WriteInt(Client,xx)
   WriteInt(Client,yy)
ElseIf KeyHit(205) Then
   xx=xx+5
   WriteInt(Client,idnr)
   WriteInt(Client,xx)
   WriteInt(Client,yy)
EndIf

WaitTimer(timer)
Flip
Wend


Es geht zwar, das der Client eine ID bekommt und die sind auch i-wie verbunden, jedoch sieht man die roten Ovale nie oder selten... was kann ich verbessern - bzw ein Ergebnis sehen ?

Holzchopf

Meisterpacker

BeitragFr, Sep 25, 2009 18:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Folgendes:
1. Wenn du einen Timer brauchst, was ja auch gut ist so, solltest du Flip 0 benutzen
2. Der Server liest vom Client nur 2 Ints aus (x- resp y-Position), der Client schickt allerdings neben der Position noch einen dritten Int, nämlich seine eigene idnr (ist nicht nötig)
3. Wenn der Server die Clients anschreibt, geht das natürlich immer so: Sende dem Empfänger die Position vom aktiven Spieler. Da hat sich bei dir wohl ein kleiner Fehler eingeschlichen, denn du sendest dem Empfänger immer seine eigene Position Wink
BlitzBasic: [AUSKLAPPEN]
For S.Client = Each Client
If c\idnr<>s\idnr Then
WriteInt(s\ip,C\idnr)
WriteInt(s\ip,C\x)
WriteInt(s\ip,C\y)
EndIf
Next

So sollt's dann klappen (tut es zumindest bei mir)

mfG
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

onkelz89

BeitragSa, Sep 26, 2009 9:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Cool, vielen Dank, das war´s schon Smile

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group