TCP-Stream reisst bei erstellen eines 3D Objektes ab!?

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

Schlauch

Betreff: TCP-Stream reisst bei erstellen eines 3D Objektes ab!?

BeitragMi, Jan 19, 2005 10:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

da ich von der Schule aus mit 4 weiteren Klassenkameraden ein Projekt für den Abschluss mache und dieses ein mit Blitz3D erstelltes 3D Multiplayer spiel sein soll haben wir für die Frundlage eine Server sowie eine Client software entwickelt, die erst einmal die Koordinaten einer von Blitz generierten Kugel übermitteln soll. Das ganze wird dann erst einmal so sein dass 2 Spieler beitreten können und mit ihren Kugeln umeinander "herumfliegen" können. Wir haben es bereits geschafft eine TCP Verbindung herzustellen und damit einfache Strings zu verschicken. Also im Prinzip einen CHat. Jetzt haben wir das Programm so erweitert dass nach dem Verbinden eine Kugel generiert wird und die Verbindung einfach einmal erhalten bleiben soll. Das Problem ist dass die Verbindung steht, aber sobald wir die Kugel kreiert haben die Verbindung von Client Seite aus abgebrochen wird. Kann uns jemand da vlt helfen, wie wir dieses Problem lösen können? Den Quelltext werde ich demnächst auch einmal hier reinstellen.

Danke schon einmal im Voraus!

mfg
Schlauch & the BKI2 Group Smile
 

Klaas

BeitragMi, Jan 19, 2005 10:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
ohne Quellcode kann ich nur mal raten.

Zitat:

Jetzt haben wir das Programm so erweitert dass nach dem Verbinden eine Kugel generiert wird

passiert das denn auf beiden Seiten ?

P.S.: TCP hat seine Tücken! Die erste Wahl für solche Vorhaben ist und bleibt UDP.
 

morszeck

BeitragMi, Jan 19, 2005 10:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht wird eine Variabel die für TCP gebraucht wird missbraucht und so wird die Verbindung unterbrochen...

bruZard

BeitragMi, Jan 19, 2005 10:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Es wäre äußerst vorteilhaft wenn Du etwas Code posten würdest, in diesem Fall kann ich, wie Klaas, einfach nur raten:

Erstellt Ihr die TCP Verbindung über ein lokales Handle innerhalb einer Funktion? Wenn dem so ist: Sobald die Funktion beendet wird existiert auch die Variable mit dem Handle auf den TCP Stream nicht mehr.
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image
 

Schlauch

BeitragMi, Jan 19, 2005 10:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, die Kugel wird bis jetzt nur beim CLient erstellt, der Server hat keine 3D Objekte, braucht er ja eigentlich auch nicht. Kann es sein dass man eine Verbindung im Graphics3D Mode anders aufnimmt als im normalen Graphics Mode? Oder dass eine Verbindung von einem Client in Graphics3D nicht zu einem Server mit Graphics hergestellt werden kann?

Den Quelltext für den Server und Client kann ich heute Mittag einmal online stellen, habe ihn gerade nicht hier, da ich an einem Schul PC bin.

Danke für deine Hilfe, wir werden es einmal mit UDP versuchen, das komische ist ja nur dass der Chat mit TCP funktioniert hat, und derzeit nichts weiter mit der Verbindng geschieht ausser dass sie einmal erhalten bleiben soll.
mfg
Schlauch

Jan_

Ehemaliger Admin

BeitragMi, Jan 19, 2005 11:08
Antworten mit Zitat
Benutzer-Profile anzeigen
hm,

Habt ihr die reinfolge?

TCP,
Graphics3D,
Weitere TCP Sachen?

wenn ja, funktioniert es nciht.

BB entlädt fast alles, beim Graphics befehl.
--> erst Graphics setzten, dann TCP sachen
between angels and insects
 

Klaas

BeitragMi, Jan 19, 2005 11:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:

Nein, die Kugel wird bis jetzt nur beim CLient erstellt, der Server hat keine 3D Objekte, braucht er ja eigentlich auch nicht. Kann es sein dass man eine Verbindung im Graphics3D Mode anders aufnimmt als im normalen Graphics Mode? Oder dass eine Verbindung von einem Client in Graphics3D nicht zu einem Server mit Graphics hergestellt werden kann?


nein, das ist völlig Problemlos.

warten wir ersteinmal auf deinen Code, dann wird sich das sicher klären lassen. Meistens ist das Problem ein verlorenes Handle.
 

Schlauch

BeitragMi, Jan 19, 2005 14:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier der Quellcode für den Server:

Code: [AUSKLAPPEN]
Graphics 640,480,16,2 ;größe des fensters

;Name der Anwendung
AppTitle "CHAT SERVER"

Global received_stream
Const k_space = 57
Const k_esc = 1

;struktur client mit zwei eigenschaften: client name und client ID stream
Type client
   Field uid$
   Field stream
End Type

;globale variable vom typ client
Global c.client

;Portnummer
port = 3024

;Startet den Server
svrGame=CreateTCPServer(port)

;Überprüft ob der Server gestartet wurde, wenn nicht, Programmende
If svrGame<>0 Then
Print "Server erfolgreich gestartet - überprüft Port " + port
Else
Print "Server nicht gestartet " + port
End
End If

;=====================================================================

;Hauptschleife bis ESC gedrückt wird
While Not KeyDown(k_esc)
message$ = ""

;überprüfung auf neue Client-connection
strStream=AcceptTCPStream(svrGame)

If strStream Then ;eine neuer Client ist da

;speichert den stream
received_stream = strStream

;liest Infos vom client
If ReadAvail(strStream) Then
message$ =  ReadLine$(strStream)
Print message$
EndIf

Else

;es gibt keine neue Verbindungen; checkt ob Daten vom Client kommen
For c.client = Each client

If ReadAvail(c\stream) Then
   ;Print "incoming message from client: " + c\UID
   received_stream = c\stream
   the_user$ = c\uid$
   message$ =  ReadLine$(c\stream)
   Exit
EndIf
Next


EndIf


If message$ <> "" Then ;kam eine neue Nachricht, oder es kam ein neuer Client in den Chat

   ;verarbeitet daten vom Client:

   ;überprüft header der Nachricht
   header$ = Mid$(message$,1,3)
   
   ;wählt header aus
   Select    header$
   
   Case "UID" ;es ist eine neue Client-connection
      
      ;liest Nicknamen aus
      the_user$ = Mid$(message$,4)
      
      ;generiert neue struktur von client und speichert userid und stream nummer
      c.client = New client
      c\uid = the_user$
      c\stream = strstream
      
      ;Client bekommt Stream nummer vom server
      WriteLine c\stream, "SRV_ID" + c\stream
            
      ;schickt neue connection an alle
      ;msg_new$ = "<" + the_user$ + "> connected !"
      ;fürs spiel!!
      
      msg_new$ = "SRVNEW" + the_user$
      Print msg_new$
      notify_message(msg_new$)
      
      
   Case "MSG" ;Nachricht vom Client
      
      ;fürs Spiel!!
      msg_new$ = Mid$(message,4) + the_user$
      ;msg_new$ = "<" + the_user$ + ">  " + Mid$(message,4)
      notify_message(msg_new$)
      
      
   Case "ESC";ein Client ist aus dem Chat
   
      ;liest von dem Client, der aus dem Chat ist, den Nicknamen aus
      client_stream = Mid(message$,4)
   
      ;den Client in der liste finden
      For c.client = Each client
         
         If c\stream = client_stream Then
            
            ;speichert den Nicknamen
            the_user$ = c\uid   
            
            ;löscht den Client
            Delete c
            
            ;schließt for
            Exit
         EndIf
      Next

      ;schickt nachricht an alle
      msg_new$ = "<" + the_user$ + ">  Disconnected"
      notify_message(msg_new$)
      
   End Select

   ;kleine pause
   Delay 20
   
EndIf

;wenn leertaste gedrückt wird, kann man eine Nachricht eingeben
;If KeyDown(k_space)
   
   ;warten solange sie gedrückt ist
   ;While KeyDown(k_space)
   ;Wend

   ;Nachricht eingeben
   ;message$ = Input$("Deine Nachricht: ")
         
   ;Nachricht bearbeiten
   ;msg_new$ =   "<server> " + message$
   
   ;Nachricht an alle schicken
   ;notify_message(msg_new$)
   
;EndIf



Wend

;beenden
;sendet Tschüss an alle
notify_message("Tschüss")
Delay 20

End

;===============================
Function notify_message(msg_new$)
;===============================

;notifyes the message on the server itself
If Instr(Upper(msg_new$),Upper("disconnected")) Then
   Color 255,0,0
EndIf

;gibt Clientnachricht auf dem Bildschirm aus
If received_stream <> 0 Then
   Print msg_new$
EndIf

Color 255,255,255

;sendet die nachricht an alle Clients, ausser dem Sender
c.client = First client
For c.client = Each client
   If c\stream <> received_stream Then
      WriteLine c\stream,msg_new$
   EndIf
Next

received_stream = 0

End Function


Und den Client:

Code: [AUSKLAPPEN]
;portnummer
port = 3024

;windoweinstellungen
Graphics3D 640,480,16,2
AppTitle "CHAT CLIENT"

SetBuffer BackBuffer()

camera=CreateCamera()
CameraViewport camera,0,0,800,600

light=CreateLight()


;Struktur für den Spieler
Type player
   Field name$
   Field xpos#
   Field ypos#
   Field zpos#
   Field kugel
End Type

;Globale Variable vom Typ Player
Global p.player

p=New player
                        
;der stream der mit dem server kommuniziert
Global client_stream
Global strmClient

;Konstante für die Tastatur "space" and "esc" keys
Const k_space = 57
Const k_esc = 1

;frage nach IP vom Server
svr_ip$ = Input$("Bitte IP vom Server eingeben: ")

;frage nach dem Nickname
client_id$ = Input$("Bitte Nicknamen eingeben: ")


;wenn kein name, dann ende
If client_id$ = "" Then End

;Stream wird geöffnet
strmClient=OpenTCPStream(svr_ip$,port)

;Der server bekommt den nickname zugeschickt
msg$ = "UID" + client_id$
WriteLine strmClient,msg$


;Überprüfung ob der stream geöffnet wurde
If strmClient<>0 Then
   Print "Client erfolgreich connected"
Else
   Print "Client konnte nicht verbunden werden - wird geschlossen."
   WaitKey
   End
End If

Delay 600

;Der server bekommt den nickname zugeschickt
;msg$ = "UID" + client_id$
;WriteLine strmClient,msg$

;Kugel generieren und werte setzen

p.player = First player

p\kugel = CreateCube ()
p\xpos = 01
p\ypos = 01
p\zpos = 07
            
PositionEntity p\kugel, p\xpos, p\ypos, p\zpos


While Not KeyHit(k_esc)

Client()

p.player = First player

If KeyDown(200)   Then
      p\ypos = p\ypos + 0.1
      ;MoveEntity camera, 0,0,-0.1
   EndIf
   
   If KeyDown(203)   Then
      p\xpos = p\xpos - 0.1
      ;MoveEntity camera, 0,0.1,0
   EndIf
   
   If KeyDown(205)   Then
      p\xpos = p\xpos + 0.1
      ;MoveEntity camera, 0,-0.1,0
   EndIf
   
   If KeyDown(208)   Then
      p\ypos = p\ypos - 0.1
      ;MoveEntity camera, 0,0,0.1
   EndIf
   



For p.player = Each player
            
            
            ;generiert neu
            PositionEntity p\kugel, p\xpos, p\ypos, p\zpos
            
            ;schließt For
            Exit
         
      Next

UpdateWorld
   RenderWorld
   

   Flip

Wend
End

;=======================================
Function Client()
;=======================================

;Schleife bis ESC gedrückt wird
;While Not KeyDown(k_esc)

;if space, dann kann man eine nachricht eingeben
;If KeyDown(k_space)
   
   ;Warten solange space gedrückt ist
   ;While KeyDown(k_space)
   ;Wend

   ;man kann die nachricht eingeben
   ;message$ = Input$("Deine Nachricht: ")
   ;fürs Spiel!!!
   message$ = "MSG" + xpos + ypos + zpos
         
   ;schreibt msg(message) vor die nachricht und schickt es zum server
   ;msg$ =   "MSG" + message$   
   WriteLine strmClient, msg$
   
      
;EndIf

;auf kommende nachricht prüfen

;wenn eine nachricht kommt
If ReadAvail (strmClient)  Then

   ;nachricht empfangen
   message$ = ReadLine$ (strmClient)
      
   ;prüfen ob die nachricht vom server ist
   If Mid$(message$,1,3) = "SRV" Then
      
      ;den zweiten teil rauslesen
      what$ = Mid$(message$,4,3)
      Select what$
      
         Case "_ID"
            ;Der Server hat seine ID geschickt
            client_stream = Mid$(message$,7)
            ;Print "client_stream = " + client_stream
         
         Case "BYE"
            ;server disconnected !
            Color 255,0,0
            Print " - Der Server ist down - esc drücken zum beenden - "
            Color 255,255,255
         
         ;fürs Spiel!!   
         Case "NEW"
            ;neue strucktur mit new anlegen
            ;Name speichern
            p.player = New player
            p\name = Mid$(message$,7)
            p\kugel = CreateCube ()

            
         ;Default
            ;Unbekannte nachricht
            ;Print " - Unbekannte nachricht vom server - "
      
      End Select
      
   Else
      ;it's a simple broadcast message
      ;prints in red color a disconnection message
      If Instr(Upper(message$),Upper("disconnected")) Then
         Color 255,0,0
      EndIf
      
      ;nachricht anzeigen   
      ;Print "<" + message$ + ">"
      ;Color 255,255,255
      
      ;fürs Spiel!!!!
      ;aktualisierung der werte in der struktur
      ;mit for-schleife
      ;den Client in der liste finden
      
      For p.player = Each player
         
         If p\name = Mid$(message$,7) Then
            
            ;speichert die neuen Werte
            p\xpos = Mid$(message$, 1, 2)   
            p\ypos = Mid$(message$, 3, 2)
            p\zpos = Mid$(message$, 5, 2)
            
            ;schließt for
            Exit
         EndIf
      Next

            
   EndIf
   
EndIf

;Verzögerung
Delay 30

;Wend

;verbindung beenden
msg$ = "ESC" + client_stream
WriteLine strmClient,msg$
Delay 30

End Function


Also Fakt ist dass auf diesem Port das ganze als Chat-Programm funktioniert hat.

Danke für eure Hilfe!

mfg
Schlauch

Jan_

Ehemaliger Admin

BeitragMi, Jan 19, 2005 14:38
Antworten mit Zitat
Benutzer-Profile anzeigen
lol

schaue mal, was deine Client Function am ende stehen hat!
Code: [AUSKLAPPEN]

EndIf

;Verzögerung
Delay 30

;Wend

;verbindung beenden
msg$ = "ESC" + client_stream
WriteLine strmClient,msg$
Delay 30

End Function


msg$ = "ESC" + client_stream
WriteLine strmClient,msg$
beendet die Verbindung Smile


Ausserdem:
Code: [AUSKLAPPEN]

WriteLine strmClient,msg$


;Überprüfung ob der stream geöffnet wurde
If strmClient<>0 Then
   Print "Client erfolgreich connected"
Else
   Print "Client konnte nicht verbunden werden - wird geschlossen."
   WaitKey
   End
End If

-->
Code: [AUSKLAPPEN]




;Überprüfung ob der stream geöffnet wurde
If strmClient<>0 Then
   Print "Client erfolgreich connected"
Else
   Runtimeerror "Client konnte nicht verbunden werden - wird geschlossen."
End If
WriteLine strmClient,msg$
between angels and insects
 

Schlauch

BeitragMi, Jan 19, 2005 15:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok. Merci. Also er disconnected jetzt nicht mehr,aber der Server bringt eine Fehlermeldung "Runtime Error: Stream does not exist" und der Server wird geschlossen.

Fettes Dankeschön
mfg
Schlauch

Jan_

Ehemaliger Admin

BeitragMi, Jan 19, 2005 15:13
Antworten mit Zitat
Benutzer-Profile anzeigen
jup, befor du dein POrogramm beendest, immer alle Streams schließen.

Jetzt musst du dienen PC neu Starten Smile
between angels and insects
 

Schlauch

BeitragMi, Jan 19, 2005 15:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Also muss das hier:
Code: [AUSKLAPPEN]
;verbindung beenden
msg$ = "ESC" + client_stream
WriteLine strmClient,msg$
Delay 30


im prinzip nach der spieleschleife kommen, ganz am programmende?


ok. fett merci

Jan_

Ehemaliger Admin

BeitragMi, Jan 19, 2005 15:21
Antworten mit Zitat
Benutzer-Profile anzeigen
jap

fast richtig
Code: [AUSKLAPPEN]

;verbindung beenden
msg$ = "ESC" + client_stream
WriteLine strmClient,msg$
CLOSETCPSTREAM strmClient


CLOSETCPSTREAM schließt die Verbingung dann ab, sonst kann es passieren, das die Ports unbenutzbar sind, bis zum nächsten Reboot
between angels and insects
 

Schlauch

BeitragMi, Jan 19, 2005 15:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, schön und gut, aber das Problem ist immer noch dass an der Stelle an der ich die Kugel erstelle und er ehemalig diconnected hat dieser Runtime Error kommt.

Jan_

Ehemaliger Admin

BeitragMi, Jan 19, 2005 15:31
Antworten mit Zitat
Benutzer-Profile anzeigen
hasst du deinen PC neu gestertet?

Falls ja, nutzte einen anderen Ausgangsport, als den Ziel port.
Ich bin mir nicht sihcer, ob es daran liegen könnte

Code: [AUSKLAPPEN]
;portnummer
port = 3024

;windoweinstellungen
Graphics3D 640,480,16,2
AppTitle "CHAT CLIENT"

SetBuffer BackBuffer()

camera=CreateCamera()
CameraViewport camera,0,0,800,600

light=CreateLight()


;Struktur für den Spieler
Type player
   Field name$
   Field xpos#
   Field ypos#
   Field zpos#
   Field kugel
End Type

;Globale Variable vom Typ Player
Global p.player

p=New player
                         
;der stream der mit dem server kommuniziert
Global client_stream
Global strmClient

;Konstante für die Tastatur "space" and "esc" keys
Const k_space = 57
Const k_esc = 1

;frage nach IP vom Server
svr_ip$ = Input$("Bitte IP vom Server eingeben: ")

;frage nach dem Nickname
client_id$ = Input$("Bitte Nicknamen eingeben: ")


;wenn kein name, dann ende
If client_id$ = "" Then End

;Stream wird geöffnet
strmClient=OpenTCPStream(svr_ip$,port)

;Der server bekommt den nickname zugeschickt
msg$ = "UID" + client_id$



;Überprüfung ob der stream geöffnet wurde
If strmClient<>0 Then
   Print "Client erfolgreich connected"
Else
   RuntimeError "Client konnte nicht verbunden werden - wird geschlossen."
   ;WaitKey
   ;End
End If


WriteLine strmClient,msg$
Delay 600

;Der server bekommt den nickname zugeschickt
;msg$ = "UID" + client_id$
;WriteLine strmClient,msg$

;Kugel generieren und werte setzen

p.player = First player

p\kugel = CreateCube ()
p\xpos = 01
p\ypos = 01
p\zpos = 07
             
PositionEntity p\kugel, p\xpos, p\ypos, p\zpos


While Not KeyHit(k_esc)

Client()

p.player = First player

If KeyDown(200)   Then
      p\ypos = p\ypos + 0.1
      ;MoveEntity camera, 0,0,-0.1
   EndIf
   
   If KeyDown(203)   Then
      p\xpos = p\xpos - 0.1
      ;MoveEntity camera, 0,0.1,0
   EndIf
   
   If KeyDown(205)   Then
      p\xpos = p\xpos + 0.1
      ;MoveEntity camera, 0,-0.1,0
   EndIf
   
   If KeyDown(208)   Then
      p\ypos = p\ypos - 0.1
      ;MoveEntity camera, 0,0,0.1
   EndIf
   



For p.player = Each player
             
             
            ;generiert neu
            PositionEntity p\kugel, p\xpos, p\ypos, p\zpos
             
            ;schließt For
            Exit
         
      Next

UpdateWorld
   RenderWorld
   

   Flip

Wend
End

;=======================================
Function Client()
;=======================================

;Schleife bis ESC gedrückt wird
;While Not KeyDown(k_esc)

;if space, dann kann man eine nachricht eingeben
;If KeyDown(k_space)
   
   ;Warten solange space gedrückt ist
   ;While KeyDown(k_space)
   ;Wend

   ;man kann die nachricht eingeben
   ;message$ = Input$("Deine Nachricht: ")
   ;fürs Spiel!!!
   message$ = "MSG" + xpos + ypos + zpos
         
   ;schreibt msg(message) vor die nachricht und schickt es zum server
   ;msg$ =   "MSG" + message$   
   WriteLine strmClient, msg$
   
       
;EndIf

;auf kommende nachricht prüfen

;wenn eine nachricht kommt
If ReadAvail (strmClient)  Then

   ;nachricht empfangen
   message$ = ReadLine$ (strmClient)
       
   ;prüfen ob die nachricht vom server ist
   If Mid$(message$,1,3) = "SRV" Then
       
      ;den zweiten teil rauslesen
      what$ = Mid$(message$,4,3)
      Select what$
       
         Case "_ID"
            ;Der Server hat seine ID geschickt
            client_stream = Mid$(message$,7)
            ;Print "client_stream = " + client_stream
         
         Case "BYE"
            ;server disconnected !
            Color 255,0,0
            Print " - Der Server ist down - esc drücken zum beenden - "
            Color 255,255,255
         
         ;fürs Spiel!!   
         Case "NEW"
            ;neue strucktur mit new anlegen
            ;Name speichern
            p.player = New player
            p\name = Mid$(message$,7)
            p\kugel = CreateCube ()

             
         ;Default
            ;Unbekannte nachricht
            ;Print " - Unbekannte nachricht vom server - "
       
      End Select
       
   Else
      ;it's a simple broadcast message
      ;prints in red color a disconnection message
      If Instr(Upper(message$),Upper("disconnected")) Then
         Color 255,0,0
      EndIf
       
      ;nachricht anzeigen   
      ;Print "<" + message$ + ">"
      ;Color 255,255,255
       
      ;fürs Spiel!!!!
      ;aktualisierung der werte in der struktur
      ;mit for-schleife
      ;den Client in der liste finden
       
      For p.player = Each player
         
         If p\name = Mid$(message$,7) Then
             
            ;speichert die neuen Werte
            p\xpos = Mid$(message$, 1, 2)   
            p\ypos = Mid$(message$, 3, 2)
            p\zpos = Mid$(message$, 5, 2)
             
            ;schließt for
            Exit
         EndIf
      Next

             
   EndIf
   
EndIf

;Verzögerung
Delay 30

;Wend

;verbindung beenden
;msg$ = "ESC" + client_stream
;WriteLine strmClient,msg$
;Delay 30

End Function
between angels and insects
 

Schlauch

BeitragMi, Jan 19, 2005 15:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Also eigentlic kann es dara nicht liegen. Normal dürfte da nichts blockiert sein. Hab das jetzt Spaßeshalber einfach einmal versucht und den Port auf 1024 geändert, damit gehts auf jeden Fall. Aber der Error kommt immer noch

Jan_

Ehemaliger Admin

BeitragMi, Jan 19, 2005 15:40
Antworten mit Zitat
Benutzer-Profile anzeigen
warum denn das :-/

stelle deine 2 Dateien nochmal, in der jetztigen fassung hier herrein.
between angels and insects
 

Schlauch

BeitragMi, Jan 19, 2005 15:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Client:

Code: [AUSKLAPPEN]
;portnummer
port = 1024

;windoweinstellungen
Graphics3D 640,480,16,2
AppTitle "CHAT CLIENT"

SetBuffer BackBuffer()

camera=CreateCamera()
CameraViewport camera,0,0,800,600

light=CreateLight()


;Struktur für den Spieler
Type player
   Field name$
   Field xpos#
   Field ypos#
   Field zpos#
   Field kugel
End Type

;Globale Variable vom Typ Player
Global p.player

p=New player
                        
;der stream der mit dem server kommuniziert
Global client_stream
Global strmClient

;Konstante für die Tastatur "space" and "esc" keys
Const k_space = 57
Const k_esc = 1

;frage nach IP vom Server
svr_ip$ = Input$("Bitte IP vom Server eingeben: ")

;frage nach dem Nickname
client_id$ = Input$("Bitte Nicknamen eingeben: ")


;wenn kein name, dann ende
If client_id$ = "" Then End

;Stream wird geöffnet
strmClient=OpenTCPStream(svr_ip$,port)

;Der server bekommt den nickname zugeschickt
msg$ = "UID" + client_id$
WriteLine strmClient,msg$


;Überprüfung ob der stream geöffnet wurde
;Überprüfung ob der stream geöffnet wurde
If strmClient<>0 Then
   Print "Client erfolgreich connected"
Else
   Runtimeerror "Client konnte nicht verbunden werden - wird geschlossen."
End If
WriteLine strmClient,msg$

Delay 600

;Der server bekommt den nickname zugeschickt
;msg$ = "UID" + client_id$
;WriteLine strmClient,msg$

;Kugel generieren und werte setzen

p.player = First player

p\kugel = CreateCube ()
p\xpos = 01
p\ypos = 01
p\zpos = 07
            
PositionEntity p\kugel, p\xpos, p\ypos, p\zpos


While Not KeyHit(k_esc)

Client()

p.player = First player

If KeyDown(200)   Then
      p\ypos = p\ypos + 0.1
      ;MoveEntity camera, 0,0,-0.1
   EndIf
   
   If KeyDown(203)   Then
      p\xpos = p\xpos - 0.1
      ;MoveEntity camera, 0,0.1,0
   EndIf
   
   If KeyDown(205)   Then
      p\xpos = p\xpos + 0.1
      ;MoveEntity camera, 0,-0.1,0
   EndIf
   
   If KeyDown(208)   Then
      p\ypos = p\ypos - 0.1
      ;MoveEntity camera, 0,0,0.1
   EndIf
   



For p.player = Each player
            
            
            ;generiert neu
            PositionEntity p\kugel, p\xpos, p\ypos, p\zpos
            
            ;schließt For
            Exit
         
      Next

UpdateWorld
   RenderWorld
   

   Flip

Wend

;verbindung beenden
msg$ = "ESC" + client_stream
WriteLine strmClient,msg$
CloseTCPStream strmClient

End

;=======================================
Function Client()
;=======================================

;Schleife bis ESC gedrückt wird
;While Not KeyDown(k_esc)

;if space, dann kann man eine nachricht eingeben
;If KeyDown(k_space)
   
   ;Warten solange space gedrückt ist
   ;While KeyDown(k_space)
   ;Wend

   ;man kann die nachricht eingeben
   ;message$ = Input$("Deine Nachricht: ")
   ;fürs Spiel!!!
   message$ = "MSG" + xpos + ypos + zpos
         
   ;schreibt msg(message) vor die nachricht und schickt es zum server
   ;msg$ =   "MSG" + message$   
   WriteLine strmClient, msg$
   
      
;EndIf

;auf kommende nachricht prüfen

;wenn eine nachricht kommt
If ReadAvail (strmClient)  Then

   ;nachricht empfangen
   message$ = ReadLine$ (strmClient)
      
   ;prüfen ob die nachricht vom server ist
   If Mid$(message$,1,3) = "SRV" Then
      
      ;den zweiten teil rauslesen
      what$ = Mid$(message$,4,3)
      Select what$
      
         Case "_ID"
            ;Der Server hat seine ID geschickt
            client_stream = Mid$(message$,7)
            ;Print "client_stream = " + client_stream
         
         Case "BYE"
            ;server disconnected !
            Color 255,0,0
            Print " - Der Server ist down - esc drücken zum beenden - "
            Color 255,255,255
         
         ;fürs Spiel!!   
         Case "NEW"
            ;neue strucktur mit new anlegen
            ;Name speichern
            p.player = New player
            p\name = Mid$(message$,7)
            p\kugel = CreateCube ()

            
         ;Default
            ;Unbekannte nachricht
            ;Print " - Unbekannte nachricht vom server - "
      
      End Select
      
   Else
      ;it's a simple broadcast message
      ;prints in red color a disconnection message
      If Instr(Upper(message$),Upper("disconnected")) Then
         Color 255,0,0
      EndIf
      
      ;nachricht anzeigen   
      ;Print "<" + message$ + ">"
      ;Color 255,255,255
      
      ;fürs Spiel!!!!
      ;aktualisierung der werte in der struktur
      ;mit for-schleife
      ;den Client in der liste finden
      
      For p.player = Each player
         
         If p\name = Mid$(message$,7) Then
            
            ;speichert die neuen Werte
            p\xpos = Mid$(message$, 1, 2)   
            p\ypos = Mid$(message$, 3, 2)
            p\zpos = Mid$(message$, 5, 2)
            
            ;schließt for
            Exit
         EndIf
      Next

            
   EndIf
   
EndIf

;Verzögerung
Delay 30

;Wend

;verbindung beenden FALSCH!!!!!
;msg$ = "ESC" + client_stream
;WriteLine strmClient,msg$
;Delay 30

End Function


Server:

Code: [AUSKLAPPEN]
Graphics 640,480,16,2 ;größe des fensters

;Name der Anwendung
AppTitle "CHAT SERVER"

Global received_stream
Const k_space = 57
Const k_esc = 1

;struktur client mit zwei eigenschaften: client name und client ID stream
Type client
   Field uid$
   Field stream
End Type

;globale variable vom typ client
Global c.client

;Portnummer
port = 1024

;Startet den Server
svrGame=CreateTCPServer(port)

;Überprüft ob der Server gestartet wurde, wenn nicht, Programmende
If svrGame<>0 Then
Print "Server erfolgreich gestartet - überprüft Port " + port
Else
Print "Server nicht gestartet " + port
End
End If

;=====================================================================

;Hauptschleife bis ESC gedrückt wird
While Not KeyDown(k_esc)
message$ = ""

;überprüfung auf neue Client-connection
strStream=AcceptTCPStream(svrGame)

If strStream Then ;eine neuer Client ist da

;speichert den stream
received_stream = strStream

;liest Infos vom client
If ReadAvail(strStream) Then
message$ =  ReadLine$(strStream)
Print message$
EndIf

Else

;es gibt keine neue Verbindungen; checkt ob Daten vom Client kommen
For c.client = Each client
If ReadAvail(c\stream) Then
   ;Print "incoming message from client: " + c\UID
   received_stream = c\stream
   the_user$ = c\uid$
   message$ =  ReadLine$(c\stream)
   Exit
EndIf
Next


EndIf


If message$ <> "" Then ;kam eine neue Nachricht, oder es kam ein neuer Client in den Chat

   ;verarbeitet daten vom Client:

   ;überprüft header der Nachricht
   header$ = Mid$(message$,1,3)
   
   ;wählt header aus
   Select    header$
   
   Case "UID" ;es ist eine neue Client-connection
      
      ;liest Nicknamen aus
      the_user$ = Mid$(message$,4)
      
      ;generiert neue struktur von client und speichert userid und stream nummer
      c.client = New client
      c\uid = the_user$
      c\stream = strstream
      
      ;Client bekommt Stream nummer vom server
      WriteLine c\stream, "SRV_ID" + c\stream
            
      ;schickt neue connection an alle
      ;msg_new$ = "<" + the_user$ + "> connected !"
      ;fürs spiel!!
      
      msg_new$ = "SRVNEW" + the_user$
      Print msg_new$
      notify_message(msg_new$)
      
      
   Case "MSG" ;Nachricht vom Client
      
      ;fürs Spiel!!
      msg_new$ = Mid$(message,4) + the_user$
      ;msg_new$ = "<" + the_user$ + ">  " + Mid$(message,4)
      notify_message(msg_new$)
      
      
   Case "ESC";ein Client ist aus dem Chat
   
      ;liest von dem Client, der aus dem Chat ist, den Nicknamen aus
      client_stream = Mid(message$,4)
   
      ;den Client in der liste finden
      For c.client = Each client
         
         If c\stream = client_stream Then
            
            ;speichert den Nicknamen
            the_user$ = c\uid   
            
            ;löscht den Client
            Delete c
            
            ;schließt for
            Exit
         EndIf
      Next

      ;schickt nachricht an alle

      msg_new$ = "<" + the_user$ + ">  Disconnected"
      notify_message(msg_new$)
      
   End Select

   ;kleine pause
   Delay 20
   
EndIf

;wenn leertaste gedrückt wird, kann man eine Nachricht eingeben
;If KeyDown(k_space)
   
   ;warten solange sie gedrückt ist
   ;While KeyDown(k_space)
   ;Wend

   ;Nachricht eingeben
   ;message$ = Input$("Deine Nachricht: ")
         
   ;Nachricht bearbeiten
   ;msg_new$ =   "<server> " + message$
   
   ;Nachricht an alle schicken
   ;notify_message(msg_new$)
   
;EndIf



Wend

;beenden
;sendet Tschüss an alle
notify_message("Tschüss")
Delay 20

End

;===============================
Function notify_message(msg_new$)
;===============================

;notifyes the message on the server itself
If Instr(Upper(msg_new$),Upper("disconnected")) Then
   Color 255,0,0
EndIf

;gibt Clientnachricht auf dem Bildschirm aus
If received_stream <> 0 Then
   Print msg_new$
EndIf

Color 255,255,255

;sendet die nachricht an alle Clients, ausser dem Sender
c.client = First client
For c.client = Each client
   If c\stream <> received_stream Then
      WriteLine c\stream,msg_new$
   EndIf
Next

received_stream = 0

End Function

Jan_

Ehemaliger Admin

BeitragMi, Jan 19, 2005 15:53
Antworten mit Zitat
Benutzer-Profile anzeigen
ohman,
Code: [AUSKLAPPEN]

;Der server bekommt den nickname zugeschickt
msg$ = "UID" + client_id$
WriteLine strmClient,msg$


;Überprüfung ob der stream geöffnet wurde
;Überprüfung ob der stream geöffnet wurde
If strmClient<>0 Then
   Print "Client erfolgreich connected"
Else
   Runtimeerror "Client konnte nicht verbunden werden - wird geschlossen."
End If
WriteLine strmClient,msg$


-->

Code: [AUSKLAPPEN]

;Der server bekommt den nickname zugeschickt
msg$ = "UID" + client_id$

;Überprüfung ob der stream geöffnet wurde
If strmClient<>0 Then
   Print "Client erfolgreich connected"
Else
   Runtimeerror "Client konnte nicht verbunden werden - wird geschlossen."
End If
WriteLine strmClient,msg$


WEnn du den String 2x Zuschickst, sagt der Server doch, nein Nick schon besetzt.
between angels and insects
 

Schlauch

BeitragMi, Jan 19, 2005 16:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok danke für die Hilfe, jetzt funktionierts. Habe das nicht ganz erkannt, da ein anderes Teammitglied das programmiert hat, ich bin eher für die Spielegrafik und das Spielprinzip verantwortlich, den Netzwerkpart hat jemand anderes. Trotzdem Danke!!!

mfg
Schlauch Very Happy

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group