![]() |
AW: Server/Client kleine Pakete sehr oft an mehrere Clienten
Hi,
danke erstmal für die vielen Antworten. Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
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 |
AW: Server/Client kleine Pakete sehr oft an mehrere Clienten
Zitat:
|
AW: Server/Client kleine Pakete sehr oft an mehrere Clienten
Zitat:
Jedoch ist bei Indy problemlos möglich, auf den Socket aus einem Thread zu lesen, und auf denselben Socket aus einem anderen Thread heraus zu schreiben. Eine Socketconnection, zwei Threads (einer liest Daten, einer sendet Daten). Beispiel: TIdTelnet, über die Telnet-Serververbindung sendet der Client Daten auf den Socket, während der Client in einem separaten Thread Nachrichten vom Server empfängt. Ein Socket, eine in TIdTelnet enthaltene TIdTCPConnection-Instanz, zwei Threads. Das ist threadsafe. |
AW: Server/Client kleine Pakete sehr oft an mehrere Clienten
Zitat:
|
AW: Server/Client kleine Pakete sehr oft an mehrere Clienten
Okay. Ich versuch mal zu sortieren :)
Zitat:
Zitat:
Bei TCP gibt es auch den Vorteil, dass alle Pakete garantiert in der selben Reihenfolge auf der Anwendungsebene des Empfängers (d.h. bei dir am Socket) eintreffen, wie sie beim Sender losgeschickt wurden. Ich unterstelle dir einfach mal diese Intension. Ich glaube, ich würde zu TCP in diesem Fall tendieren; aus dem Grund, da du ja geschrieben hattest, dass kontinuierlich Daten für die Übertragung anfallen. Damit das dann aber auch funktioniert, würde ich versuchen "langlebige TCP-Verbindungen" zu benutzen (das heißt, dass du nicht jedes Mal wegen einer Nachricht dich zum Server connectest, sondern das selbe Socket so lange wie möglich versuchst zu verwenden...). Hintergrund: TCP fängt erst langsam an die Übertragungsrate hochzudrehen. Das heißt aber auch, dass die Verbindung kontinuierlich verwendet werden sollte (in vielen Protokollen das so genannte keep-alive oder heartbeat). Da bei dir scheinbar immer Daten anfallen, scheint das also die Beste Wahl dafür zu sein. Allgemein sollte man bei Netzwerk (noch mehr als bei normaler FileIO) immer damit rechnen, dass was schiefgehen kann (Verbindung ist kaputt gegangen; Puffer der Betriebssytems ist voll; ...) und man da "graceful recovered" (Neue Verbindung aufbaut/erwartet; Auf das Betriebssytem und die Hardware wartet; ...). Warum ich in meiner initialen Liste gefragt hatte, ab wann ein Client zu der Menge der zu informierenden Nachrichtenempfänger gehören soll: Was machst du, wenn ein Client grade "nur kurz" keine Verbindung hat? Das Problem: Du weißt wenn eine Verbindung zusammenbricht nicht, ob das System nur kurz weg ist und gleich wieder eine neue Verbindung aufbauen wird, die die alte Verbindung ersetzt (das Programm aber weitergelaufen ist; also insbesondere der Programmzustand auf dem Zielsystem noch intakt ist!) oder ob das Programm grade (z.B. durch einen fatalen Fehler) sterben gegangen ist. Was passiert also mit den Nachrichten derjenigen Clients, die seit dem Verbindungsabbruch Nachrichten zum Server gesendet hatten? Hälst du die vor? Wenn ja, wie lange? Zitat:
Beispiel: Clients A, B und C sind zu Server S verbunden. A und B senden Nachrichten, die zeitgleich bei S eintreffen. Beim Verteilen an A sendet S die Nachricht von B und zu B die Nachricht von A. Interessant ist dann aber C. C bekommt beide Nachrichten von A und B direkt in einem Paket. Zitat:
Zitat:
Wenn du nur unter Windows bist und keine Angst hast direkt die Windows API zu verwenden, kann ich dir auch ![]() Zitat:
![]() Zitat:
Hoffe ich konnte mehr helfen, als verwirren :oops: Brighty |
AW: Server/Client kleine Pakete sehr oft an mehrere Clienten
Zitat:
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:13 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