Guten Tag.
Ich bin zur Zeit dabei ein Spiel das über LAN spielbar sein soll zu programmieren. Dazu muss übers Netzwerk ein Objekt, das den aktuellen Spielstand charakterisiert übers Netz verschickt werden. Diese Klasse habe ich schon erstellt. Ich habe jedoch Probleme was die Client-Server Architektur angeht. Ich habe bisher eine methode set geschrieben, die das Objekt vom Client auf den Server überträgt. Auf dem Server wird diese Objekt mit einer globalen Variable referenziert. Auf dem Client gibt es ausserdem eine Methode get, die dieses Objekt vom Server zum Client sendet. Ich habe für das ganze Socket benutzt. Um sicherzustellen, dass jedesmal nur einer auf den Stream schreibt, habe ich eine variable Busy genommen, die anzeigt ob gelesen oder geschrieben werden kann.
Auf dem Server habe ich also, für jeden Client einen Thread. Auf dem Client, habe ich ein Thread das alle drei Sekunden die get Funktion aufruft. Dafür habe ich eine while(true) in Verbindung mit sleep benutzt.
Um nun die set funktion zu benutzen wird dann die boolean variable Busy auf true gesetzt. In der while Schleife des Threads wird getestet Busy getestet, falls dies true ist, so wird nicht gelesen. Das gleiche gilt auch fürs Schreiben.
Nun auf den ersten Blick funktioniert dies auch. Allerdings treten dabei ein paar Probleme auf:
- dies bedeutet einen ünnötigen Trafik auf dem Netzwerk, da alle drei Sekunden der Client eine Anfrage macht, und der Server darauf antwortet
- kann durch diese drei Sekunden Intervalle, das spiel nicht richtig synchronisiert werden, d.h. verschiedene Clients,bekommen den aktuellen Spielstand erst viel später als andere.
Die optimale Architekur wäre, wenn ein Client jedesmal wenn er gespielt hat, die set Methode benutzt. Der Server referenziert wieder das Objekt, sendet es aber dann sofort an alle Clients, ohne dass die einen Anfrage gemacht habe. Allerdings habe ich da ein paar Probleme, was das Schreiben und Lesen auf dem Stream betreffen. Kann mir jemand erklären, wie ich da verhindern kann das ein Client gleichzeitig auf dem Stream schreibt und liest? Das gleiche Problem befindet sich ja auch auf dem Server. Das grösste Problem was ich habe ist, dass die Spieler nicht nach ein ander spielen müssen. Dies bedeutet, dass es möglich ist, dass der Server während der das Objekt an alle Clients sendet, ein Client versuchen wird ein neues Objekt zum Server zu senden.
Ich habe ein wenig mit google gesucht, und da die Methode available() gefunden. Kann man damit herausfinden, ob bereits auf dem Stream gelesen oder geschrieben wird?
Ich hoffe Ihr könnt mich in dieser Sache beraten.
Vielen Dank im Voraus.
MfG
Ich bin zur Zeit dabei ein Spiel das über LAN spielbar sein soll zu programmieren. Dazu muss übers Netzwerk ein Objekt, das den aktuellen Spielstand charakterisiert übers Netz verschickt werden. Diese Klasse habe ich schon erstellt. Ich habe jedoch Probleme was die Client-Server Architektur angeht. Ich habe bisher eine methode set geschrieben, die das Objekt vom Client auf den Server überträgt. Auf dem Server wird diese Objekt mit einer globalen Variable referenziert. Auf dem Client gibt es ausserdem eine Methode get, die dieses Objekt vom Server zum Client sendet. Ich habe für das ganze Socket benutzt. Um sicherzustellen, dass jedesmal nur einer auf den Stream schreibt, habe ich eine variable Busy genommen, die anzeigt ob gelesen oder geschrieben werden kann.
Auf dem Server habe ich also, für jeden Client einen Thread. Auf dem Client, habe ich ein Thread das alle drei Sekunden die get Funktion aufruft. Dafür habe ich eine while(true) in Verbindung mit sleep benutzt.
Um nun die set funktion zu benutzen wird dann die boolean variable Busy auf true gesetzt. In der while Schleife des Threads wird getestet Busy getestet, falls dies true ist, so wird nicht gelesen. Das gleiche gilt auch fürs Schreiben.
Nun auf den ersten Blick funktioniert dies auch. Allerdings treten dabei ein paar Probleme auf:
- dies bedeutet einen ünnötigen Trafik auf dem Netzwerk, da alle drei Sekunden der Client eine Anfrage macht, und der Server darauf antwortet
- kann durch diese drei Sekunden Intervalle, das spiel nicht richtig synchronisiert werden, d.h. verschiedene Clients,bekommen den aktuellen Spielstand erst viel später als andere.
Die optimale Architekur wäre, wenn ein Client jedesmal wenn er gespielt hat, die set Methode benutzt. Der Server referenziert wieder das Objekt, sendet es aber dann sofort an alle Clients, ohne dass die einen Anfrage gemacht habe. Allerdings habe ich da ein paar Probleme, was das Schreiben und Lesen auf dem Stream betreffen. Kann mir jemand erklären, wie ich da verhindern kann das ein Client gleichzeitig auf dem Stream schreibt und liest? Das gleiche Problem befindet sich ja auch auf dem Server. Das grösste Problem was ich habe ist, dass die Spieler nicht nach ein ander spielen müssen. Dies bedeutet, dass es möglich ist, dass der Server während der das Objekt an alle Clients sendet, ein Client versuchen wird ein neues Objekt zum Server zu senden.
Ich habe ein wenig mit google gesucht, und da die Methode available() gefunden. Kann man damit herausfinden, ob bereits auf dem Stream gelesen oder geschrieben wird?
Ich hoffe Ihr könnt mich in dieser Sache beraten.
Vielen Dank im Voraus.
MfG