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

SchlauchBetreff: TCP-Stream reisst bei erstellen eines 3D Objektes ab!? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
Klaas |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Vielleicht wird eine Variabel die für TCP gebraucht wird missbraucht und so wird die Verbindung unterbrochen... | ||
![]() |
bruZard |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit 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?
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
jup, befor du dein POrogramm beendest, immer alle Streams schließen.
Jetzt musst du dienen PC neu Starten ![]() |
||
between angels and insects |
Schlauch |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
warum denn das :-/
stelle deine 2 Dateien nochmal, in der jetztigen fassung hier herrein. |
||
between angels and insects |
Schlauch |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group