Problem mit mehreren Clients

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

GearTechDE

ehemals 'KillerJo96'

Betreff: Problem mit mehreren Clients

BeitragSa, Okt 08, 2011 16:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich hatte mich zwar vor einiger Zeit entschlossen, den Server über Visual Basic zu machen, doch das konnte ich genau so wenig umsetzen Laughing

Also hab ich mich umentschlossen doch einen Server mit Blitz3D zu programmieren.

Bis jetzt hat auch alles geklappt.
Der Server startet, EIN Client kann joinen und Nachrichten austauschen.
Jedoch kann immer nur ein Client joinen. Warum? Wie behebe ich das?
Ich hatte schonmal einen Thread wie diesen aufgemacht, jedoch guckt dort leider keiner mehr rein.

Ich hoffe jeder versteht mein Problem.

Danke schon im Voraus.
Mit freundlichen Grüßen: GearTechDE

count-doku

BeitragSa, Okt 08, 2011 17:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst halt die Clienthandles in einem Dim Feld oder Type (besser) speichern.
Danach gehst du alle Einträge durch, und checkst, ob neue Nachrichten da sind.

Arbeitest du mit TCP oder UDP?

GearTechDE

ehemals 'KillerJo96'

BeitragSa, Okt 08, 2011 17:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh tut mir leid, ich habe vergessen zu sagen dass ich TCP benutze...

Hmm mit einem Type speichern.. Könntest du vielleicht ein kleines Beispiel posten?
Ich weiß nämlich im Moment nicht welchen Befehl ich sozusagen Typisieren soll xD.
Also wie ich die "Handles" in den Type kriege.

Ein Beispiel wäre wirklich sehr nett. Es muss auch nur der Teil mit den Handles sein und wie man dann die in den Type macht. der rest mit CreateTCPServer muss nicht sein xD

Danke.
Mit freundlichen Grüßen: GearTechDE

ToeB

BeitragSa, Okt 08, 2011 17:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Villeicht wäre es auch Hilfreich deinen Bisherigen Code zu sehen.

Am besten legt du eine fest definierte Anzahl von Clients fest, die Maximal gleichzeitig mit dem Server verbunden sein können (Bspw.: 16). Dann Erstellst du ein Type, in dem z.B. die IP und der Port des Clienten gespeichert sind und auch der Stream für die TCP-Verbindung. Dann legst du ein Array mit der ClientAnzahl an, welches nur für die Clienten da ist, Beispiel:
BlitzBasic: [AUSKLAPPEN]
Type TClient
Field ID
Field IP, Port
Field stream
End Type

Const MaxClient = 16
Dim Clients.TClient( MaxClient-1 )


Somit hast du eine Liste von 16 "TClient"s(0-15). Somit kannst du jetzt, wenn sich ein neuer Client anmeldet, prüfen ob noch ein Speicherplatz in "Clients" nicht Null ist, also kein Client dort gespeichert ist, und speicherst die entsprechenden Informationen.

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

GearTechDE

ehemals 'KillerJo96'

BeitragSa, Okt 08, 2011 17:47
Antworten mit Zitat
Benutzer-Profile anzeigen
also das mit den MaxClients lasse ich erstmal da ich:

1.) So viele leute auf den server lassen will wie nur möglich
2.) ich mich mit arrays nich so gut auskenne und keine tutorials finde Rolling Eyes

Jetzt noch mal für´s Verständnis:

Ich erstelle ein Type (Das krieg ich noch hin xD)
Dann gib ich dem Type 3 Felder.

Field Name
Field IP
Field Stream

Wozu muss ich die IP haben? Wenn ich den Stream habe reicht das doch oder?

Naja und dann mach ichs so oder?

Code: [AUSKLAPPEN]

Function NewClient()

C.TClient = New TClient
C\Name = Name$ ;wurde vorher per string in diese variable geliefert per readstring
C\IP = ? ;wozu die IP?
C\stream = AcceptTCPStream(Server) ;Ist das richtig?

End Function


Ist das so richtig?
Ich glaube ich habe das Prinzip nicht so ganz verstanden.
Mit freundlichen Grüßen: GearTechDE

count-doku

BeitragSa, Okt 08, 2011 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
ok,

hier ein Beispiel mit Type (für theoretisch beliebig viele Clients)
(von der Hilfe abgeleitet)

Server:
BlitzBasic: [AUSKLAPPEN]
;Server
; verwaltet Clients per Type
; aus BB Hilfe abgeleitet


Graphics 400,300,0,2
Global Timer = CreateTimer(15)
AppTitle "Server"

; Server eröffnen
Local Stream = CreateTCPServer( 12345 ) ;Port 12345
Color 160, 160, 160
Print "Server eröffnet"

Local NewClient,client.TClient ;ein Client für temp. Einsatz vorbereiten

Type TClient ; Für jeden Client ein Type
Field Stream ; WICHTIG
Field IP$,Port,txt$,msgCount ; beliebige Clientspezifische Zusatzinfos
Field ID ; ebenfalls irgendne Zusatzinfo -- hier um die Clients zu unterscheiden
End Type

While Not KeyHit(1)
; Client verbinden lassen
NewClient = AcceptTCPStream( Stream )
If NewClient
client.TClient=New TClient ; Neuen Client in die Liste(Type) einfügen
client\Stream=NewClient ; Jetzt im Type das Handle speichern -- WICHTIG!
client\IP=DottedIP(TCPStreamIP(client\Stream)) ; Irgendein blabla, das dich vllt. interessiert
client\Port=TCPStreamPort(client\Stream)
client\ID=ID
ID=ID+1
Color 160, 160, 160
Print "Client verbunden: " + client\ID
EndIf

; Alle Clients im TYPE durchgehen
For client.TClient=Each TClient
While ReadAvail( client\Stream ) ; Solange nachrichten ankommen
; Empfangene Nachricht ausgeben
Color 0, 255, 0
Print CurrentTime() +", Empfange: " +ReadLine( client\Stream )+" von "+client\ID ; Readline liest den übertragenen Text aus
; und antworten
client\txt$ = "Antwort Nr. " +client\msgCount
client\msgCount = client\msgCount +1

WriteLine client\Stream, client\txt$ ; WriteLine überträgt den Text
Color 0, 0, 255
Print CurrentTime() +", Sende: " +client\txt$
Wend
Next

WaitTimer(Timer)
Wend

; Streams schliessen
For client.TClient=Each TClient
CloseTCPStream( client\Stream )
Next
CloseTCPServer( Stream )
End


Client:
BlitzBasic: [AUSKLAPPEN]
; Client 
;

Graphics 400,300,0,2
Global Timer = CreateTimer(15)
AppTitle "Client"

; Zum Server verbinden
Local Stream = OpenTCPStream( "127.0.0.1", 12345 )
If Not Stream Then RuntimeError "Verbindung konnte nicht hergestellt werden."

Color 160, 160, 160
Print "Verbinde..."

Local MsgCount = 1, MsgSendTime = MilliSecs() +2000
Local txt$

While Not KeyHit(1)
; Im Sekundetakt eine Nachricht schreiben
If MilliSecs() > MsgSendTime
txt$ = "Nachricht Nr. " +MsgCount
MsgCount = MsgCount +1

WriteLine Stream, txt$ ; WriteLine überträgt den Text
Color 0, 0, 255
Print CurrentTime() +", Sende: " +txt$

MsgSendTime = MilliSecs() +2000
EndIf

; Antworten auslesen
While ReadAvail( Stream )
; Empfangene Nachricht ausgeben
Color 0, 255, 0
Print CurrentTime() +", Empfange: " +ReadLine( Stream ) ; ReadLine liest den übertragenen Text aus
Wend

WaitTimer(Timer)
Wend

; Stream schliessen
CloseTCPStream( Stream )
End


Entscheidend ist halt nur, dass du pro Client einen Type Eintrag hast, und nicht nur eine Variable für alle.
Ob und wie du das in Funktionen packst ist eigentlich egal, und ja die IP und Portnummer brauchst du nicht unbedingt.

mfg,
count-doku

GearTechDE

ehemals 'KillerJo96'

BeitragSa, Okt 08, 2011 17:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Wow, genau das was ich brauche. Irgendwie hab ich mir schon gedacht das man die IP+Port nicht unbedingt braucht. (Vielleicht später für IP Banns oder so zu verteilen 'lach)

Naja danke. Ich hoffe damit komme ich jetzt mal klar. sonst bin ich wirklich zu dumm.

Aber danke.

Edit: Ich habe jetzt alles in meinen Game Client so angepasst. Es hat auf der ersten Blick funktioniert.
Ich denk mal ich habe es jetzt endlich geschafft.

Vielen Dank an dieser Stelle an dich Count Doku.
Mit freundlichen Grüßen: GearTechDE

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group