Entwickler-Ecke

Internet / Netzwerk - Brauche Schnelles Netzwerk


NemesisoD - Di 11.02.03 20:51
Titel: Brauche Schnelles Netzwerk
Hi Leute,

Ich habe folgendes Problem:

Ich schreibe ein Spiel das sowohl über Netzwerk als auch über Internet gespielt werden kann. Jeder Spieler kann mit der richtigen Software von überall am Spiel teilnehmen, und die Spielerzahl soll nicht begrenzt sein, aber wie kann ich jetzt mehreren Spielern gleichzeitig Ihre Daten schicken ohne das der Spielverlauf durch Zeitverzögerungen beeinträchtigt ist.
Kann man nicht z.B. unbegrenzt Server und Clienten wärend der Laufzeit erstellen, so das wenn sich ein Spieler anmeldet diesen direkt ein Server und Client erstellt wird!

Wäre dies möglich? Und wenn ja wie!


O'rallY - Di 11.02.03 21:01

Ich kann dir nicht sagen, wie es funktioniert, aber auf jedenfall ist die Idee mit den zur Laufzeit erzeugten Clients und Servern eine schlechte Idee. Die Performance währe im Keller und alle Resourcen währen aufgebraucht, also das Gegenteil von dem was du dir vorstellst.
Ich würde das ganze mit UDP machen. Die Clients schicken dem Server ihre Tabellen und der Server schickt diese wiederrum an alle Clients. UDP, da es sehr schnell ist. Und man kann bei einem Spiel auch mal ein verlorenes Packet verkraften.
Anders kan ich es mir nicht vorstellen, wie es effizent funktionieren sollte.


NemesisoD - Di 11.02.03 21:09

Aber wenn jetzt ca. 20 User auf den Server zugreifen, würde das dann nicht das Netzwerk überlasten? Weil der Server müsste alle 2-5min allen Spielern neue Daten senden!


BungeeBug - Di 11.02.03 21:50

na also wenns nur alle 2-5 minuten sind kannste das ganze auich per Post erledigen ... ne jetzt mal ernst ... 2-5 Minuten und 20 Clients is keine herausvorderung für kein Netzwerk ... da kannst du auch TCP/IP nehmen, da haste dann auch ne empfangskontrolle und was noch alles mehr ...

MfG BungeeBug


NemesisoD - Di 11.02.03 23:08

Das war nur ein beispiel, es sollen ja soviele wie es geht rein können, das können auch 200 werden oder noch mehr!!!
Kann mir den das einer sagen wie ich das dann programmieren muss,
weil bei mir hat der bei zwei Clienten schon zeitverzögerungen!
Erst bekomt der eine seine Dtaen und 20-30 sek später erst der andere, und wenn ich mir das bei noch mehr Rechnern vorstelle, dann bekommt der eine gerade mal seine Daten, da ist der andere schon ne Runde weiter!!!
Also, wenn mir einer sagen kann wie ich das am besten Programmieren kann, bitte meldet euch!!!
*verzweifel*


Ex0rzist - Mi 12.02.03 13:56

Bekommt jeder Client andere Daten?


NemesisoD - Mi 12.02.03 16:10

Jeder der Clienten soll die Allgemeinen Daten (wie z.B. welche runde ist gerade, hat sich ein neuer Spieler angemeldet usw.) bekommen und wenn ein Ereigniss Ihne direkt betrift soll er darüber auch informiert werden!!!


O'rallY - Mi 12.02.03 17:00

Wie schon gesagt: Benutze UDP. Die allgeimeinen Daten, also die Daten, die jeder Spieler erhält, würde ich mittels Broadcast verschicken. Die anderen musst du halt normal verschicken.


NemesisoD - Mi 12.02.03 18:32

Aber habe ich bei UDP nicht die gefahr das ich einige Pakets nicht erhalte?
Wäre TCP nicht besser?
Und warum funktioniert das im Internet auch?
Da gibt es auch Spiele wo sich mehrere tausend User anmelden und da haben die kein Problem mit den ganzen Netzwerk!!!


maximus - Mi 12.02.03 19:16

lol* die haben auch richtig dicke server, und davon hunderte.

Also. ich habs auch noch nicht gemacht, aber ich weiss, dass es meistens mit UDP gemacht wird, bzw. via DirectPlay (glaub ich ist auch UDP?). Kannst ja mal nach einer guten DirectPlay unit suchen.

Ich denke man sollte den nachriten prioritäten zuweisen, damit der server weiss welche er schnell verarbeiten muss (zB ein schuss ist wichtiger als ein chattext).

Und der server muss, glaube ich, thread basiert sein (also asyncron)!?

viel spass


O'rallY - Mi 12.02.03 20:20

Natürlich besteht die Möglichkeit, dass bei UDP Packete verloren gehen können. Dies erwähnte ich ja schon. Doch ist die wahrscheinlichkeit nicht allzugroß und wenn mal ein Packet nicht ankommt, muss es nicht direkt schlimme Konsequenzen haben. Es lagt halt n bissl. Kommt natürlich auf die Art des Spiels an.
Worum geht 's in dem Spiel überhaupt?


NemesisoD - Mi 12.02.03 22:02

Es soll ein Rundenbasierendes Weltraum spiel werden, wie z.B. Dark Galaxy oder Galaxy Wars!
Mit den Chattext hatte ich mir eh gedacht das der Client nur die IP des chatparners anfordert und dann sich direkt mit Ihm verbindet!
Oder so ähnlich!

Kann mir denn mal einer ein paar Infos geben wie ich mit UDP umgeh, weil ich hab noch nicht all zuviel mit Netzwerken am Hut gehabt!


maximus - Do 13.02.03 17:38

Zitat:
Mit den Chattext hatte ich mir eh gedacht das der Client nur die IP des chatparners anfordert und dann sich direkt mit Ihm verbindet!
Oder so ähnlich!

Das ist eigentlich unüblich, da der andere rechner somit seine anonymität einbüsst :wink: und du musst in dein spiel client einen 'server' einbauen, der die verbindung entgegen nimmt. Geht aber natürlich...doch was ist wenn man zB im team spielt und die message an alle soll. Da würd ich doch lieber über den server gehn, er sowieso schon die verteiler funktionen drinn hat.

mfg mx.


O'rallY - Do 13.02.03 19:59

Um UPD zu nutzen, würd' ich dir die Indy-Kompos vorschlagen ([url]http://www.indyproject.org[/url]). Das sind TIdUPDClient u. TIdUPDServer. Der Umgang ist recht einfach. Ein Beispiel:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
var
   RecText: string;
begin
   SetLength(RecText, AData.Size);
   AData.ReadBuffer(PChar(RecText)^, AData.Size);
   ShowMessage(ABinding.PeerIP + ' hat "' + RecText + '" gesendet.');
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
   IdUDPClient1.Active := true;
   IdUDPClient1.Send('Hello World!');
   IdUDPClient1.Broadcast('Ich bin ein Broadcast!', 1234); // hier muss auch der Port angegeben werden
   IdUDPClient1.Active := false;
end;


NemesisoD - Do 13.02.03 22:56

Ich danke euch schon mal allen,
Ihr habt nur sehr geholfen, und wenn ich noch ein paar Probleme haben sollte, dann kann ich mich ja an euch richten!!!


NemesisoD - Do 13.02.03 23:24

Eine Frage hab ich noch:

Wäre es vielleicht besser mehrere UDP Protokolle zu nutzen,
z.B. eins für die anmeldung läuft über Port 5000, ein zweites für Truppen bewegung über 5001 usw.!

Weil damit könnte ich doch beim Server das eine Protokoll stark entlasten, oder nicht?


maximus - Fr 14.02.03 11:41

Jo,

die idee ist garnicht so schlecht. Normalerweise macht man generell bei solchen spielen einen standart port für anmeldung und handelt dann dynamisch eine port-nummer aus! Hat halt den vorteil, dass wenn prots belegt sind, man einen anderen nehmen kann, weils es dann alles flexible ist.

mfgmx.


Sharky - Fr 14.02.03 13:40

Hai,

Ich habe da mal eine alles entscheidende Frage:

Von welcher Datenmenge reden wir? Wenn jeder Client immer nur 10 - 50 Byte sendet und empfängt ist es ja auch bei 200 Clients nicht viel.
Wenn aber jeder Client 10 kByte sendet bekommst Du natürlich probleme!


NemesisoD - Fr 14.02.03 14:13

Also,
ich sende immer nur Texte wobei die texte immer einen anfangs Code haben, dieser sagt den Clienten was er mit den folgenden Daten machen muss, und einen End Code der sagt ihn, das er auf neue Daten warten soll, aber die Texte sind nucht lang! Aber um was für eine Daten menge es sich jetzt handelt weiß ich nicht, dürfte aber nicht groß sein!


NemesisoD - Sa 15.02.03 00:07

Der Quellcode den ihr mir für UDP gegeben habt, der funktioniert nicht wirklich, es wird immer gesagt das TIdSocketHandle ein Unidetifizierter Bezeichner ist!

Was muss ich jetzt tun?


Shadowdragon - Sa 15.02.03 12:01

Hmm....die Idee ist interessant, und ich glaube auch bei 10 kb sollte der Server das noch verkraften...

wenn nicht, binde doch grade einen zweiten ein, oder gib einigen Clients die Möglichkeit, als zusätzlicher Server zu fungieren (im Hintergrund quasi).
Dann werden die Datenmengen auch nich zum Problem.


BungeeBug - Sa 15.02.03 13:40

das klappt aber nur solange wie die Clienten keine Firewall oder Gateway benutzen ... sobalt ein von beidem da is is hängen im Schacht mit "Server im Hintergrund", ausserdem weisst du nicht ob du nicht leichtsinnigerweise dir I-Net Verbindung des Users damit plättest also überdenk das ganze noch mal .. ich würd dann ehr ne StandAlone Server Version vorschlagen die mit den andern Server als Cluster zusammen arbeitet :)

MfG BungeeBug


O'rallY - So 16.02.03 19:05

NemesisoD hat folgendes geschrieben:
Der Quellcode den ihr mir für UDP gegeben habt, der funktioniert nicht wirklich, es wird immer gesagt das TIdSocketHandle ein Unidetifizierter Bezeichner ist!


Das stimmt nicht so ganz. Am Quelltext liegts nicht, aber komischerweise wird die Unit IdSocketHandle nicht eingebunden. Diese musst du noch bei der uses-Klausel anfügen.


NemesisoD - So 16.02.03 22:18

Ok, jetzt funktioniert es!!

Ich bedanke mich bei euch allen!