AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Server/Client kleine Pakete sehr oft an mehrere Clienten
Thema durchsuchen
Ansicht
Themen-Optionen

Server/Client kleine Pakete sehr oft an mehrere Clienten

Ein Thema von sonny2007 · begonnen am 4. Jan 2017 · letzter Beitrag vom 6. Jan 2017
Antwort Antwort
mjustin

Registriert seit: 14. Apr 2008
3.010 Beiträge
 
Delphi 2009 Professional
 
#1

AW: Server/Client kleine Pakete sehr oft an mehrere Clienten

  Alt 5. Jan 2017, 12:45
nicht mit Indy, weil Indy nicht threadsafe ist
Welche Delphi Version - eins?
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Server/Client kleine Pakete sehr oft an mehrere Clienten

  Alt 5. Jan 2017, 13:11
Ich verwende für den Datentransfer über das Netzwerk die Komponenten von ESEGECE. Sehr einfach zu bedienen, für das private Umfeld kostenlos und selbst der Source nicht besonders teuer. Threadsafe, auf den Indys aufbauend, ich bastel mir damit gerade meine eigenen Server und Client-Komponenten. Vielleicht willst du dir das mal ansehen... das waren die einzigen Komponenten, welche es mir EINFACH erlaubten mit dem Netzwerktransfer zurechtzukommen.
Michael Kübler
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.157 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Server/Client kleine Pakete sehr oft an mehrere Clienten

  Alt 5. Jan 2017, 14:12
Richtig gut im threading sind die ICS
Damit kann man ganz schnell einen Client / Server Lösung bauen.
  Mit Zitat antworten Zitat
sonny2007

Registriert seit: 27. Aug 2009
39 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Server/Client kleine Pakete sehr oft an mehrere Clienten

  Alt 5. Jan 2017, 14:49
Hi,

danke erstmal für die vielen Antworten.

[*]Ist es wichtig, dass die Nachrichten von allen Clients zeitnah ankommen (Puffern vs direkt senden)
Brighty
- Ja ist es. wie bei einem online Spiel. Du verursachst einen Wert bspw. Schaden, Heal, bewegst dich etc ...

[*]Ist es wichtig, dass die Nachrichten überhaupt ankommen (einfaches Notify vs wichtiger Datentransport)
Brighty
-Ja wieso nicht

[*]Werden einzelne Clients untereinander identifiziert? Dürfen Nachrichten verschiedener Clients vom Server zusammengefasst werden? (so wie ich das verstanden habe, soll dass ja ein All-to-all Informationsfluss werden, oder?)
Brighty
- Also Client sendet bspw. den Schadenswert an Server und alle anderen Clienten erhalten diesen Wert sofort um Rückschlüsse zu ziehen, wieviel Schaden jeder einzelne Spieler macht. Wenn da ein Zeitversatz durch Puffern von 2sec gäbe währe das nicht so toll.

[*]Wo befindet sich das Setup? Lokales geschütztes Netz vs großes, böses Internet?
Brighty
- ES soll über das große böse Internet laufen


[*]Falls großes böses Internet: Wie sensibel sind die Daten? Sollte man die vielleicht noch TLS tunneln...
Brighty
- völlig irrelevant. Da nur Schadenswerte übertragen werden


Aktuell hat jeder Client einen ListenerThread laufen der die Message empfängt und diese verarbeitet.
Der Server empfängt die der Daten und sendet sie sofort wieder an alle Clienten.

Doch das wird bei 10 User schon sehr fehleranfällig. Vermutlich weil ich es auch nicht richtig umgesetzt habe.
Daher ja meine Frage, welcher Lösungsansatz bietet sich hier an.

Client 1 --- verursacht 1000 Schaden
Client 2 --- verursacht 500 Schaden

jetzt bekommt der Server in 2 Datenpakete die er in 2 seperaten Threads verwaltet.
ist puffern in dem Fall sinnvoll ?
Oder einfach in dem gleichen Thread wieder an alle Clienten senden?

was passiert wenn am client 1 Paket eintrifft und er gerade ein vorheriges verarbeitet ?

Benutzt wird übrigens Delphi 10.1 (Studentenpreis sei dank

Grüße
sOn

Geändert von sonny2007 ( 5. Jan 2017 um 14:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.157 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Server/Client kleine Pakete sehr oft an mehrere Clienten

  Alt 6. Jan 2017, 01:31
Doch das wird bei 10 User schon sehr fehleranfällig. Vermutlich weil ich es auch nicht richtig umgesetzt habe.
Daher ja meine Frage, welcher Lösungsansatz bietet sich hier an.

Client 1 --- verursacht 1000 Schaden
Client 2 --- verursacht 500 Schaden

jetzt bekommt der Server in 2 Datenpakete die er in 2 seperaten Threads verwaltet.
ist puffern in dem Fall sinnvoll ?
Oder einfach in dem gleichen Thread wieder an alle Clienten senden?
Du must eine TimeSlice einführen. Ping Laufzeiten im Internet nicht vergessen...

Wenn 100 Spieler im Game sind... Sehen sich alle Spieler? Oder sind vielleicht 50 Spieler in einem anderen Raum.

Also kann der Server schon mal vor sortieren.

Wenn von 10 Spielern Schaden auf Spieler A gemacht wird dann reicht hierfür eine zusammengefasste Übertragung.
Wenn ich richtig liege dauert die Übertragung von 20 Byte genau so lange wie die von 1400 Byte... (Nie getestet aber so müsste es sein). Als bei angestrebten 60/FPS hast Du sagen wir mal 16 MS pro Frame zur Berechnung Du wirst aber nicht 60x pro Sekunde, Schaden berechne wollen/können aber vielleicht wie geschrieben 5x bei 1000ms hast Du also deine angegebenen 200ms Zeit um für Client A von N-Clients den schaden zu sammeln und falls nötig alle 200ms einmal ein Datenframe übertragen. Da die Übertragung im lokalen netz < 1ms für ein Paket ist - kein Thema. Bei einem Ping von 200 wird es schon knapp.

Waiting threads brauchen "keine" CPU. Also kannst Du dir einen "Haufen" worker Threads bauen. die alle nix machen außer bei einem TimeOut ein Heardbeat senden. Sonst warten die nur auf einen Pointer und einen SetEvent. So ein Thread starten in wenigen nano-Sekunden. (Oder waren es sogar nur Pico-Sekunden) Egal... SOFORT.

Jetzt noch die TimeSlices asynchron bauen...

Beispiel:

Bei MS startet:
0 Client A (Ping 20);
20 Client B (Ping 50);
70 Client C (Ping 100);
170 Client D
usw.

ggf. Kann durch geschicktes Rechnen die Zeiten noch am Ping besser angepasst werden.

Von diesen Steuer-Threads kannst Du natürlich mehr als einen haben. Und ggf. noch einen kleinen Random Wert drauflegen. Wenn bei einem MS-Counter von 1ms der Counter bei 70 an kommt, werden die Schadenswerte an Client C übertragen und er wird wieder vorgemerkt für Counter 270.

Usw..

Mavarik
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Server/Client kleine Pakete sehr oft an mehrere Clienten

  Alt 5. Jan 2017, 15:45
nicht mit Indy, weil Indy nicht threadsafe ist
Welche Delphi Version - eins?
Moment. Indy verwendet zwar Threads, das heißt aber nicht automatisch, dass die Komponenten selbst threadsafe sind. Es ist bei Indy meines Wissens nicht möglich, eine Komponente aus mehreren Threads heraus gleichzeitig zu verwenden. Also z.B. gleichzeitig in Thread A ein Receive auszuführen und in Thread B ein Send – auf dem gleichen Socket.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz