TCP - Daten übertragen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Dirk Knoop

Betreff: TCP - Daten übertragen

BeitragSa, Dez 04, 2010 10:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich möchte sehr viele Daten über das Internet für ein Online-Spiel übertragen, die alle ankommen müssen.

Wie folgt habe ich es programmiert. Ich kann es zur Zeit leider nur über ein lokales Netzwerk austesten.
Sehr ihr hier Probleme ?
Später kommen noch viel mehr Daten dazu.

Welchen Port nimmt man idealerweise ?

Code: [AUSKLAPPEN]

;HOST

Graphics 1024,768
AppTitle "Host"


;deutsche Vereine
Dim Mannschaft_Name$(8,18)
Dim Mannschaft_Stadiongroesse(8,18)
Dim Mannschaft_Wappen_Nummer(8,18)

;Vereine einlesen
datei$="Daten/vereine.txt"
file=ReadFile(datei$)   
zaehler=0

For a=1 To 8
       leer$=ReadLine(file)
       For b=1 To 18
               zaehler=zaehler+1
               
               Mannschaft_Name$(a,b)=ReadLine(file)
               Mannschaft_Stadiongroesse(a,b)=ReadLine(file)
               If Mannschaft_Stadiongroesse(a,b)>100000 Then Mannschaft_Stadiongroesse(a,b)=100000
               
               Mannschaft_Wappen_Nummer(a,b)=zaehler
       Next
Next
CloseFile file

;Spieler
Dim Spieler_Name$(8,18,25)
Dim Spieler_Vorname$(8,18,25)
Dim Spieler_Position$(8,18,25)
Dim Spieler_Alter(8,18,25)
Dim Spieler_Staerke#(8,18,25)
Dim Spieler_Nation(8,18,25)

;Spieler einlesen
For a=1 To 8
       For b=1 To 18
               datei$="Daten/Spieler/spieler"+str$(a)+"_"+str$(b)+".txt"
               file=ReadFile(datei$)   
               zaehler=0
               
               For c=1 To 20
                      Spieler_Name$(a,b,c)=ReadLine(file)
                      Spieler_Vorname$(a,b,c)=ReadLine(file)
                      Spieler_Position$(a,b,c)=ReadLine(file)
                      Spieler_Alter(a,b,c)=ReadLine(file)
                      Spieler_Staerke#(a,b,c)=ReadLine(file)
                      Spieler_Nation(a,b,c)=ReadLine(file)
               Next
               CloseFile file
       Next
Next

;Netzwerkspiel starten
Global Stream = CreateTCPServer( 8080 )
Global ClientStream

;Warten, bis Client sich anmeldet
While NewClient=0
       NewClient = AcceptTCPStream( Stream )
       ClientStream = NewClient
Wend

;Sende dem Klient, daß Anmeldung ankam
sende_Daten$("anmeldung kam an")

;Taste drücken
Print "Taste drücken"
WaitKey

;Sende dem Klient alle Vereinsdaten
For a=1 To 8
       For b=1 To 18
               sende_Daten$(Mannschaft_Name$(a,b))
               sende_Daten$(Mannschaft_Stadiongroesse(a,b))
               sende_Daten$(Mannschaft_Wappen_Nummer(a,b))
       Next
Next



;sende dem Klient alle Spielerdaten zu
For a=1 To 8
       For b=1 To 18
               For c=1 To 20
                      sende_Daten$(Spieler_Name$(a,b,c))
                      sende_Daten$(Spieler_Vorname$(a,b,c))
                      sende_Daten$(Spieler_Position$(a,b,c))
                      sende_Daten$(Spieler_Alter(a,b,c))
                      sende_Daten$(Spieler_Staerke#(a,b,c))
                      sende_Daten$(Spieler_Nation(a,b,c))
               Next
       Next
Next

;sende Daten
Function sende_Daten$(var$)
       WriteLine ClientStream, var$
End Function

;empfange Daten
Function empfange_Daten$()
       neuenachricht$=""
      
       geschafft_empfang=0
       While geschafft_empfang=0
      
               If ClientStream
                      ;While ReadAvail( ClientStream )
                              neuenachricht$=ReadLine( ClientStream )
                              geschafft_empfang=1   
                      ;Wend
               EndIf
               
       Wend
      
       Return neuenachricht$
End Function



Code: [AUSKLAPPEN]

;Join

Graphics 1024,768
AppTitle "Join"


;deutsche Vereine
Dim Mannschaft_Name$(8,18)
Dim Mannschaft_Stadiongroesse(8,18)
Dim Mannschaft_Wappen_Nummer(8,18)


;Spieler
Dim Spieler_Name$(8,18,25)
Dim Spieler_Vorname$(8,18,25)
Dim Spieler_Position$(8,18,25)
Dim Spieler_Alter(8,18,25)
Dim Spieler_Staerke#(8,18,25)
Dim Spieler_Nation(8,18,25)


;Netzwerkspiel starten
Global Stream = OpenTCPStream( "169.254.77.178",8080 )

If Stream=0 Then Print "Fehler:" : End

;warten auf OK vom Host
geschafft=0
While geschafft=0
       ;Daten empfangen
       nachricht$ = empfange_Daten$()
       If nachricht$="anmeldung kam an" Then geschafft=1
Wend

;Taste drücken
Print "Taste drücken"
WaitKey

;empfange alle Vereinsdaten
For a=1 To 8
       For b=1 To 18
               Mannschaft_Name$(a,b)=empfange_Daten$()
               Mannschaft_Stadiongroesse(a,b)=empfange_Daten$()
               Mannschaft_Wappen_Nummer(a,b)=empfange_Daten$()
               
               Print Mannschaft_Wappen_Nummer(a,b)+".  "+Mannschaft_Name$(a,b)+"   "+Mannschaft_Stadiongroesse(a,b)
       Next
       Delay 1000
Next

;empfange alle Spielerdaten
For a=1 To 8
       For b=1 To 18
               For c=1 To 20
                      Spieler_Name$(a,b,c)=empfange_Daten$()
                      Spieler_Vorname$(a,b,c)=empfange_Daten$()
                      Spieler_Position$(a,b,c)=empfange_Daten$()
                      Spieler_Alter(a,b,c)=empfange_Daten$()
                      Spieler_Staerke#(a,b,c)=empfange_Daten$()
                      Spieler_Nation(a,b,c)=empfange_Daten$()
                     
                      Print Spieler_Position(a,b,c)+".  "+Spieler_Vorname$(a,b)+"   "+Spieler_Name$(a,b)+"     "+Spieler_Alter(a,b)+"    "+Spieler_Nation(a,b)+"   "+Spieler_Staerke#
               Next
               Delay 1000
       Next
Next
End





;sende Daten
Function sende_Daten$(var$)
       WriteLine Stream, var$
End Function

;empfange Daten
Function empfange_Daten$()
       neuenachricht$=""
      
       geschafft_empfang=0
       While geschafft_empfang=0
               
               If Stream
                      ;While ReadAvail( Stream )
                              neuenachricht$=ReadLine( Stream )   ; ReadLine liest den übertragenen Text aus
                              geschafft_empfang=1   
                      ;Wend
               EndIf
               
       Wend
      
       Return neuenachricht$
End Function
www.kostenloser-fussballmanager.de
www.discaim.de - weil Spaß kein Zufall ist
www.torchance.de - ein etwas anderer Fußball-Manager
  • Zuletzt bearbeitet von Dirk Knoop am Sa, Dez 04, 2010 10:58, insgesamt einmal bearbeitet
 

Dirk Knoop

BeitragSa, Dez 04, 2010 10:58
Antworten mit Zitat
Benutzer-Profile anzeigen
auf Wunsch kann ich auch das Datenpaket per email zusenden
www.kostenloser-fussballmanager.de
www.discaim.de - weil Spaß kein Zufall ist
www.torchance.de - ein etwas anderer Fußball-Manager

ToeB

BeitragSa, Dez 04, 2010 13:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich versteh dein Problem nicht so ganz.

Warum brauchst du so viele daten ?


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!
 

Dirk Knoop

BeitragSa, Dez 04, 2010 14:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Das wird ein neuer Fussball-Manager, den man gegeneinander über das Internet spielen kann.

Bei dem Erstellen eines neuen Spiels muss der Host die Daten einmalig an den Join senden.

Da jeder seine lokalen Daten editieren kann, soll so sichergestellt werden, dass beide Spieler mit den selben Daten spielen.

Bei einigen Tests bei mir kommen nicht immer alle Daten an.
Eigentlich soll TCP doch sicherstellen, dass alles ankommt, oder ?

Code: [AUSKLAPPEN]

If Stream
                      ;While ReadAvail( Stream )
                              neuenachricht$=ReadLine( Stream ) 
                               geschafft_empfang=1   
                      ;Wend
               EndIf



Muss das "If Stream" dort so stehen ?
Ist dieser Teil richtig, oder muss das Semikolon vor dem While weg oder muss dort eine IF-Abfrage stehen ?
Dirk Knoop
www.kostenloser-fussballmanager.de
www.discaim.de - weil Spaß kein Zufall ist
www.torchance.de - ein etwas anderer Fußball-Manager

Eingeproggt

BeitragSa, Dez 04, 2010 15:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Das "if stream" stellt nur sicher dass dein Stream-Handle nicht 0 ist... das ist socher nicht blöd, aber ob es nötig is kann ich jetzt nicht sagen. Sollte genügen wenn es einmal vor dem empfangen abgefragt wird, nicht laufend.
Aber wie dem auch sei ich finde deine Datenmengen etwas extrem...

Code: [AUSKLAPPEN]
Dim Spieler_Name$(8,18,25)
Dim Spieler_Vorname$(8,18,25)
Dim Spieler_Position$(8,18,25)
Dim Spieler_Alter(8,18,25)
Dim Spieler_Staerke#(8,18,25)
Dim Spieler_Nation(8,18,25)

Dim Mannschaft_Name$(8,18)
Dim Mannschaft_Stadiongroesse(8,18)
Dim Mannschaft_Wappen_Nummer(8,18)


das allein sind schon
8*18*25=720, mal 6 (6 solcher Arrays) ist 4320
plus 8*18=144, mal 3 ist 432, unterm Strich 4752 Integers, also mal 4 sind 19008 bytes.

--> 19kb allein für eventuell sogar leere Daten. Das sich das ganze extrem aufmutlipliziert wenn die Strings nicht leer sind sondern jeder auch noch nur 3 Zeichen zum Beispiel enthält... pfumm... ich glaub es wär bald besser du nimmst dir die "BlitzZipAPI" oder wie sie heißt und komprimierst deine Dateien mal. Und das Archiv versendest du.

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

ToeB

BeitragSa, Dez 04, 2010 15:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Am besten du speicherst das in eine Datei und versendest dann nur die Datei... So ist es am sinnvollsten !

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!
 

Dirk Knoop

BeitragSa, Dez 04, 2010 16:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist eine gute Idee.
Macht es Sinn, diese zu zippen ?

Wie sendet man denn eine Datei mittels TCP ?
www.kostenloser-fussballmanager.de
www.discaim.de - weil Spaß kein Zufall ist
www.torchance.de - ein etwas anderer Fußball-Manager

ToeB

BeitragSa, Dez 04, 2010 16:24
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Nein, das macht keinen sinn.

2. Entweder Byte für Byte (dauert aber LAAANGE), oder du guckst dir mal meine "SimpleUDP2" an (Signatur), da kannst du Nachrichten senden die genau wie bei TCP zu 100% ankommen, es trotzdem nicht das Programm aufhält und du zusätzlich z.B. Banks versenden kannst ( damit kannst du Byte-Blöcke der Datei versenden, z.B. immer 5000Byte, und die dann am ende richtig zusammensetzen tust). Würde ich dir empfehlen, da sachen wie verwaltu8ng des Hostes usw. Direkt mit drin ist !

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!
 

Dirk Knoop

BeitragSa, Dez 04, 2010 16:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für diesen Tipp. Ich schaue mir das heute Abend einmal in Ruhe an.
www.kostenloser-fussballmanager.de
www.discaim.de - weil Spaß kein Zufall ist
www.torchance.de - ein etwas anderer Fußball-Manager

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group