Synchronisieren von Objekten über Client/Server - bester Weg?

Kjubert

Aktives Mitglied
Hallo zusammen,

in Netzwerkprogrammierung bin ich bis auf kleinere Versuche noch Grünschnabel, habe aber Böcke (und Anlass) mir da jetzt mal einige Sachen anzusehen.
Es geht konkret um eine Idee zu einer speziellen Form von Multiplayer-Spiel, von der ich relativ begeistert bin - ich habe diesen Ansatz erst einmal bei einem Spiel gesehen und fand ihn ziemlich cool - ich erklärs mal kurz und hoffe dann auf hilfreiche konzeptuelle Ideen:

Das Spiel setzt voraus, dass die Spielenden die Spielregeln selbst beherrschen und implementiert daher keinerlei Regelmechanik, sondern wirklich ausschließlich die Spielmaterialien (z.B. Tisch, Karten, Spielsteine, etc.). Die beteiligten Spieler können einfach als ob sie zusammen am Tisch sitzen mit den Materialien, die zum Spiel gehören, spielen.
Und jetzt kommts - ich hab da à la Kochsendung nämlich schonmal was vorbereitet:
Zwei Dinge schweben mir vor - einmal eine Scrabble-Implementation, die einfach die Spielfläche und die Steine sowie eine verdeckte Ablage für die "Hand"-Steine der einzelnen Spieler bereitstellt. Das Spiel lässt die Spieler einfach Plättchen legen wie sie wollen - denn die Regeln können die ja. Ich finde diesen Ansatz zeimlich cool - natürlich ist das nicht bei jedem Spielkonzept die passende Lösung, hier schon. Guckt mal hier:

xs6xn39l.jpg



Das zweite wären klassische Kartenspiele: Ich habe eine hübsche Spielfläche und die Möglichkeit einfach Karten-Stapel auf den Tisch zu legen, die verschoben werden können und von denen man Karten aufdecken und ziehen kann, die man dann auf der Spielfläche hin und herschieben kann wie man will. Die Spieler überlegen sich dann selbst, welches Spiel sie daimt spielen. Ein virtueller Kartentisch sozusagen. Natürlich mit Chatfunktion fürs Streiten und Meckern ;)
Hier mal ein Screen:

x6xq87ef.jpg



...nun zu meinem Problem: Ich habe die Netzwerkkommunikation noch nicht gemacht, will erstmal nach dem besten Ansatz forschen. Meine Ideen sind bisher ganz grob folgende:
Die Objekte, die auf dem Tisch liegen, könnte man serialisiert an alle Clients broadcasten. Bei dem Scrabble-Beispiel sind da KEINE Grafiken drin, wär also wohl OK. Bei den Karten müsste man mal sehn.
Ist Serialisierung überhaupt der richtige Weg? Die Datenmengen werden ja wohl nicht groß sein.
Könnte man bei Objekten mit Bildern die Bilder bei der Serialisierung weglassen? Es wär ja blöde die mitzusenden.
Wär es möglich eine Art Echtzeitdarstellung zu bekommen? z.B. wenigstens in einem Intervall von 1 Sekunde eine Aktualisierung der Darstellung abhängig von dem Client, der gerade "am Zug" ist?
Wie kann ich der Client-Anwendung am schönsten mitteilen, dass irgendwelche Komponenten verändert wurden, ohne eine Referenz auf diese "Client-Parent-Anwendung" in meinen Spiel-Objekten zu haben? Er serialisiert mir ja sonst immer den ganzen Client mit...

Naja das ist etwas wirr, aber hoffentlich wird irgendwie klar, worauf ich hinaus will. Sorry für die vielen Wörter - aber hey - es sind auch 2 Bilder dabei, also nicht über trockene Lektüre beschweren ;)
 

Bernd Hohmann

Top Contributor
Das Konzept hängt jetzt bisserl davon ab, ob sich die Clients selber untereinander vernetzen sollen oder ob das nicht doch besser über einen zentralen Spieleserver gehen soll (im Ernstfall kann ja der Spieleröffner den Server spielen).

Aber grundsätzlich würde ich nicht über Serialisierung sondern platt über DataInput/OutputStream gehen (also eigenes Protokoll).

Wenn Du viele Events verschickst (also zb. zeigen willst, wie ein Spieler seinen Stein/Karte auf dem Brett bewegt) musst Du auf jeden Fall noch ein Event einbauen für die entgültige Ablage der Karte um zu viele Move-Events vorher ggf. wegwerfen zu können.

Ich würde für mich eher die Probleme in der GUI als in der Netzwerkkommunikation sehen - was daran liegen mag, dass ich wenig GUI aber viel Netzwerk mache.

Bernd
 

Kjubert

Aktives Mitglied
Das Konzept hängt jetzt bisserl davon ab, ob sich die Clients selber untereinander vernetzen sollen oder ob das nicht doch besser über einen zentralen Spieleserver gehen soll (im Ernstfall kann ja der Spieleröffner den Server spielen).

So hab ichs mir auch vorgestellt, ja.

Aber grundsätzlich würde ich nicht über Serialisierung sondern platt über DataInput/OutputStream gehen (also eigenes Protokoll).

Hm. Im Prinzip sind die Objekte alle recht leicht formalisierbar, könnte man also machen. Aber dennoch ist Serialisierung ja erstmal abstrakter, müsste mir da erstmal weniger kopp drum machen. Spricht denn generell was dagegen?
 

Bernd Hohmann

Top Contributor
Hm. Im Prinzip sind die Objekte alle recht leicht formalisierbar, könnte man also machen. Aber dennoch ist Serialisierung ja erstmal abstrakter, müsste mir da erstmal weniger kopp drum machen. Spricht denn generell was dagegen?

Eigentlich nur 2 Probleme - die tauchen leider erst dann auf, wenn man es nicht mehr gebrauchen kann.

1) Du musst die Transportobjekte überall gleich haben, sonst stimmt die SerialID nicht mehr. Wenn also ein Client eventuell eine ältere Version hat, dann bekommt er eine dämliche Fehlermeldung und darf erstmal updaten. Ein eigenes Protokoll hätte den Vorteil, dass der Server ggf. je nach Clientversion auch unterschiedliche Versionen verschickt.

2) Das leidige Problem mit HandleTable (such mal hier im Forum): Wenn Du ständig Objekte über die Object-Streams versendest läuft das über und Du darfst einen reset() machen der unter Umständen tierisch langsam ist.

Ich hab früher auch alles serialisiert über Sockets verschickt was bei Drei nicht auf den Bäumen war - nach dem schlimmsten Rollout meines Lebens vor 12 Jahren mach ich das ganz devot zu Fuss.

Hat auch bisserl den Charme, dass man sich genau überlegt was man da eigentlich über die Leitung schickt und dann denkt "naja, die 15MB müssen nicht wirklich sein".

Bernd
 

Kjubert

Aktives Mitglied
Und vielleicht ists ja auch ne ganz nette Übung, stimmt schon. Ich muss mal sehn. Vielleicht lös ichs auch erstmal mit Serialisierung und baus später um. Dann hab ich beides mal gemacht.

Das Problem mit den SerialIDs nehm ich nicht so ernst... erstens pfleg ich die nicht (default :oops:) und zweitens sollte das erstmal ein Testprojekt werden... an den Markt geh ich damit vielleicht später ;)

Aber danke schonmal für die Anregungen!

Zum Ablauf der ganzen Sache fehlt mir noch die entscheidende Idee... Soll es überhaupt "Züge" geben? Oder alles komplett in Echtzeit und alle können machen was sie wollen (würde der Idee gerechter werden). Aber was ist dann, wenn zwei Laute das gleiche Objekt gleichzeitig benutzen -> problematisch?
Fragen über Fragen...
 

Bernd Hohmann

Top Contributor
Das Problem mit den SerialIDs nehm ich nicht so ernst... erstens pfleg ich die nicht (default :oops:) [,,,]

Genau da ist ja das Problem: Sobald Du irgendwas an der Klasse änderst, ändert sich die ID und schon knallt es an unerwarteter Stelle. Dann fängt man erst an, eine fixe ID in die Klasse zu schreiben um banale Änderungen kompatibel zu halten und dann writeObject/readObject zu überschreiben um die Kompatibilität zu wahren.

Ist einfach nur ein Erfahrungwert, ich würde wahrscheinlich aber auch erstmal die Klassen "pur" serialisiert durch die Gegend schieben um ein Gefühl für den Ablauf zu bekommen.

Zum Ablauf der ganzen Sache fehlt mir noch die entscheidende Idee... Soll es überhaupt "Züge" geben? Oder alles komplett in Echtzeit und alle können machen was sie wollen (würde der Idee gerechter werden). Aber was ist dann, wenn zwei Laute das gleiche Objekt gleichzeitig benutzen -> problematisch?

Ja nun - die Spielregeln schreiben normalerweise vor, dass nur einer der Spieler am Zug ist. In sofern musst Du ja "nur" die Zugreihenfolge bestimmen und auswürfeln, wer als erstes am Zug ist.

Bei Scrabble wäre es natürlich eine nette Idee, wenn die Clients (also Spieler) ihre Buchstaben auf ihrem Board verschieben können um mit Worten zu experiementieren. Diesen Status des Boards (also wo welches Tile liegt, natürlich ohne den Buchstaben zu zeigen) an die Mitspieler zu vermitteln wäre natürlich schick.

Bernd
 

FArt

Top Contributor
Für Statusreplikation über verschiedene Protokolle (abhängig von der Infrastruktur) kann ich JGroups empfehlen. Konzipiert war es für LANs und WANs, aber abhängig vom Protokoll kann man auch im Internet damit gute Ergebnisse erzielen. Dazu muss man aber u.U. seine Infrastruktur darauf abstimmen, also keine reine Client-Client Kommunikation verwenden sondern noch eine Serverimplementierung als Vermittler dazwischen setzen.
 
T

tuxedo

Gast
Na da bietet sich doch RPC (RMI, SIMON, ...) bestens an. Da wird zwar auch serialisiert, aber wer sagt dass man megabyte große Objekte hin und herschieben muss? Die Grafik darf ja durchaus beim Client liegen. Und der muss dann nur noch Methoden am Server aufrufen. Wenn man UI von der Logik entkoppelt (was so oder so empfehlenswert ist), dann ist die Objekthierarchie auch ziemlich klein und der Übertragungsoverhead dementsprechend gering.

Mal davon abgesehen: Wenn man mehr Primitive als Objekte verschickt (oder sogar nur primitive), hat man auch weniger das Problem mit der Serialisierung.

- Alex
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Gui von 2 Clients Synchronisieren Netzwerkprogrammierung 2
H java ftp-library zum synchronisieren Netzwerkprogrammierung 3
F Threads synchronisieren mit Pipes Netzwerkprogrammierung 3
gamebreiti Socket Server / Client Anwendung Manipulation von Objekten durch Server Netzwerkprogrammierung 9
D Erzeugung von Objekten in Remotemethoden Netzwerkprogrammierung 2
X Versenden von Objekten braucht zu lange Netzwerkprogrammierung 5
J Problem beim versenden von eigenen Objekten über RMI Netzwerkprogrammierung 2
A Objekte in übergebenen Objekten mit WebServices? Netzwerkprogrammierung 6
S senden und empfangen von Objekten? Netzwerkprogrammierung 7
K Tabelle im Web über Listener aufrufen Netzwerkprogrammierung 1
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
S Socket Bilder über Socket Senden Netzwerkprogrammierung 0
B Zip Dateien über FTP laden Netzwerkprogrammierung 2
x46 byte[] über BufferedReader auslesen Netzwerkprogrammierung 18
E Socket Parameter über Sockets übergeben und auslesen ! Netzwerkprogrammierung 5
L Webbasierte Anwendung - Authentifizierung über LDAP/ActiveDirectory Netzwerkprogrammierung 5
J Probleme mit Multicast über IPv6, DatagramChannel Netzwerkprogrammierung 1
S Daten über TCP/IP senden Netzwerkprogrammierung 3
T Broadcast-message über spez. Netzwerk-Schnittstelle Netzwerkprogrammierung 1
T Mikrofonaudio über Java Server an Webbrowser streamen Netzwerkprogrammierung 13
M Erstelltes Programm über Internet Browser ausführen Netzwerkprogrammierung 26
T VPN-Verbindung über Java Netzwerkprogrammierung 4
V Einfachen Javaserver über das Internet erreichbar machen Netzwerkprogrammierung 2
J FTP Upload über Proxy funktioniert nicht Netzwerkprogrammierung 1
E Kurze Textnachrichten über einen Server von meinem Handy auf den Computer laden. Netzwerkprogrammierung 9
J FTP FTP Zugriff über Proxy Server Netzwerkprogrammierung 1
Thallius Java Application über ZScaler benutzer? Netzwerkprogrammierung 0
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
V einfaches hin und her von Text über Server Netzwerkprogrammierung 2
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
antonbracke Multiuser Software über XMPP Server Netzwerkprogrammierung 1
Z Verbindung zwischen 2 Rechnern über ServerSockets nicht möglich Netzwerkprogrammierung 3
cezary Socket ServerSocket starten über GUIIm unterstehenden Code versuche Netzwerkprogrammierung 6
I ASCII über serielle Schnittstelle Netzwerkprogrammierung 1
N RMI "RMI über Lan funktioniert nicht" & "RMI-Server im Lan scannen" Netzwerkprogrammierung 13
L Mit Java über PHP in MySQL anmelden (Login script) Netzwerkprogrammierung 3
M Socket String Arrays über Socket an Server schicken Netzwerkprogrammierung 2
T Socket Methoden über Internet aufrufen Netzwerkprogrammierung 1
S Socket Kommunikation über Internet Netzwerkprogrammierung 1
X Problem mit vielen Bytes über Socket Netzwerkprogrammierung 23
K ByteArray über Netzwerk senden klappt nicht Netzwerkprogrammierung 5
M allgemeine Frage über Server-Client-Kommunikation Netzwerkprogrammierung 5
P RMI Threads die über RMI auf Datenbank zugreifen Netzwerkprogrammierung 2
S Datei schreiben über Applet Netzwerkprogrammierung 8
G Klassen über Netzwerk kommunizieren lassen Netzwerkprogrammierung 6
J Erster Server-Client läuft auf lokalem Rechner problemlos. Zwei Rechner über das Internet nicht Netzwerkprogrammierung 8
S ImageIcon über Socket schicken (Serialisierung) Netzwerkprogrammierung 6
H Socket Objekte über Socket? Allgemeine Verständnisprobleme in Sachen Socket Netzwerkprogrammierung 3
S Seltsames Verhalten beim Empfangen von Daten über DataInputStream Netzwerkprogrammierung 12
A TCP über UDP Verbindung? Netzwerkprogrammierung 10
C Datei über Socket schreiben und Ereignis lesen Netzwerkprogrammierung 9
D Socket Class über Netzwerk verschicken Netzwerkprogrammierung 2
D JNLP über Webstart funktioniert nicht... Netzwerkprogrammierung 2
J Socket Dateien über Socket auf Server speichern Netzwerkprogrammierung 3
D Socket Datei nur stückweise über Socket verschicken Netzwerkprogrammierung 6
G Bild über Socket schicken - Client/Server Netzwerkprogrammierung 10
A Computer über Internet verbinden Netzwerkprogrammierung 12
N über Java in eine Text-Datei auf einem Server schreiben Netzwerkprogrammierung 2
c_sidi90 ideale Lösung, Screen Capture über Netzwerk Netzwerkprogrammierung 3
S Socket Verschiedene Exceptions beim Übertragen von Bildern über Socket Netzwerkprogrammierung 20
T ArrayList über Netzwerk senden! Netzwerkprogrammierung 5
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
T Verbindungsversuche über TCP Sockets von mehreren Threads führt zu Serverabsturz Netzwerkprogrammierung 2
V Authentifikation über mehrere Server? Netzwerkprogrammierung 3
C Verbindung zu einem Hostrechner über das Internet herstellen Netzwerkprogrammierung 15
M Map über Webservice übertragen Netzwerkprogrammierung 3
D Mehrere Clients über Java-Sockets Netzwerkprogrammierung 13
P Socket Verbindung über das Internet Netzwerkprogrammierung 2
Z Socket Connection reset by peer nur per IP nicht über localhost Netzwerkprogrammierung 13
ruffio1978 Telnet über ein socket ansprechen Netzwerkprogrammierung 8
F Socket Verbindungen über mehrere Server Netzwerkprogrammierung 4
U Datei über das Netzwerk einlesen und speichern Netzwerkprogrammierung 8
G Klassen über JMX per URLClassloader laden? Netzwerkprogrammierung 2
E Zwei PCs über das Internet miteinander verbinden? Netzwerkprogrammierung 3
E Socketverbindung über das Internet - Timeout? Netzwerkprogrammierung 28
M Socket Bilder über das Netzwerk übertragen Netzwerkprogrammierung 4
E Java über Socket ins Internet? Netzwerkprogrammierung 4
F Socket Daten über verschiedene IP's schicken Netzwerkprogrammierung 5
M Socket JavaProg über einen Clienten steuern Netzwerkprogrammierung 5
M Mail über Exchange versenden Netzwerkprogrammierung 13
F C/S über HTTPS Netzwerkprogrammierung 2
D ...class.getResourceAsStream("/meine.properties") funktioniert nicht über RMI? Netzwerkprogrammierung 3
M ganymed-ssh2.har: ftp-Verbindung über ftp-Proxy Netzwerkprogrammierung 2
J Probleme bei RSA mit byte[] bei Versand über RMI Netzwerkprogrammierung 2
Z File über Socket lesen Netzwerkprogrammierung 3
A HTTP Binärdaten über PHP-Skript in Datenbank schreiben bzw auslesen Netzwerkprogrammierung 2
M Objekt über Object-Stream, empfange "alte" Daten Netzwerkprogrammierung 2
P FTP isFile() über FTP Netzwerkprogrammierung 3
I Socket HTTP Nachrichten über Sockets verschicken Netzwerkprogrammierung 2
N String als byte Array über Socket versenden Netzwerkprogrammierung 8
M Objekt über socket senden/empfangen Netzwerkprogrammierung 3
N Socket File über Socket vom Server an Client versenden Netzwerkprogrammierung 15
P Socket Problem mit Netzwerkverbindung über TCP Netzwerkprogrammierung 12
A UCP Connection über Proxy möglich? Netzwerkprogrammierung 7
V Verbindung zweier Rechner über das Internet mit Sockets Netzwerkprogrammierung 8
F Char über Netzwerk senden Netzwerkprogrammierung 6
S HTTP Login mit CAS Authentisierung über SSL Netzwerkprogrammierung 2
C Befehle über ein GUI an Server senden Netzwerkprogrammierung 15
M Socket Datei über Socket versenden Netzwerkprogrammierung 5
I Objekte über das Netzwerk Netzwerkprogrammierung 5

Ähnliche Java Themen

Neue Themen


Oben