[Multithread] Probleme mit TCP Protokoll

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

GearTechDE

ehemals 'KillerJo96'

Betreff: [Multithread] Probleme mit TCP Protokoll

BeitragMi, Mai 11, 2011 15:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute, ich nenne diesen Thread schon direkt Multithread, da ich mir zu 1000% sicher bin, dass ich noch weitere Fragen zum Thema TCP habe.

Also nun zu meinem Ersten Problem... (was nicht sooo schlimm ist, nervt aber) ist bestimmt ein Noob Fehler.

Also ich habe einen kleinen wirklich so was von einfachen Server geschrieben.
Hier der Code
[syntax=bb]
Server = CreateTCPServer(8080)
If Server0 Then
Print Server wurde gestartet!
Else
Print Server konnte nicht gestartet werden!
End If

While Not KeyHit(1)
Stream = AcceptTCPStream(Server)
If Stream Then
Print ReadString$(Stream)
WriteString Stream,ReadString$
End If
Wend
End
[syntax]

Dann noch den Client
[syntax=bb]
Print Wie ist dein Name
Name$ = Input()

While Not KeyHit(1)
Stream = OpenTCPStream(127.0.0.1,8080)
WriteString Stream,Name$ + + Input()
CloseTCPStream (Stream)
Wend
[syntax]

Wenn ich die jetzt mit einander kommunizieren lasse, hängt der Server sich manchmal ein bisschen auf und nimmt in der Zeit keine Messages an. Und das selbe Problem auch wenn ich mehrere Clients öffne!

Was ist das Problem Ich bin mir schon ziemlich sicher das ich wieder nen nur minniiiii kleinen Fehler gemacht habe xD. Naja jetzt seid ihr gefragt. Danke schonmal im Voraus. Hoffe das mit dem MultiThread ist hier Okay, falls nicht soll mir bitte ein Moderator ne PM schreiben.

Mfg Killerjo96
Mit freundlichen Grüßen: GearTechDE

ZaP

BeitragMi, Mai 11, 2011 16:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Anstatt den Stream vom Client ständig neu aufzubauen, solltest Du das vielleicht nur einmal vor der Schleife tun.
Starfare: Worklog, Website (download)

GearTechDE

ehemals 'KillerJo96'

BeitragMi, Mai 11, 2011 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
werde es mal testen. danke schonmal
Mit freundlichen Grüßen: GearTechDE

Eingeproggt

BeitragMi, Mai 11, 2011 17:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Mich wunderts ja ein wenig, wie dein Code überhaupt läuft wenn du bei Print den Text nicht in Anführungszeichen setzt...

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

GearTechDE

ehemals 'KillerJo96'

BeitragMi, Mai 11, 2011 17:51
Antworten mit Zitat
Benutzer-Profile anzeigen
xD da ist so vier falsch keine ahnung warum. auf jeden fall habe ich jetzt den openstream vor die schleife gemacht. jetzt kann ich aber nur noch einmal schreiben. ich will mehrmals hintereinander schreiben können. wie mach ich das?
Mit freundlichen Grüßen: GearTechDE

count-doku

BeitragDi, Mai 17, 2011 14:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

1. jedes AcceptTCPStream() gibt einen neuen Client-Handle zurück. Diesen musst du abspeichern -> Types,Dim
2. danach dann halt zum Aktualisieren alle(!) Clients durchgehen und auslesen.
3. ReadString löscht den gelesenen Wert -> In Variable speichern
4. OpenTCPStream einmal pro Client.
5. Mehrere Nachrichten in der Schleife per Input/Eigene Routine

BlitzBasic: [AUSKLAPPEN]
Server = CreateTCPServer(8080) ; TCP Stream erstellen
If Server Then
Print "Server wurde gestartet!"
Else
Print "Server konnte nicht gestartet werden!"
End If

;Entweder bei bekannter maximaler Anzahl Clients
;DIM (X)
;Oder (wenn du es schon kannst) bei unbekannter Anzahl
;TYPE
; FIELD STREAM
;END TYPE
;------------------
;Methode mit DIM und 10 maximalen Clients
Dim Client(9) ; Von 0 - 9 = 10 ; Client Handle
Dim cName$(9) ; Client Namen
;IN DEN TYPE / DAS DIM FELD KOMMEN DANN DIE CLIENT HANDLES

Local timer=CreateTimer(30) ; Programm auf 30 Schleifendurchläufe pro Sekunde begrenzen (30FPS)
While Not KeyHit(1)
Stream = AcceptTCPStream(Server);Prüfen, ob ein neuer Client verbinden will
If Stream Then ;Wenn ja, dann
;PRÜFEN WELCHES DER ERSTE FREIE PLATZ IST
For i=0 To 9
If Client(i)=0
Client(i)=Stream ; Stream im DIM Feld Client speichern
cName(i)=ReadString$(Stream) ;Name auslesen + speichern
Print "New Client "+cName(i) ;Neuen Client anzeigen
Stream=0
Exit
End If
Next
End If
;Alle Clients abarbeiten
For i=0 To 9
If Client(i)<>0 ;Client schon verbunden?
If ReadAvail(Client(i))<>0 ; Neue Daten vorhanden?
Print cName(i)+":"+ReadString(Client(i)) ;Nachricht ausgeben
End If
End If
Next

WaitTimer timer ;SIEHE CreateTimer Zeile 19
Wend
End
CloseTCPServer Server

BlitzBasic: [AUSKLAPPEN]
Print "Wie ist dein Name?"
Name$ = Input() ; Name abfragen
Stream = OpenTCPStream("127.0.0.1",8080) ; Verbindung zu Server herstellen
WriteString Stream,Name$ ;Einmal den Namen übermitteln

Local timer=CreateTimer(30)
While Not KeyHit(1)
If KeyHit(57) ; Wenn Leertaste gedrückt wird
WriteString Stream,Input("Text: ") ;Chatnachricht senden
FlushKeys
End If
WaitTimer timer
Wend
CloseTCPStream (Stream)


Wie gesagt, das Hauptproblem ist, dass AcceptTCPStream, ein Handle zurückliefert,
dass nur für einen(!) Client gilt. Um später was an ihn zu schicken/empfangen brauchst du dieses.
Möglichkeiten zum Speichern habe ich in den Kommentaren schon drin:
- Wenns nur ein Client gibt (globale) Variable
- Bei bestimmter Anzahl DIM Feld oder BlitzArray
- Sonst halt (eigentlich am Schlauesten) Types

Übrigens, den Code verstehen, bei Fragen nachfragen usw.
Nicht einfach kopieren... Wink
(Und in der Hilfe hats auch Beispiel zu CreateTCPServer)

mfg,
count-doku

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group